@ixo/editor 6.26.0 → 6.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-BISN3FA2.js → chunk-FZ32PXRH.js} +2135 -1900
- package/dist/chunk-FZ32PXRH.js.map +1 -0
- package/dist/{chunk-YC6GPQZG.js → chunk-JNON3IP3.js} +20 -1
- package/dist/chunk-JNON3IP3.js.map +1 -0
- package/dist/{chunk-PW5J4EAV.js → chunk-KJHMOTY4.js} +2 -2
- package/dist/core/index.d.ts +29 -1
- package/dist/core/index.js +12 -4
- package/dist/core/index.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/mantine/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-BISN3FA2.js.map +0 -1
- package/dist/chunk-YC6GPQZG.js.map +0 -1
- /package/dist/{chunk-PW5J4EAV.js.map → chunk-KJHMOTY4.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/services/ucanService.ts","../src/core/lib/matrixDm.ts","../src/core/lib/actionRegistry/canMapping.ts","../src/core/lib/warnOnce.ts","../src/core/lib/actionRegistry/registry.ts","../src/core/lib/actionRegistry/manifest.ts","../src/core/lib/actionRegistry/inputRequirements.ts","../src/core/lib/actionRegistry/serviceCan.ts","../src/core/lib/actionRegistry/adapters.ts","../src/core/lib/xeroWorkItems.ts","../src/core/lib/flowCompiler/connections.ts","../src/core/lib/actionRegistry/actions/xero/flowBinding.ts","../src/core/lib/actionRegistry/diffRegistry.ts","../src/core/lib/actionRegistry/actions/pod/domainIndexerLookup.ts","../src/core/lib/did.ts","../src/core/lib/actionRegistry/actions/pod/domainSingleSelection.ts","../src/core/lib/actionRegistry/actions/pod/entitySingleSelection.ts","../src/core/lib/actionRegistry/actions/pod/memberMultiSelect.ts","../src/core/lib/actionRegistry/actions/pod/governanceConfig.ts","../src/core/lib/actionRegistry/actions/pod/listDomainFlows.ts","../src/core/lib/actionRegistry/actions/blueprint.ts","../src/core/lib/actionRegistry/actions/governance/memberProposal.ts","../src/core/lib/actionRegistry/actions/governance/settingsProposal.ts","../src/core/lib/actionRegistry/actions/governance/_shared.ts","../src/core/lib/actionRegistry/actions/governance/submissionConfigProposal.ts","../src/core/lib/actionRegistry/actions/governance/transactionSendFunds.ts","../src/core/lib/actionRegistry/actions/governance/transactionSendGroupToken.ts","../src/core/lib/actionRegistry/actions/governance/transactionMint.ts","../src/core/lib/actionRegistry/actions/governance/transactionPerformTokenSwap.ts","../src/core/lib/actionRegistry/actions/governance/transactionWithdrawTokenSwap.ts","../src/core/lib/actionRegistry/actions/governance/stakingStake.ts","../src/core/lib/actionRegistry/actions/governance/stakingStakeToGroup.ts","../src/core/lib/actionRegistry/actions/governance/authzGrant.ts","../src/core/lib/actionRegistry/actions/governance/authzRevoke.ts","../src/core/lib/actionRegistry/actions/governance/authzExec.ts","../src/core/lib/actionRegistry/actions/governance/chainGovernanceVote.ts","../src/core/lib/actionRegistry/actions/governance/daoJoin.ts","../src/core/lib/actionRegistry/actions/governance/daoUpdateInfo.ts","../src/core/lib/actionRegistry/actions/governance/daoManageSubDaos.ts","../src/core/lib/actionRegistry/actions/governance/daoManageStorage.ts","../src/core/lib/actionRegistry/actions/governance/daoAdminExec.ts","../src/core/lib/actionRegistry/actions/governance/daoAcceptToMarketplace.ts","../src/core/lib/actionRegistry/actions/governance/daoCreateEntity.ts","../src/core/lib/actionRegistry/actions/governance/nftBurn.ts","../src/core/lib/actionRegistry/actions/governance/nftTransfer.ts","../src/core/lib/actionRegistry/actions/governance/nftManageCollections.ts","../src/core/lib/actionRegistry/actions/governance/contractExecute.ts","../src/core/lib/actionRegistry/actions/governance/contractInstantiate.ts","../src/core/lib/actionRegistry/actions/governance/contractMigrate.ts","../src/core/lib/actionRegistry/actions/governance/contractUpdateAdmin.ts","../src/core/lib/actionRegistry/actions/governance/contractManageCw20.ts","../src/core/lib/actionRegistry/actions/governance/validatorActions.ts","../src/core/lib/actionRegistry/actions/governance/customMessage.ts","../src/core/lib/actionRegistry/actions/httpRequest.ts","../src/core/lib/actionRegistry/actions/emailSend.ts","../src/core/lib/actionRegistry/actions/humanCheckbox.ts","../src/core/lib/actionRegistry/actions/humanForm.ts","../src/core/lib/actionRegistry/actions/flowRunLifecycle.ts","../src/core/lib/actionRegistry/actions/notificationPush.ts","../src/core/lib/actionRegistry/actions/_shared/groupExecution.ts","../src/core/lib/actionRegistry/actions/bid/bid.ts","../src/core/lib/actionRegistry/actions/evaluateBid/evaluateBid.ts","../src/core/lib/actionRegistry/actions/claim/surveySchema.ts","../src/core/lib/actionRegistry/actions/claim/claim.ts","../src/core/lib/actionRegistry/actions/evaluateClaim/evaluateClaim.ts","../src/core/lib/actionRegistry/actions/proposalCreate.ts","../src/core/lib/actionRegistry/actions/proposalVote.ts","../src/core/lib/actionRegistry/actions/protocolSelect.ts","../src/core/lib/domainCard/transformSurveyToCredentialSubject.ts","../src/core/lib/domainCard/buildVerifiableCredential.ts","../src/core/lib/domainCard/extractSurveyAnswersTemplate.ts","../src/core/lib/domainCard/buildLinkedEntityResource.ts","../src/core/lib/domainCard/defaultSurvey.ts","../src/core/lib/actionRegistry/actions/domainSign.ts","../src/core/lib/actionRegistry/actions/domainCardPreview.ts","../src/core/lib/actionRegistry/actions/oracle.ts","../src/core/lib/actionRegistry/actions/credentialStore.ts","../src/core/lib/actionRegistry/actions/matrixDm.ts","../src/core/lib/actionRegistry/actions/walletGenerate.ts","../src/core/lib/actionRegistry/actions/walletFund.ts","../src/core/lib/actionRegistry/actions/walletGenerateAndFund.ts","../src/core/lib/actionRegistry/actions/iidCreate.ts","../src/core/lib/actionRegistry/actions/matrixRegister.ts","../src/core/lib/actionRegistry/actions/identityCreate.ts","../src/core/lib/actionRegistry/actions/entityCreateOracle.ts","../src/core/lib/actionRegistry/actions/sandboxProvision.ts","../src/core/lib/actionRegistry/actions/oracleContract.ts","../src/core/lib/actionRegistry/actions/oracleStoreSecrets.ts","../src/core/lib/actionRegistry/actions/oracleStoreConfig.ts","../src/core/lib/actionRegistry/actions/oracleStoreSecretsAndConfig.ts","../src/core/lib/actionRegistry/actions/oracleConfigureOracle.ts","../src/core/lib/actionRegistry/actions/oracleDeploySetup.ts","../src/core/lib/actionRegistry/actions/oracleDeployStart.ts","../src/core/lib/actionRegistry/actions/oracleDeploy.ts","../src/core/lib/actionRegistry/actions/collection/index.ts","../src/core/lib/actionRegistry/types.ts","../src/core/lib/actionRegistry/actions/collection/collection.ts","../src/core/lib/actionRegistry/actions/collectionUsers/index.ts","../src/core/lib/actionRegistry/actions/collectionUsers/collectionUsers.ts","../src/core/lib/actionRegistry/actions/carbon/schemas.ts","../src/core/lib/actionRegistry/actions/carbon/loadBatches.ts","../src/core/lib/actionRegistry/actions/carbon/harvest.ts","../src/core/lib/actionRegistry/actions/carbon/retire.ts","../src/core/lib/actionRegistry/actions/entityTransfer/schemas.ts","../src/core/lib/actionRegistry/actions/entityTransfer/entityTransfer.ts","../src/core/lib/actionRegistry/actions/kycVerify.ts","../src/core/lib/actionRegistry/actions/_shared/delegatedTool.ts","../src/core/lib/actionRegistry/actions/gmail/emailSend.types.ts","../src/core/lib/actionRegistry/actions/gmail/emailSend.ts","../src/core/lib/actionRegistry/actions/outlook/emailSend.types.ts","../src/core/lib/actionRegistry/actions/outlook/emailSend.ts","../src/core/lib/actionRegistry/actions/slack/messageSend.types.ts","../src/core/lib/actionRegistry/actions/slack/messageSend.ts","../src/core/lib/actionRegistry/actions/googlecalendar/eventCreate.types.ts","../src/core/lib/actionRegistry/actions/googlecalendar/eventCreate.ts","../src/core/lib/actionRegistry/actions/calendar/eventCreate.types.ts","../src/core/lib/actionRegistry/actions/calendar/eventCreate.ts","../src/core/lib/actionRegistry/actions/calendar/eventUpdate.ts","../src/core/lib/actionRegistry/actions/calendar/eventList.ts","../src/core/lib/actionRegistry/actions/xero/contactCreate.ts","../src/core/lib/actionRegistry/actions/xero/invoiceCreate.ts","../src/core/lib/actionRegistry/actions/xero/invoiceList.ts","../src/core/lib/actionRegistry/actions/xero/paymentCreate.ts","../src/core/lib/actionRegistry/actions/bid/bid.diff.ts","../src/core/lib/actionRegistry/actions/evaluateBid/evaluateBid.diff.ts","../src/core/lib/actionRegistry/actions/claim/claim.diff.ts","../src/core/utils/numbers.ts","../src/core/lib/actionRegistry/actions/evaluateClaim/evaluateClaim.diff.ts","../src/core/lib/actionRegistry/actions/calendar/eventCreate.diff.ts","../src/core/lib/actionRegistry/actions/calendar/eventUpdate.diff.ts","../src/core/lib/actionRegistry/actions/xero/contactCreate.diff.ts","../src/core/lib/actionRegistry/actions/xero/invoiceCreate.diff.ts","../src/core/lib/actionRegistry/actions/xero/paymentCreate.diff.ts","../src/core/lib/actionRegistry/actions/walletFund.diff.ts","../src/core/lib/actionRegistry/actions/collection/collection.diff.ts","../src/core/lib/actionRegistry/actions/collectionUsers/collectionUsers.diff.ts","../src/core/lib/actionRegistry/actions/carbon/harvest.diff.ts","../src/core/lib/actionRegistry/actions/carbon/retire.diff.ts","../src/core/lib/actionRegistry/actions/entityTransfer/entityTransfer.diff.ts","../src/core/lib/flowEngine/dmNotificationState.ts","../src/core/lib/flowEngine/runs.ts","../src/core/lib/yjsTypes.ts","../src/core/types/baseUcan.ts","../src/core/lib/flowEngine/referenceResolver.ts","../src/core/lib/flowEngine/triggers.ts","../src/core/lib/flowEngine/versionManifest.ts","../src/core/lib/flowEngine/reconcile.ts","../src/core/lib/flowEngine/emitEvents.ts","../src/core/lib/flowEngine/runtime.ts","../src/core/lib/flowEngine/runTimeline.ts","../src/core/lib/flowEngine/conditions.ts","../src/core/lib/flowEngine/utils.ts","../src/core/lib/flowEngine/proof.ts","../src/core/lib/flowEngine/completion.ts","../src/core/lib/flowEngine/runHistory.ts","../src/core/lib/flowAgent/store.ts","../src/core/lib/flowAgent/utils.ts","../src/core/lib/flowEngine/runMigration.ts","../src/core/lib/flowEngine/runLifecycle.ts","../src/core/lib/flowCompiler/resolveRefs.ts","../src/core/lib/flowEngine/authorization.ts","../src/core/lib/flowEngine/executor.ts","../src/core/lib/flowEngine/readBackReconciler.ts","../src/core/lib/flowEngine/actionExecutor.ts","../src/core/lib/flowEngine/verifiedCompletion.ts","../src/core/lib/ucanDelegationStore.ts","../src/core/lib/invocationStore.ts","../src/core/lib/flowEngine/blockPhase.ts","../src/core/lib/flowEngine/validateBlockConfig.ts","../src/core/lib/flowEngine/migration.ts","../src/core/lib/flowEngine/migrations/v0_3_to_v1_0_0.ts","../src/core/types/nodeContext.ts","../src/core/lib/flowCompiler/conditions.ts","../src/core/lib/flowCompiler/blockMapping.ts","../src/core/lib/flowCompiler/compiler.ts","../src/core/lib/flowCompiler/documentFragment.ts","../src/core/lib/flowCompiler/readFlow.ts","../src/core/lib/flowCompiler/mergeFlows.ts","../src/core/lib/flowCompiler/decompile.ts","../src/core/lib/flowCompiler/setup.ts","../src/core/lib/flowCompiler/hydrate.ts","../src/core/lib/flowAgent/policy.ts","../src/core/lib/flowAgent/commands.ts","../src/core/lib/flowAgent/context.ts","../src/core/lib/flowAgent/lease.ts","../src/core/lib/flowAgent/state.ts","../src/core/lib/flowAgent/actionExecutionPolicy.ts","../src/core/lib/flowAgent/orchestrator.ts","../src/core/lib/flowAgent/execution.ts","../src/core/lib/flowAgent/service.ts"],"sourcesContent":["/**\n * UCAN Service using @ixo/ucan directly\n *\n * This service provides a high-level API for:\n * - Creating and managing delegations (CAR format)\n * - Creating and validating invocations\n * - Executing actions with invocation-based authorization\n *\n * The host app only needs to provide the signer (private key) after PIN decryption.\n * All UCAN operations are performed using @ixo/ucan directly.\n */\n\nimport {\n createDelegation as ucanCreateDelegation,\n createInvocation as ucanCreateInvocation,\n serializeDelegation,\n serializeInvocation,\n parseDelegation,\n parseSigner,\n signerFromMnemonic,\n type Signer,\n type Delegation,\n type Capability as UcantoCapability,\n type SupportedDID,\n} from '@ixo/ucan';\n\nimport type { UcanDelegationStore } from '../lib/ucanDelegationStore';\nimport type { InvocationStore } from '../lib/invocationStore';\nimport type {\n StoredDelegation,\n StoredInvocation,\n UcanCapability,\n InvocationResult,\n ExecutionWithInvocationResult,\n DelegationChainValidationResult,\n FindProofsResult,\n CreateRootDelegationParams,\n CreateDelegationParams,\n CreateInvocationParams,\n} from '../types/ucan';\n\n/**\n * Signer session scope type\n */\nexport type SignerSessionScope = 'session' | 'operation';\n\n/**\n * Signer session returned by createSignerSession\n */\nexport interface SignerSessionInfo {\n sessionId: string;\n did: string;\n publicKey: string;\n keyId: string;\n expiresAt: number;\n scope: SignerSessionScope;\n}\n\n/**\n * Handler functions for getting signers from the host application\n * The host app handles PIN decryption and key management\n */\nexport interface UcanServiceHandlers {\n /**\n * Get a signer for the given DID after PIN verification\n * The host app decrypts the private key using the PIN\n *\n * @returns The private key in multibase format (for parseSigner)\n * @deprecated Prefer createSignerSession for better security\n */\n getPrivateKey?: (params: { did: string; didType: 'entity' | 'user'; entityRoomId?: string; pin: string }) => Promise<string>;\n\n /**\n * Get a signer from mnemonic (alternative to getPrivateKey)\n * The host app retrieves and decrypts the mnemonic using the PIN\n *\n * @returns The mnemonic phrase\n * @deprecated Prefer createSignerSession for better security\n */\n getMnemonic?: (params: { did: string; didType: 'entity' | 'user'; entityRoomId?: string; pin: string }) => Promise<string>;\n\n // ============================================================================\n // Handle-based signer session handlers (preferred approach)\n // ============================================================================\n\n /**\n * Create a signer session that can be used for multiple sign operations.\n * The host app keeps the key material secure; the editor only receives an opaque handle.\n *\n * @param params.scope - 'session' for multiple operations, 'operation' for one-time use\n * @param params.ttlSeconds - Time-to-live for session scope (default: 300, max: 3600)\n */\n createSignerSession?: (params: {\n did: string;\n didType: 'entity' | 'user';\n entityRoomId?: string;\n pin: string;\n scope: SignerSessionScope;\n ttlSeconds?: number;\n }) => Promise<SignerSessionInfo>;\n\n /**\n * Sign data using an existing session.\n * For 'operation' scope, the session is automatically invalidated after this call.\n */\n signWithSession?: (params: { sessionId: string; data: string; algorithm?: 'Ed25519' }) => Promise<{\n signature: string;\n algorithm: 'Ed25519';\n keyId: string;\n }>;\n\n /**\n * Release a session before it expires.\n * Safe to call on already-released or expired sessions.\n */\n releaseSignerSession?: (params: { sessionId: string }) => Promise<{\n released: boolean;\n reason?: string;\n }>;\n\n // ============================================================================\n // Deprecated high-level session helpers.\n // Prefer BlocknoteHandlers.createDelegation/createInvocation plus the\n // createSignerSession/signWithSession/releaseSignerSession contract.\n // ============================================================================\n\n /**\n * Create a delegation directly in the host app.\n * The host handles all signing internally using session-based signing.\n * @deprecated Use createDelegation on BlocknoteHandlers instead.\n */\n createDelegationWithSession?: (params: {\n sessionId: string;\n audience: string;\n capabilities: Array<{\n can: string;\n with: string;\n nb?: Record<string, unknown>;\n }>;\n proofs?: string[];\n expiration?: number;\n }) => Promise<{\n cid: string;\n delegation: string;\n }>;\n\n /**\n * Create an invocation directly in the host app.\n * The host handles all signing internally using session-based signing.\n * @deprecated Use createInvocation on BlocknoteHandlers instead.\n */\n createInvocationWithSession?: (params: {\n sessionId: string;\n audience: string;\n capability: {\n can: string;\n with: string;\n nb?: Record<string, unknown>;\n };\n proofs: string[];\n }) => Promise<{\n cid: string;\n invocation: string;\n }>;\n}\n\n/**\n * Configuration for UcanService\n */\nexport interface UcanServiceConfig {\n delegationStore: UcanDelegationStore;\n invocationStore: InvocationStore;\n handlers: UcanServiceHandlers;\n flowOwnerDid: string;\n flowUri: string;\n}\n\n/**\n * UCAN Service interface\n */\nexport interface UcanService {\n // Delegation operations\n createRootDelegation: (params: CreateRootDelegationParams) => Promise<StoredDelegation>;\n createDelegation: (params: CreateDelegationParams) => Promise<StoredDelegation>;\n revokeDelegation: (cid: string) => void;\n getDelegation: (cid: string) => StoredDelegation | null;\n getAllDelegations: () => StoredDelegation[];\n getRootDelegation: () => StoredDelegation | null;\n\n // Invocation operations\n createAndValidateInvocation: (params: CreateInvocationParams, flowId: string, blockId?: string) => Promise<InvocationResult>;\n executeWithInvocation: <T>(\n params: CreateInvocationParams,\n action: () => Promise<T>,\n flowId: string,\n blockId?: string,\n sessionRunId?: string\n ) => Promise<ExecutionWithInvocationResult & { actionResult?: T }>;\n\n // Validation\n validateDelegationChain: (audienceDid: string, capability: UcanCapability) => Promise<DelegationChainValidationResult>;\n findValidProofs: (audienceDid: string, capability: UcanCapability) => Promise<FindProofsResult>;\n\n // Parsing\n parseDelegationFromStore: (cid: string) => Promise<Delegation | null>;\n\n // Utility\n isConfigured: () => boolean;\n}\n\n/**\n * Convert a DID string to SupportedDID type (did:ixo:* or did:key:*)\n */\nfunction toSupportedDID(did: string): SupportedDID | undefined {\n if (did.startsWith('did:ixo:') || did.startsWith('did:key:')) {\n return did as SupportedDID;\n }\n return undefined;\n}\n\nfunction normalizeDid(did: string): string {\n if (did.startsWith('did:')) return did;\n if (did.startsWith('ixo1')) return `did:ixo:${did}`;\n if (!did.startsWith('@did-')) return did;\n\n const [localpart] = did.split(':');\n const parts = localpart.split('-');\n if (parts.length < 3 || parts[0] !== '@did') return did;\n return `did:${parts[1]}:${parts.slice(2).join('-')}`;\n}\n\nfunction toInvocationAudienceDID(did: string): SupportedDID {\n const normalized = normalizeDid(did);\n const supported = toSupportedDID(normalized);\n if (!supported) {\n throw new Error(`Invalid DID \"${did}\", must start with 'did:'`);\n }\n return supported;\n}\n\n/**\n * Ability type for UCAN capabilities (format: \"namespace/action\" or \"*\")\n */\ntype Ability = `${string}/${string}` | '*';\n\n/**\n * Resource type for UCAN capabilities (format: \"scheme:path\")\n */\ntype Resource = `${string}:${string}`;\n\n/**\n * Convert UcanCapability to UcantoCapability with proper type format\n * Ucanto requires `can` to be Ability and `with` to be Resource\n */\nfunction toUcantoCapabilities(capabilities: UcanCapability[]): UcantoCapability[] {\n return capabilities.map((cap) => ({\n can: cap.can as Ability,\n with: cap.with as Resource,\n ...(cap.nb && { nb: cap.nb }),\n }));\n}\n\n/**\n * Get a signer from the handlers.\n */\nasync function getSigner(handlers: UcanServiceHandlers, did: string, didType: 'entity' | 'user', entityRoomId: string | undefined, pin: string): Promise<Signer> {\n const normalizedDid = normalizeDid(did);\n const supportedDid = toSupportedDID(normalizedDid);\n\n if (handlers.getPrivateKey) {\n const privateKey = await handlers.getPrivateKey({ did: normalizedDid, didType, entityRoomId, pin });\n return parseSigner(privateKey, supportedDid);\n }\n\n if (handlers.getMnemonic) {\n const mnemonic = await handlers.getMnemonic({ did: normalizedDid, didType, entityRoomId, pin });\n const result = await signerFromMnemonic(mnemonic, supportedDid);\n return result.signer;\n }\n\n throw new Error('No signer handler configured (need getPrivateKey or getMnemonic)');\n}\n\n/**\n * Generate a CID-like identifier from delegation\n */\nfunction getCidFromDelegation(delegation: Delegation): string {\n return delegation.cid.toString();\n}\n\n/**\n * Create a UCAN service instance\n */\nexport const createUcanService = (config: UcanServiceConfig): UcanService => {\n const { delegationStore, invocationStore, handlers, flowOwnerDid } = config;\n\n // Cache for parsed delegations\n const delegationCache = new Map<string, Delegation>();\n\n const isConfigured = (): boolean => {\n const hasSessionHandlers = !!(handlers.createSignerSession && handlers.signWithSession);\n const hasLegacyHandlers = !!(handlers.getPrivateKey || handlers.getMnemonic);\n return hasSessionHandlers || hasLegacyHandlers;\n };\n\n const parseDelegationFromStore = async (cid: string): Promise<Delegation | null> => {\n if (delegationCache.has(cid)) {\n return delegationCache.get(cid)!;\n }\n\n const stored = delegationStore.get(cid);\n if (!stored || !stored.delegation) {\n return null;\n }\n\n try {\n const delegation = await parseDelegation(stored.delegation);\n delegationCache.set(cid, delegation);\n return delegation;\n } catch {\n return null;\n }\n };\n\n const getProofDelegations = async (proofCids: string[]): Promise<Delegation[]> => {\n const proofs: Delegation[] = [];\n for (const cid of proofCids) {\n const delegation = await parseDelegationFromStore(cid);\n if (delegation) {\n proofs.push(delegation);\n }\n }\n return proofs;\n };\n\n /**\n * Resolve proof CIDs to their serialized CAR strings (base64) by reading\n * the local delegation store. Used when the host's session-based UCAN\n * handlers want CARs (so they don't need access to the editor's store).\n */\n const getProofCars = async (proofCids: string[]): Promise<string[]> => {\n const cars: string[] = [];\n for (const cid of proofCids) {\n const stored = delegationStore.get(cid);\n if (stored && stored.delegation) {\n cars.push(stored.delegation);\n }\n }\n return cars;\n };\n\n const createRootDelegation = async (params: CreateRootDelegationParams): Promise<StoredDelegation> => {\n const { flowOwnerDid: ownerDid, issuerType, entityRoomId, flowUri: uri, pin } = params;\n const normalizedOwnerDid = normalizeDid(ownerDid);\n\n const capabilities: UcantoCapability[] = [{ can: 'flow/*', with: uri as `${string}:${string}` }];\n\n // Prefer the host's session-based UCAN handler when available — same\n // fallback pattern as createDelegation / createAndValidateInvocation.\n if (handlers.createSignerSession && handlers.createDelegationWithSession) {\n const session = await handlers.createSignerSession({\n did: normalizedOwnerDid,\n didType: issuerType,\n entityRoomId,\n pin,\n scope: 'operation',\n });\n\n const result = await handlers.createDelegationWithSession({\n sessionId: session.sessionId,\n audience: normalizedOwnerDid,\n capabilities: capabilities as Array<{ can: string; with: string; nb?: Record<string, unknown> }>,\n proofs: [],\n });\n\n const storedDelegation: StoredDelegation = {\n cid: result.cid,\n delegation: result.delegation,\n issuerDid: normalizedOwnerDid,\n audienceDid: normalizedOwnerDid,\n capabilities: capabilities as UcanCapability[],\n createdAt: Date.now(),\n format: 'car',\n proofCids: [],\n };\n\n delegationStore.set(storedDelegation);\n delegationStore.setRootCid(result.cid);\n return storedDelegation;\n }\n\n // Legacy path — editor builds the signer locally from a mnemonic/key.\n const signer = await getSigner(handlers, ownerDid, issuerType, entityRoomId, pin);\n\n const delegation = await ucanCreateDelegation({\n issuer: signer,\n audience: toInvocationAudienceDID(normalizedOwnerDid),\n capabilities,\n proofs: [],\n });\n\n const serialized = await serializeDelegation(delegation);\n const cid = getCidFromDelegation(delegation);\n\n const storedDelegation: StoredDelegation = {\n cid,\n delegation: serialized,\n issuerDid: normalizedOwnerDid,\n audienceDid: normalizedOwnerDid,\n capabilities: capabilities as UcanCapability[],\n createdAt: Date.now(),\n format: 'car',\n proofCids: [],\n };\n\n delegationStore.set(storedDelegation);\n delegationStore.setRootCid(cid);\n\n delegationCache.set(cid, delegation);\n\n return storedDelegation;\n };\n\n const createDelegation = async (params: CreateDelegationParams): Promise<StoredDelegation> => {\n const { issuerDid, issuerType, entityRoomId, audience, capabilities, proofs = [], expiration, pin } = params;\n const normalizedIssuerDid = normalizeDid(issuerDid);\n const normalizedAudienceDid = normalizeDid(audience);\n\n // Use proofs exactly as the caller provided them. Empty array = the\n // delegation is self-issued (no parent in the chain) — this is correct\n // for capabilities targeting external services where the issuer's DID\n // is itself the trust root. Flow-rooted delegations must be assembled\n // by the caller (e.g. AuthorizationTab passes [rootCid, ...]).\n const proofCids = proofs;\n\n // Prefer the host's session-based UCAN handler when available — it\n // signs without ever exposing the mnemonic to the editor. Falls back\n // to the legacy mnemonic-based path for older host implementations.\n if (handlers.createSignerSession && handlers.createDelegationWithSession) {\n const session = await handlers.createSignerSession({\n did: normalizedIssuerDid,\n didType: issuerType,\n entityRoomId,\n pin,\n scope: 'operation',\n });\n\n const proofCars = await getProofCars(proofCids);\n\n const result = await handlers.createDelegationWithSession({\n sessionId: session.sessionId,\n audience: normalizedAudienceDid,\n capabilities: capabilities as Array<{ can: string; with: string; nb?: Record<string, unknown> }>,\n proofs: proofCars,\n expiration: expiration ? Math.floor(expiration / 1000) : undefined,\n });\n\n const storedDelegation: StoredDelegation = {\n cid: result.cid,\n delegation: result.delegation,\n issuerDid: normalizedIssuerDid,\n audienceDid: normalizedAudienceDid,\n capabilities,\n expiration,\n createdAt: Date.now(),\n format: 'car',\n proofCids,\n };\n\n delegationStore.set(storedDelegation);\n return storedDelegation;\n }\n\n // Legacy path: editor signs locally using getMnemonic/getPrivateKey.\n const signer = await getSigner(handlers, issuerDid, issuerType, entityRoomId, pin);\n\n const proofDelegations = await getProofDelegations(proofCids);\n\n const delegation = await ucanCreateDelegation({\n issuer: signer,\n audience: toInvocationAudienceDID(normalizedAudienceDid),\n capabilities: toUcantoCapabilities(capabilities),\n proofs: proofDelegations,\n expiration: expiration ? Math.floor(expiration / 1000) : undefined,\n });\n\n const serialized = await serializeDelegation(delegation);\n const cid = getCidFromDelegation(delegation);\n\n const storedDelegation: StoredDelegation = {\n cid,\n delegation: serialized,\n issuerDid: normalizedIssuerDid,\n audienceDid: normalizedAudienceDid,\n capabilities,\n expiration,\n createdAt: Date.now(),\n format: 'car',\n proofCids,\n };\n\n delegationStore.set(storedDelegation);\n\n delegationCache.set(cid, delegation);\n\n return storedDelegation;\n };\n\n const revokeDelegation = (cid: string): void => {\n delegationStore.remove(cid);\n delegationCache.delete(cid);\n };\n\n const getDelegation = (cid: string): StoredDelegation | null => {\n return delegationStore.get(cid);\n };\n\n const getAllDelegations = (): StoredDelegation[] => {\n return delegationStore.getAll();\n };\n\n const getRootDelegation = (): StoredDelegation | null => {\n return delegationStore.getRoot();\n };\n\n const findValidProofs = async (audienceDid: string, capability: UcanCapability): Promise<FindProofsResult> => {\n const delegations = delegationStore.getByAudience(audienceDid);\n\n if (delegations.length === 0) {\n // Check if actor is the root audience (flow owner)\n const root = delegationStore.getRoot();\n if (root && normalizeDid(root.audienceDid) === normalizeDid(audienceDid)) {\n return { found: true, proofCids: [root.cid] };\n }\n return { found: false, error: 'No delegations found for actor' };\n }\n\n for (const delegation of delegations) {\n const covers = delegation.capabilities.some((c) => {\n if (c.can === capability.can && c.with === capability.with) return true;\n if (c.can === '*' || c.can === 'flow/*') return true;\n if (c.can.endsWith('/*')) {\n const prefix = c.can.slice(0, -1);\n if (capability.can.startsWith(prefix)) return true;\n }\n if (c.with === '*') return true;\n if (c.with.endsWith('*')) {\n const prefix = c.with.slice(0, -1);\n if (capability.with.startsWith(prefix)) return true;\n }\n return false;\n });\n\n if (covers) {\n if (delegation.expiration && delegation.expiration < Date.now()) {\n continue;\n }\n const proofCids = [delegation.cid, ...delegation.proofCids];\n return { found: true, proofCids };\n }\n }\n\n return { found: false, error: 'No valid delegation found for capability' };\n };\n\n const validateDelegationChain = async (audienceDid: string, capability: UcanCapability): Promise<DelegationChainValidationResult> => {\n const proofsResult = await findValidProofs(audienceDid, capability);\n\n if (!proofsResult.found || !proofsResult.proofCids) {\n return { valid: false, error: proofsResult.error };\n }\n\n const proofChain: StoredDelegation[] = [];\n for (const cid of proofsResult.proofCids) {\n const delegation = delegationStore.get(cid);\n if (!delegation) {\n return { valid: false, error: `Proof delegation ${cid} not found` };\n }\n proofChain.push(delegation);\n }\n\n // Validate chain integrity\n for (let i = 0; i < proofChain.length - 1; i++) {\n const current = proofChain[i];\n const parent = proofChain[i + 1];\n\n if (normalizeDid(parent.audienceDid) !== normalizeDid(current.issuerDid)) {\n return {\n valid: false,\n error: `Chain broken: ${parent.cid} audience (${parent.audienceDid}) != ${current.cid} issuer (${current.issuerDid})`,\n };\n }\n }\n\n // Validate root — but only for flow-scoped capabilities. Non-flow\n // capabilities target external services with their own trust anchors;\n // the editor cannot meaningfully validate them locally and shouldn't\n // assume the flow owner is the relevant root issuer.\n const isFlowScoped = capability.can === 'flow/*' || capability.can.startsWith('flow/');\n if (isFlowScoped) {\n const root = proofChain[proofChain.length - 1];\n if (normalizeDid(root.issuerDid) !== normalizeDid(flowOwnerDid)) {\n return { valid: false, error: `Root issuer ${root.issuerDid} is not flow owner ${flowOwnerDid}` };\n }\n }\n\n return { valid: true, proofChain };\n };\n\n const createAndValidateInvocation = async (params: CreateInvocationParams, _flowId: string, _blockId?: string): Promise<InvocationResult> => {\n const { invokerDid, invokerType, entityRoomId, capability, proofs, pin } = params;\n const normalizedInvokerDid = normalizeDid(invokerDid);\n\n const validation = await validateDelegationChain(normalizedInvokerDid, capability);\n if (!validation.valid) {\n return {\n cid: '',\n invocation: '',\n valid: false,\n error: validation.error,\n };\n }\n\n // Audience defaults to the flow owner (in-flow invocations) but can be\n // overridden when invoking against an external service such as a\n // UCAN-gated worker (where audience must equal the worker's did:web).\n const audience = normalizeDid(params.audience ?? flowOwnerDid);\n\n // Prefer the host's session-based UCAN handler when available.\n if (handlers.createSignerSession && handlers.createInvocationWithSession) {\n try {\n const session = await handlers.createSignerSession({\n did: normalizedInvokerDid,\n didType: invokerType,\n entityRoomId,\n pin,\n scope: 'operation',\n });\n\n const proofCars = await getProofCars(proofs);\n\n const result = await handlers.createInvocationWithSession({\n sessionId: session.sessionId,\n audience,\n capability: {\n can: capability.can,\n with: capability.with,\n ...(capability.nb && { nb: capability.nb }),\n },\n proofs: proofCars,\n });\n\n return {\n cid: result.cid,\n invocation: result.invocation,\n valid: true,\n };\n } catch (err) {\n return {\n cid: '',\n invocation: '',\n valid: false,\n error: err instanceof Error ? err.message : 'Failed to create invocation via session',\n };\n }\n }\n\n // Legacy path — editor builds the signer locally from a mnemonic/key.\n const signer = await getSigner(handlers, invokerDid, invokerType, entityRoomId, pin);\n const proofDelegations = await getProofDelegations(proofs);\n\n const ucantoCapability: UcantoCapability = {\n can: capability.can as Ability,\n with: capability.with as Resource,\n ...(capability.nb && { nb: capability.nb }),\n };\n\n const invocation = await ucanCreateInvocation({\n issuer: signer,\n audience,\n capability: ucantoCapability,\n proofs: proofDelegations,\n });\n\n const serialized = await serializeInvocation(invocation);\n const built = await invocation.buildIPLDView();\n const cid = built.cid.toString();\n\n return {\n cid,\n invocation: serialized,\n valid: true,\n };\n };\n\n const executeWithInvocation = async <T>(\n params: CreateInvocationParams,\n action: () => Promise<T>,\n flowId: string,\n blockId?: string,\n sessionRunId?: string\n ): Promise<ExecutionWithInvocationResult & { actionResult?: T }> => {\n const invocationResult = await createAndValidateInvocation(params, flowId, blockId);\n\n if (!invocationResult.valid) {\n return {\n success: false,\n invocationCid: invocationResult.cid,\n error: invocationResult.error,\n };\n }\n\n if (invocationStore.hasBeenInvoked(invocationResult.cid)) {\n return {\n success: false,\n invocationCid: invocationResult.cid,\n error: 'Invocation has already been used (replay attack prevented)',\n };\n }\n\n try {\n const actionResult = await action();\n\n const storedInvocation: StoredInvocation = {\n cid: invocationResult.cid,\n invocation: invocationResult.invocation,\n invokerDid: params.invokerDid,\n capability: params.capability,\n executedAt: Date.now(),\n flowId,\n sessionRunId,\n blockId,\n result: 'success',\n proofCids: params.proofs,\n };\n invocationStore.add(storedInvocation);\n\n return {\n success: true,\n invocationCid: invocationResult.cid,\n result: actionResult,\n actionResult,\n };\n } catch (error) {\n const storedInvocation: StoredInvocation = {\n cid: invocationResult.cid,\n invocation: invocationResult.invocation,\n invokerDid: params.invokerDid,\n capability: params.capability,\n executedAt: Date.now(),\n flowId,\n sessionRunId,\n blockId,\n result: 'failure',\n error: error instanceof Error ? error.message : 'Unknown error',\n proofCids: params.proofs,\n };\n invocationStore.add(storedInvocation);\n\n return {\n success: false,\n invocationCid: invocationResult.cid,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n };\n\n return {\n createRootDelegation,\n createDelegation,\n revokeDelegation,\n getDelegation,\n getAllDelegations,\n getRootDelegation,\n createAndValidateInvocation,\n executeWithInvocation,\n validateDelegationChain,\n findValidProofs,\n parseDelegationFromStore,\n isConfigured,\n };\n};\n","import type { MatrixClient } from 'matrix-js-sdk';\n\n/**\n * Extract the homeserver domain from a Matrix user ID.\n * e.g. \"@user:matrix.ixo.world\" → \"matrix.ixo.world\"\n */\nexport function getHomeserver(matrixClient: MatrixClient): string {\n const userId = matrixClient.getUserId();\n if (!userId) throw new Error('Matrix client has no user ID');\n const idx = userId.indexOf(':');\n if (idx === -1) throw new Error(`Invalid Matrix user ID: ${userId}`);\n return userId.substring(idx + 1);\n}\n\n/**\n * Convert a DID to a Matrix user ID.\n * e.g. \"did:ixo:abc\" → \"@did-ixo-abc:matrix.ixo.world\"\n *\n * This mirrors the reverse mapping in AssignmentTab:\n * matrixUserId.split(':')[0].replace('@', '').replace(/-/g, ':')\n */\nexport function didToMatrixUserId(did: string, homeserver: string): string {\n const localpart = did.replace(/:/g, '-');\n return `@${localpart}:${homeserver}`;\n}\n\n/**\n * Find an existing DM room with the target user, or create one.\n * Uses the `m.direct` account data to track DM room associations.\n */\nexport async function findOrCreateDMRoom(matrixClient: MatrixClient, targetUserId: string): Promise<string> {\n // Check existing DM rooms via m.direct account data\n try {\n const directEvent = (matrixClient as any).getAccountData('m.direct');\n const directContent: Record<string, string[]> = directEvent?.getContent() || {};\n const existingRooms = directContent[targetUserId];\n\n if (existingRooms && existingRooms.length > 0) {\n // Return the first existing DM room\n return existingRooms[0];\n }\n } catch {\n // No m.direct data yet, proceed to create\n }\n\n // Create a new DM room\n const response = await matrixClient.createRoom({\n is_direct: true,\n invite: [targetUserId],\n preset: 'trusted_private_chat' as any,\n initial_state: [],\n });\n\n const roomId = response.room_id;\n\n // Update m.direct account data to include the new room\n try {\n const directEvent = (matrixClient as any).getAccountData('m.direct');\n const directContent: Record<string, string[]> = directEvent?.getContent() || {};\n const updatedContent = {\n ...directContent,\n [targetUserId]: [...(directContent[targetUserId] || []), roomId],\n };\n await (matrixClient as any).setAccountData('m.direct', updatedContent);\n } catch (error) {\n console.warn('[MatrixDM] Failed to update m.direct account data:', error);\n }\n\n return roomId;\n}\n\n/**\n * Send a text message to a Matrix room.\n */\nexport async function sendMatrixMessage(matrixClient: MatrixClient, roomId: string, message: string): Promise<void> {\n await matrixClient.sendEvent(roomId, 'm.room.message' as any, {\n msgtype: 'm.text',\n body: message,\n });\n}\n\n/**\n * Send a direct message to a user identified by DID.\n * Finds or creates a DM room and sends the message.\n */\nexport async function sendDirectMessage(matrixClient: MatrixClient, targetDid: string, message: string): Promise<{ roomId: string }> {\n const homeserver = getHomeserver(matrixClient);\n const targetUserId = didToMatrixUserId(targetDid, homeserver);\n const roomId = await findOrCreateDMRoom(matrixClient, targetUserId);\n await sendMatrixMessage(matrixClient, roomId, message);\n return { roomId };\n}\n","/**\n * Bidirectional mapping between UCAN `can` vocabulary and registry `type` strings.\n * Derived mechanically: strip \"qi/\", replace \".\" with \"/\".\n */\n\nconst CAN_TO_TYPE: Record<string, string> = {\n 'flow/run.start': 'qi/flow.run.start',\n 'flow/run.close': 'qi/flow.run.close',\n 'bid/submit': 'qi/bid.submit',\n 'bid/evaluate': 'qi/bid.evaluate',\n 'claim/submit': 'qi/claim.submit',\n 'claim/evaluate': 'qi/claim.evaluate',\n 'collection/lifecycle': 'qi/collection.lifecycle',\n 'collection/users': 'qi/collection.users',\n 'email/send': 'qi/email.send',\n 'notification/push': 'qi/notification.push',\n 'matrix/dm': 'qi/matrix.dm',\n 'proposal/create': 'qi/proposal.create',\n 'proposal/vote': 'qi/proposal.vote',\n 'governance/member-proposal': 'qi/governance.member-proposal',\n 'governance/settings-proposal': 'qi/governance.settings-proposal',\n 'governance.transaction/send-funds': 'qi/governance.transaction.send-funds',\n 'domain/card-preview': 'qi/domain.card-preview',\n 'domain/sign': 'qi/domain.sign',\n 'credential/store': 'qi/credential.store',\n 'http/request': 'qi/http.request',\n 'protocol/select': 'qi/protocol.select',\n 'human/checkbox': 'qi/human.checkbox.set',\n 'human/form': 'qi/human.form.submit',\n 'oracle/query': 'oracle',\n 'pod/domain-indexer-lookup': 'qi/pod.domain-indexer-lookup',\n 'pod/domain-single-selection': 'qi/pod.domain-single-selection',\n 'pod/entity-single-selection': 'qi/pod.entity-single-selection',\n 'pod/governance-config': 'qi/pod.governance-config',\n 'pod/member-multi-select': 'qi/pod.member-multi-select',\n 'pod/list-domain-flows': 'qi/pod.list-domain-flows',\n 'blueprint/workspace-start': 'qi/blueprint.workspace-start',\n 'blueprint/journey-resume': 'qi/blueprint.journey-resume',\n 'blueprint/guided-authoring': 'qi/blueprint.guided-authoring',\n 'blueprint/artifact-preview': 'qi/blueprint.artifact-preview',\n 'blueprint/artifact-save': 'qi/blueprint.artifact-save',\n 'blueprint/checklist-update': 'qi/blueprint.checklist-update',\n 'blueprint/phase-confirm': 'qi/blueprint.phase-confirm',\n 'blueprint/reviewer-assign': 'qi/blueprint.reviewer-assign',\n 'blueprint/review-submit': 'qi/blueprint.review-submit',\n 'blueprint/review-respond': 'qi/blueprint.review-respond',\n 'blueprint/release-compile': 'qi/blueprint.release-compile',\n 'blueprint/publish': 'qi/blueprint.publish',\n // Delegated integrations (author connects once, runners execute on their behalf)\n 'gmail.email/send': 'qi/gmail.email.send',\n 'outlook.email/send': 'qi/outlook.email.send',\n 'slack.message/send': 'qi/slack.message.send',\n 'googlecalendar.event/create': 'qi/googlecalendar.event.create',\n // Calendar integration (self-connected)\n 'calendar.event/create': 'qi/calendar.event.create',\n 'calendar.event/update': 'qi/calendar.event.update',\n 'calendar.event/list': 'qi/calendar.event.list',\n // Xero integration\n 'xero.contact/create': 'qi/xero.contact.create',\n 'xero.invoice/create': 'qi/xero.invoice.create',\n 'xero.invoice/list': 'qi/xero.invoice.list',\n 'xero.payment/create': 'qi/xero.payment.create',\n // Oracle / wallet / matrix lifecycle\n 'wallet/generate': 'qi/wallet.generate',\n 'wallet/fund': 'qi/wallet.fund',\n 'iid/create': 'qi/iid.create',\n 'matrix/register': 'qi/matrix.register',\n 'entity/createOracle': 'qi/entity.createOracle',\n 'sandbox/provision': 'qi/sandbox.provision',\n 'oracle/contract': 'qi/oracle.contract',\n 'oracle/storeSecrets': 'qi/oracle.storeSecrets',\n 'oracle/storeConfig': 'qi/oracle.storeConfig',\n 'oracle/configureOracle': 'qi/oracle.configureOracle',\n};\n\nconst TYPE_TO_CAN: Record<string, string> = Object.fromEntries(Object.entries(CAN_TO_TYPE).map(([can, type]) => [type, can]));\n\n/** Resolve a `can` ability string to the registry `type` string. */\nexport function canToType(can: string): string | undefined {\n return CAN_TO_TYPE[can];\n}\n\n/** Resolve a registry `type` string to the `can` ability string. */\nexport function typeToCan(type: string): string | undefined {\n return TYPE_TO_CAN[type];\n}\n\n/** Get all registered can↔type mappings. */\nexport function getAllCanMappings(): ReadonlyArray<{ can: string; type: string }> {\n return Object.entries(CAN_TO_TYPE).map(([can, type]) => ({ can, type }));\n}\n","const seen = new Set<string>();\n\n/**\n * Log a warning at most once per key for the lifetime of the module.\n * Used to surface configuration problems (malformed inputs/trigger JSON,\n * unresolvable references) without flooding the console on every render\n * or reconcile pass.\n */\nexport function warnOnce(key: string, message: string): void {\n if (seen.has(key)) return;\n seen.add(key);\n console.warn(message);\n}\n\n/** Test hook — clears the dedupe set. */\nexport function __resetWarnOnce(): void {\n seen.clear();\n}\n","import { canToType, typeToCan } from './canMapping';\nimport type { ActionDefinition, ActionDoneContract, ActionEventDefinition, OutputSchemaField } from './types';\nimport { warnOnce } from '../warnOnce';\n\nconst actions = new Map<string, ActionDefinition>();\n\n/** Stable name of the universal completion event every step emits. */\nexport const STEP_COMPLETED_EVENT_NAME = 'step.completed';\n\n/**\n * The universal completion event. Every step emits this when it completes, on\n * top of whatever domain events its action declares. It exists so that:\n * - any step can be sequenced off a predecessor (\"run after X\") via a\n * `(X, step.completed)` trigger, regardless of the source action's events;\n * - every completion is auditable (a run record is always written).\n */\nexport const STEP_COMPLETED_EVENT: ActionEventDefinition = {\n name: STEP_COMPLETED_EVENT_NAME,\n displayName: 'Completed',\n description: 'Fires when this step is completed.',\n payloadSchema: [],\n};\n\n/**\n * The default Done contract: a one-shot step is Done once its run reached\n * `completed`.\n *\n * The fold reads only the run state because proof of execution is enforced\n * where the completion is *written* — `executeActionBlock` records a success\n * that lacks the action's declared proof as `failed` (`PROOF_MISSING`) — and\n * re-checked at the trust boundary by `verifyCompletion`, which is what\n * trigger reconciliation, flow-agent planning and the completion badge gate on.\n *\n * Actions whose Done-ness is not simply the run state — it depends on an\n * output field, a quota, or an external system — declare their own contract\n * instead (see `qi/kyc.verify`).\n */\nexport const doneWhenCompleted: ActionDoneContract = {\n isDone: (state) => state.state === 'completed',\n};\n\n/**\n * Done contract for repeatable capabilities (`cardinality: 'many'`): a\n * standing block fires as often as the flow decides and never latches to a\n * terminal Done, so its fold is always false. Real progress for these blocks\n * is the count of successful runs in the audit trail, not the summary entry.\n */\nexport const neverDone: ActionDoneContract = {\n isDone: () => false,\n};\n\n/** Maps legacy action type names to their canonical namespaced names. */\nconst ACTION_TYPE_ALIASES: Record<string, string> = {\n bid: 'qi/bid.submit',\n claim: 'qi/claim.submit',\n evaluateBid: 'qi/bid.evaluate',\n evaluateClaim: 'qi/claim.evaluate',\n 'email.send': 'qi/email.send',\n 'http.request': 'qi/http.request',\n 'form.submit': 'qi/form.submit',\n 'human.form.submit': 'qi/human.form.submit',\n 'human.checkbox.set': 'qi/human.checkbox.set',\n 'notification.push': 'qi/notification.push',\n 'proposal.create': 'qi/proposal.create',\n 'proposal.vote': 'qi/proposal.vote',\n 'protocol.select': 'qi/protocol.select',\n 'domain.sign': 'qi/domain.sign',\n 'domain.card-preview': 'qi/domain.card-preview',\n 'credential.store': 'qi/credential.store',\n // POD setup flow — camelCase orchestrator labels → canonical action types\n DomainIndexerLookup: 'qi/pod.domain-indexer-lookup',\n DomainSingleSelection: 'qi/pod.domain-single-selection',\n EntitySingleSelection: 'qi/pod.entity-single-selection',\n MemberMultiSelect: 'qi/pod.member-multi-select',\n governanceConfig: 'qi/pod.governance-config',\n listDomainFlows: 'qi/pod.list-domain-flows',\n 'matrix.dm': 'qi/matrix.dm',\n};\n\nconst aliases = new Map<string, string>(Object.entries(ACTION_TYPE_ALIASES));\n\n/** Resolves a legacy action type name to its canonical namespaced name. */\nexport function resolveActionType(type: string): string {\n return aliases.get(type) ?? type;\n}\n\n/** Normalize UCAN `can` abilities to the canonical slash vocabulary. */\nexport function normalizeCan(can: string): string {\n const trimmed = can.trim();\n const lastDot = trimmed.lastIndexOf('.');\n if (!trimmed.includes('/') && lastDot > 0) {\n return `${trimmed.slice(0, lastDot)}/${trimmed.slice(lastDot + 1)}`;\n }\n return trimmed;\n}\n\n/**\n * Normalize UCAN capability patterns while accepting dotted legacy aliases.\n * Patterns follow the same vocabulary as abilities, so this delegates to\n * {@link normalizeCan} (`claim.*` → `claim/*`, `xero.invoice.*` → `xero.invoice/*`).\n */\nexport function normalizeCapabilityPattern(pattern: string): string {\n return normalizeCan(pattern);\n}\n\n/** Resolve a registry action type to its canonical UCAN `can` ability. */\nexport function actionTypeToCan(type: string): string | undefined {\n const resolvedType = resolveActionType(type.trim());\n const registered = actions.get(resolvedType);\n if (registered?.can) return normalizeCan(registered.can);\n\n const mapped = typeToCan(resolvedType);\n if (mapped) return normalizeCan(mapped);\n\n if (!resolvedType.startsWith('qi/')) return undefined;\n // Verb-last: `qi/calendar.event.create` → `calendar.event/create`, matching\n // both `canMapping` entries and `normalizeCan`'s last-dot rule.\n return normalizeCan(resolvedType.slice('qi/'.length));\n}\n\n/** Resolve a UCAN `can` ability to its canonical namespaced registry action type. */\nexport function canToActionType(can: string): string | undefined {\n const normalizedCan = normalizeCan(can);\n for (const action of actions.values()) {\n if (action.can && normalizeCan(action.can) === normalizedCan) return action.type;\n }\n\n const mapped = canToType(normalizedCan);\n if (mapped) return resolveActionType(mapped);\n\n // Only single-slash abilities have a well-formed action type. Multi-slash\n // abilities (e.g. serviceCan's `claim/evaluate/report`) have no `qi/…` type,\n // and a `claim/`-style ability has no verb — report both as unmapped rather\n // than synthesising a malformed type.\n const segments = normalizedCan.split('/');\n if (segments.length !== 2) return undefined;\n const [namespace, verb] = segments;\n if (namespace.length === 0 || verb.length === 0) return undefined;\n return `qi/${namespace}.${verb}`;\n}\n\nexport interface CapabilityPatternCoversCanOptions {\n allowGlobalWildcard?: boolean;\n}\n\n/** Return true when a capability pattern grants the requested `can` ability. */\nexport function capabilityPatternCoversCan(pattern: string, can: string, options: CapabilityPatternCoversCanOptions = {}): boolean {\n const normalizedPattern = normalizeCapabilityPattern(pattern);\n const normalizedCan = normalizeCan(can);\n\n if (normalizedPattern === '*') return options.allowGlobalWildcard === true;\n if (normalizedPattern === normalizedCan) return true;\n if (normalizedPattern.endsWith('/*')) {\n const prefix = normalizedPattern.slice(0, -1);\n return normalizedCan.startsWith(prefix);\n }\n return false;\n}\n\nexport function registerAction<TInputs extends Record<string, any> = Record<string, any>>(definition: ActionDefinition<TInputs>): void {\n const normalized = definition.can ? { ...definition, can: normalizeCan(definition.can) } : definition;\n // Every action states how one of its runs folds to Done; the registry\n // guarantees the invariant so `isActionDone` can consult the contract\n // unconditionally. The type requires it — this backfill only catches a\n // plain-JS consumer registering an action written before the contract\n // existed, which should warn rather than crash the completion fold.\n if (!normalized.done) {\n warnOnce(`missing-done-contract:${definition.type}`, `[flow-config] action ${definition.type}: no done contract declared; defaulting to state === 'completed'`);\n actions.set(definition.type, { ...normalized, done: doneWhenCompleted } as ActionDefinition);\n return;\n }\n actions.set(definition.type, normalized as ActionDefinition);\n}\n\nexport function getAction(type: string): ActionDefinition | undefined {\n return actions.get(resolveActionType(type));\n}\n\nexport function getAllActions(): ActionDefinition[] {\n return Array.from(actions.values());\n}\n\n/**\n * Whether an action type is a repeatable ('many') capability — a standing\n * block that can fire any number of times and never latches to a terminal\n * Done. Unknown types default to `false` (one-shot). See\n * {@link ActionDefinition.cardinality}.\n */\nexport function isRepeatableAction(type: string | undefined | null): boolean {\n if (!type) return false;\n return getAction(type)?.cardinality === 'many';\n}\n\n/** All (alias → canonical type) pairs, for manifest generation and consistency checks. */\nexport function getAliasEntries(): Array<[string, string]> {\n return Array.from(aliases.entries());\n}\n\nexport function hasAction(type: string): boolean {\n return actions.has(resolveActionType(type));\n}\n\n/** Look up an action by its UCAN `can` ability string, e.g., \"bid/submit\". */\nexport function getActionByCan(can: string): ActionDefinition | undefined {\n const normalizedCan = normalizeCan(can);\n for (const action of actions.values()) {\n if (action.can && normalizeCan(action.can) === normalizedCan) return action;\n }\n return undefined;\n}\n\n/**\n * Resolve the event vocabulary for a specific block given its template inputs.\n *\n * Prefers the action's `getDynamicEvents(inputs)` resolver (so actions can\n * derive event schemas from configured state — e.g. claim.submit deriving the\n * event payload from the picked collection's survey). Falls back to the static\n * `events` array when no resolver is defined.\n *\n * `inputs` may be a pre-parsed object, a JSON string, or missing entirely;\n * this helper absorbs parse failures so callers don't need to.\n */\nexport function getEventsForBlock(action: ActionDefinition | undefined, inputs: unknown): ActionEventDefinition[] {\n if (!action) return [];\n\n let events: ActionEventDefinition[];\n if (action.getDynamicEvents) {\n const parsed = normalizeInputs(inputs);\n try {\n const dynamic = action.getDynamicEvents(parsed) || [];\n events = action.dynamicResolutionMode === 'replace' ? dynamic : mergeByKey(action.events || [], dynamic, (event) => event.name);\n } catch (error) {\n // A crashing resolver must not break the picker or compiler.\n warnOnce(\n `dynamic-events:${action.type}`,\n `[flow-config] action ${action.type}: getDynamicEvents threw (${error instanceof Error ? error.message : String(error)}); no events resolved`\n );\n events = [];\n }\n } else {\n events = action.events || [];\n }\n\n // Every step also emits the universal completion event, so any step can be a\n // \"run after X\" trigger source. Skip if the action already declares one with\n // that name (don't double-list).\n if (events.some((event) => event.name === STEP_COMPLETED_EVENT_NAME)) {\n return events;\n }\n return [...events, STEP_COMPLETED_EVENT];\n}\n\n/**\n * Resolve the output schema for a specific block. Symmetric to\n * `getEventsForBlock`: prefers `getDynamicOutputSchema(inputs)` when defined\n * so actions can derive their output shape from configured state (e.g.\n * `qi/claim.submit` exposing `output.surveyAnswers.<question>` once a\n * collection is picked). Falls back to the static `outputSchema`.\n */\nexport function getOutputSchemaForBlock(action: ActionDefinition | undefined, inputs: unknown): OutputSchemaField[] {\n if (!action) return [];\n if (action.getDynamicOutputSchema) {\n const parsed = normalizeInputs(inputs);\n try {\n const dynamic = action.getDynamicOutputSchema(parsed) || [];\n if (action.dynamicResolutionMode === 'replace') return dynamic;\n return mergeByKey(action.outputSchema || [], dynamic, (field) => field.path);\n } catch (error) {\n warnOnce(\n `dynamic-output-schema:${action.type}`,\n `[flow-config] action ${action.type}: getDynamicOutputSchema threw (${error instanceof Error ? error.message : String(error)}); using static schema`\n );\n return action.outputSchema || [];\n }\n }\n return action.outputSchema || [];\n}\n\n/**\n * Merge a static baseline with dynamic entries, deduping by key — the\n * dynamic entry wins on conflict, baseline order is preserved. Actions that\n * genuinely need to hide the baseline set `dynamicResolutionMode: 'replace'`.\n */\nfunction mergeByKey<T>(baseline: T[], dynamic: T[], keyOf: (item: T) => string): T[] {\n const dynamicKeys = new Set(dynamic.map(keyOf));\n return [...baseline.filter((item) => !dynamicKeys.has(keyOf(item))), ...dynamic];\n}\n\nfunction normalizeInputs(inputs: unknown): Record<string, any> {\n if (!inputs) return {};\n if (typeof inputs === 'object') return inputs as Record<string, any>;\n if (typeof inputs === 'string') {\n try {\n const parsed = JSON.parse(inputs || '{}');\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n warnOnce(`inputs-normalize:${inputs}`, `[flow-config] block inputs are not valid JSON; treated as empty`);\n return {};\n }\n }\n return {};\n}\n","import type { ActionDefinition, ActionEventDefinition, OutputSchemaField } from './types';\nimport { doneWhenCompleted, getAliasEntries, getAllActions, neverDone } from './registry';\n\n/**\n * Serializable proof declaration: custom `validate` functions can't cross a\n * JSON boundary, so they are represented as `{ kind: 'custom' }` — consumers\n * know a proof exists and is enforced kernel-side, without its logic.\n */\nexport type ManifestProofDeclaration = { kind: 'none' } | { kind: 'fields'; fields: string[] } | { kind: 'custom' };\nexport interface ManifestDoneDeclaration {\n /**\n * `default` = one of the two shared standard contracts — a one-shot action\n * is Done when its run reached `completed`, a repeatable one never latches\n * (read `cardinality` to tell which applies). `custom` = the action defines\n * its own predicate, which (like a custom proof) can't cross the JSON\n * boundary; ask for an external check or run in-process to evaluate it.\n */\n kind: 'default' | 'custom';\n /** Whether an external actor can request a side-effect-free truth check. */\n hasExternalCheck: boolean;\n cardinality: 'once' | 'many';\n}\n\nexport interface ActionManifestEntry {\n type: string;\n /** Legacy names that resolve to this canonical type. */\n aliases: string[];\n can?: string;\n sideEffect: boolean;\n defaultRequiresConfirmation: boolean;\n requiredCapability?: string;\n proof: ManifestProofDeclaration;\n done: ManifestDoneDeclaration;\n /** JSON Schema for the action's inputs, when declared. */\n inputSchema?: object;\n /** Static output schema. Actions with dynamic schemas also set hasDynamicOutputSchema. */\n outputSchema?: OutputSchemaField[];\n /** Static event vocabulary. Actions with dynamic events also set hasDynamicEvents. */\n events?: Array<Pick<ActionEventDefinition, 'name' | 'displayName' | 'description' | 'payloadSchema'>>;\n hasDynamicEvents: boolean;\n hasDynamicOutputSchema: boolean;\n eligibleForEventTrigger: boolean;\n /**\n * True when the action defines `getMissingInputs` — conditional requiredness\n * that `inputSchema.required` cannot express (like a custom proof, the\n * function itself can't cross the JSON boundary). Out-of-process consumers\n * should treat the schema's `required` as a lower bound for such actions;\n * in-process consumers get the full logic via `getMissingActionInputs`.\n */\n hasCustomInputValidation: boolean;\n}\n\nexport interface ActionManifest {\n /** Schema version of the manifest format itself. */\n manifestVersion: '1';\n actions: ActionManifestEntry[];\n}\n\nfunction serializeProof(action: ActionDefinition): ManifestProofDeclaration {\n const proof = action.proof;\n if (proof === 'none' || proof === undefined) return { kind: 'none' };\n if ('validate' in proof) return { kind: 'custom' };\n return { kind: 'fields', fields: [...proof.fields] };\n}\n\n/**\n * Serialize the completion contract. Every action declares one, so `custom`\n * means \"not one of the shared standard contracts\" — the fold is action\n * logic an out-of-process consumer cannot replicate from the manifest.\n */\nfunction serializeDone(action: ActionDefinition): ManifestDoneDeclaration {\n const isStandard = action.done === doneWhenCompleted || action.done === neverDone;\n return {\n kind: isStandard ? 'default' : 'custom',\n hasExternalCheck: !!action.done.check,\n cardinality: action.cardinality || 'once',\n };\n}\n\n/**\n * Generate the machine-readable action contract from the live registry.\n *\n * This is the single artifact external actors (the flow-manager oracle,\n * third-party agentic Oracle actors) implement against, replacing\n * hand-maintained copies of input contracts. It is emitted to\n * `dist/action-manifest.json` at build time and also callable at runtime\n * from `@ixo/editor/core`.\n */\nexport function generateActionManifest(): ActionManifest {\n const aliasEntries = getAliasEntries();\n const aliasesByType = new Map<string, string[]>();\n for (const [alias, canonical] of aliasEntries) {\n const list = aliasesByType.get(canonical) || [];\n list.push(alias);\n aliasesByType.set(canonical, list);\n }\n\n const actions = getAllActions()\n .map((action): ActionManifestEntry => {\n const entry: ActionManifestEntry = {\n type: action.type,\n aliases: (aliasesByType.get(action.type) || []).sort(),\n sideEffect: action.sideEffect,\n defaultRequiresConfirmation: action.defaultRequiresConfirmation,\n proof: serializeProof(action),\n done: serializeDone(action),\n hasDynamicEvents: !!action.getDynamicEvents,\n hasDynamicOutputSchema: !!action.getDynamicOutputSchema,\n eligibleForEventTrigger: !!action.eligibleForEventTrigger,\n hasCustomInputValidation: !!action.getMissingInputs,\n };\n if (action.can) entry.can = action.can;\n if (action.requiredCapability) entry.requiredCapability = action.requiredCapability;\n if (action.inputSchema) entry.inputSchema = action.inputSchema;\n if (action.outputSchema) entry.outputSchema = action.outputSchema;\n if (action.events) {\n entry.events = action.events.map((event) => ({\n name: event.name,\n displayName: event.displayName,\n description: event.description,\n payloadSchema: event.payloadSchema,\n }));\n }\n return entry;\n })\n .sort((a, b) => a.type.localeCompare(b.type));\n\n return { manifestVersion: '1', actions };\n}\n","import { getAction } from './registry';\nimport { warnOnce } from '../warnOnce';\n\n/**\n * Required-input evaluation for action types — the machine-readable mirror of\n * the throw-preamble in each action's `run()`.\n *\n * External orchestrators (the flow-manager oracle, third-party agentic Oracle\n * actors) call {@link getMissingActionInputs} BEFORE queuing execution so a\n * missing input becomes a prompt to a human instead of a failed run. The\n * editor's registry is the single source of truth for requiredness: actions\n * with unconditional requirements derive from `inputSchema.required`; actions\n * whose requiredness depends on other inputs define\n * {@link ActionDefinition.getMissingInputs} next to their `run()`.\n *\n * Scope: presence only. A field can pass here (present, non-blank) and still\n * fail value validation (ranges, formats, duplicates) inside `run()` — `run()`\n * remains the authority on validity.\n */\n\n/**\n * Whether a value counts as \"missing\" for a required input: `null`/`undefined`,\n * a string that is blank after trimming, or an empty array. Objects and other\n * primitives (including `false` and `0`) count as present.\n */\nexport function isBlankInputValue(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value === 'string') return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n return false;\n}\n\n/**\n * Coerce an input that `run()` accepts as either an object or a JSON string\n * (e.g. `domainCardData`) into an object, or `undefined` when it is neither.\n */\nexport function parseMaybeJsonObject(value: unknown): Record<string, unknown> | undefined {\n if (value && typeof value === 'object' && !Array.isArray(value)) return value as Record<string, unknown>;\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) return parsed as Record<string, unknown>;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nfunction dedupe(values: string[]): string[] {\n return Array.from(new Set(values.filter((value) => typeof value === 'string' && value.length > 0)));\n}\n\n/**\n * Names of the inputs still missing or blank for `actionType` given a\n * fully-merged inputs object (empty array = ready to execute, as far as\n * presence goes). Resolves legacy aliases through the registry; unknown or\n * alias-less action types report nothing missing.\n *\n * Prefers the action's `getMissingInputs` (conditional requiredness), falling\n * back to `inputSchema.required` with {@link isBlankInputValue} semantics.\n * A crashing `getMissingInputs` must not break an orchestrator tick: it is\n * absorbed (warn-once) and reports nothing missing, so the real error\n * surfaces from `run()` instead.\n */\nexport function getMissingActionInputs(actionType: string | undefined | null, inputs: Record<string, unknown> | undefined): string[] {\n if (!actionType) return [];\n const action = getAction(actionType);\n if (!action) return [];\n\n const merged = inputs ?? {};\n if (action.getMissingInputs) {\n try {\n return dedupe(action.getMissingInputs(merged) || []);\n } catch (error) {\n warnOnce(\n `missing-inputs:${action.type}`,\n `[flow-config] action ${action.type}: getMissingInputs threw (${error instanceof Error ? error.message : String(error)}); reporting no missing inputs`\n );\n return [];\n }\n }\n\n const schema = action.inputSchema as { required?: unknown } | undefined;\n const required = Array.isArray(schema?.required) ? schema.required.filter((name): name is string => typeof name === 'string') : [];\n return dedupe(required.filter((name) => isBlankInputValue(merged[name])));\n}\n","/**\n * Service-verb `can` grammar for contracted helper oracles.\n *\n * The `can` vocabulary has two tiers:\n *\n * 1. **Action cans** (`<namespace>/<verb>`, e.g. `claim/evaluate`) — the\n * identity of an execution contract. They map 1:1 to registry action types\n * (see `canMapping.ts`) and name the thing the flow engine actually runs.\n * 2. **Service cans** (`<action can>/<service verb>`, e.g.\n * `claim/evaluate/report`) — the name of a contracted helper service scoped\n * to an action. A helper oracle holding a service-can delegation does NOT\n * execute the action; it performs a service about it (produce a report,\n * format output, advise). The delegation is a **work contract** — inputs\n * passed by value, receipt returned by value — not a grant of system\n * authority over the action or its resources.\n *\n * Attenuation rule: flow-document authority covers `<can>/*` service verbs —\n * a principal authorized over the flow may contract any service verb under the\n * cans that flow uses. A narrow execution grant (e.g. `claim/evaluate` alone)\n * does not expand into service verbs, and a service-verb grant (e.g.\n * `claim/evaluate/report`) does not expand into execution.\n *\n * Generic action-agnostic services (e.g. `flow/diagnose`) are their own tier\n * with their own vocabulary and are intentionally NOT expressible through this\n * helper — `diagnose` is not a `ServiceVerb`.\n */\n\n/** The closed set of service verbs a helper oracle can be contracted for. */\nexport const SERVICE_VERBS = ['report', 'format', 'advise'] as const;\n\nexport type ServiceVerb = (typeof SERVICE_VERBS)[number];\n\n/**\n * True when `can` is namespace/verb shaped (non-empty segments around at least\n * one '/') and is not itself a service can. Service verbs are reserved words:\n * an action can may never end in one, which is what makes the grammar\n * unambiguous and rules out service-of-service composition.\n */\nfunction isActionCanShape(can: string): boolean {\n if (typeof can !== 'string' || can.length === 0) return false;\n const segments = can.split('/');\n return segments.length >= 2 && segments.every((segment) => segment.length > 0) && !(SERVICE_VERBS as readonly string[]).includes(segments[segments.length - 1]);\n}\n\n/**\n * Compose a service can from an action can and a service verb.\n *\n * `serviceCan('claim/evaluate', 'report')` → `'claim/evaluate/report'`.\n *\n * @throws when `can` is not a valid action-can shape (`<namespace>/<verb>`),\n * when `can` is already a service can (no service-of-service composition), or\n * when `verb` is not in {@link SERVICE_VERBS} — the vocabulary is closed at\n * runtime too, not only at the type level, so untyped callers (JS, decoded\n * config) cannot mint capabilities outside it.\n */\nexport function serviceCan(can: string, verb: ServiceVerb): string {\n if (!(SERVICE_VERBS as readonly string[]).includes(verb)) {\n throw new Error(`serviceCan: unknown service verb '${String(verb)}' — expected one of: ${SERVICE_VERBS.join(', ')}`);\n }\n if (!isActionCanShape(can)) {\n throw new Error(`serviceCan: invalid action can '${can}' — expected a non-empty '<namespace>/<verb>' shaped string that is not itself a service can, e.g. 'claim/evaluate'`);\n }\n return `${can}/${verb}`;\n}\n\n/**\n * Parse a service can back into its action can and service verb.\n *\n * `parseServiceCan('claim/evaluate/report')` →\n * `{ actionCan: 'claim/evaluate', verb: 'report' }`.\n *\n * Returns `null` when the last segment is not a known {@link ServiceVerb} or\n * the prefix is not a valid action-can shape. Plain action cans\n * (`claim/evaluate`) and generic-tier cans (`flow/diagnose`) both return\n * `null` — they are not service cans.\n */\nexport function parseServiceCan(value: string): { actionCan: string; verb: ServiceVerb } | null {\n if (typeof value !== 'string' || value.length === 0) return null;\n const lastSlash = value.lastIndexOf('/');\n if (lastSlash <= 0) return null;\n const verb = value.slice(lastSlash + 1);\n if (!(SERVICE_VERBS as readonly string[]).includes(verb)) return null;\n const actionCan = value.slice(0, lastSlash);\n if (!isActionCanShape(actionCan)) return null;\n return { actionCan, verb: verb as ServiceVerb };\n}\n","import type { ActionServices } from './types';\n\n/**\n * Builds an ActionServices map from BlocknoteHandlers.\n * Used by block components to bridge existing DI into registry calls.\n *\n * The handlers parameter is typed as `any` to avoid a circular dependency\n * between core and mantine layers — BlocknoteHandlers is defined in mantine/context.\n */\n/**\n * Required handler keys per all-or-nothing service group, mirroring the\n * guards below. When a consumer provides SOME of a group's methods, the\n * whole group silently resolves to `undefined` and actions later throw\n * \"handler not available\" with no hint of what was missing — this table\n * lets us name the missing methods at wiring time instead.\n */\nconst SERVICE_GROUP_REQUIRED_HANDLERS: Record<string, string[]> = {\n bid: ['submitBid', 'approveBid', 'rejectBid', 'approveServiceAgentApplication', 'approveEvaluatorApplication'],\n claim: ['requestPin', 'submitClaim', 'evaluateClaim', 'getCurrentUser'],\n collection: [\n 'collection.get',\n 'collection.create',\n 'collection.updateState',\n 'collection.updateDates',\n 'collection.updateQuota',\n 'collection.updatePayments',\n 'collection.updateIntents',\n ],\n collectionUsers: ['collectionUsers.grant', 'collectionUsers.revoke', 'collectionUsers.list', 'collectionUsers.classifyAddress', 'collectionUsers.enumerateMembers'],\n carbon: ['carbon.loadBatches', 'carbon.harvest', 'carbon.retire'],\n kyc: ['kycLoadForm', 'kycInitiate', 'kycGetVerificationUrl', 'kycGetStatus', 'kycSaveCredential'],\n};\n\nfunction getHandlerAtPath(handlers: any, path: string): unknown {\n return path.split('.').reduce<any>((acc, key) => (acc == null ? undefined : acc[key]), handlers);\n}\n\nfunction warnPartialServiceGroups(handlers: any): void {\n if (!handlers) return;\n for (const [group, keys] of Object.entries(SERVICE_GROUP_REQUIRED_HANDLERS)) {\n const missing = keys.filter((key) => !getHandlerAtPath(handlers, key));\n if (missing.length > 0 && missing.length < keys.length) {\n console.warn(\n `[buildServicesFromHandlers] services.${group} is DISABLED: handlers provide ${keys.length - missing.length}/${keys.length} required methods; missing: ${missing.join(', ')}`\n );\n }\n }\n}\n\nexport function buildServicesFromHandlers(handlers: any): ActionServices {\n warnPartialServiceGroups(handlers);\n return {\n blueprint: handlers?.blueprint?.execute\n ? {\n execute: async (params) => handlers.blueprint.execute(params),\n }\n : undefined,\n http: {\n request: async (params) => {\n const fetchOptions: RequestInit = {\n method: params.method,\n headers: { 'Content-Type': 'application/json', ...params.headers },\n };\n if (params.method !== 'GET' && params.body) {\n fetchOptions.body = typeof params.body === 'string' ? params.body : JSON.stringify(params.body);\n }\n const res = await fetch(params.url, fetchOptions);\n const data = await res.json().catch(() => ({}));\n const responseHeaders: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n return {\n status: res.status,\n headers: responseHeaders,\n data,\n };\n },\n },\n email: handlers?.sendEmail\n ? {\n send: async (params) => {\n const result = await handlers.sendEmail(params);\n return {\n messageId: result.id || '',\n sentAt: new Date().toISOString(),\n };\n },\n }\n : undefined,\n notify: handlers?.sendNotification\n ? {\n send: async (params) => {\n const result = await handlers.sendNotification(params);\n return {\n messageId: result.messageId,\n sentAt: result.timestamp || new Date().toISOString(),\n };\n },\n }\n : undefined,\n bid:\n handlers?.submitBid && handlers?.approveBid && handlers?.rejectBid && handlers?.approveServiceAgentApplication && handlers?.approveEvaluatorApplication\n ? {\n submitBid: async (params) => handlers.submitBid(params),\n approveBid: async (params) => handlers.approveBid(params),\n rejectBid: async (params) => handlers.rejectBid(params),\n approveServiceAgentApplication: async (params) => handlers.approveServiceAgentApplication(params),\n approveEvaluatorApplication: async (params) => handlers.approveEvaluatorApplication(params),\n }\n : undefined,\n claim:\n handlers?.requestPin && handlers?.submitClaim && handlers?.evaluateClaim && handlers?.getCurrentUser\n ? {\n requestPin: async (config) => handlers.requestPin(config),\n submitClaim: async (params) => handlers.submitClaim(params),\n evaluateClaim: async (granteeAddress, did, payload) => handlers.evaluateClaim(granteeAddress, did, payload),\n disputeClaim: handlers?.disputeClaim ? async (granteeAddress, did, payload) => handlers.disputeClaim(granteeAddress, did, payload) : undefined,\n getCurrentUser: () => handlers.getCurrentUser(),\n createUdid: handlers?.createUdid ? async (params) => handlers.createUdid(params) : undefined,\n }\n : undefined,\n matrix: handlers?.storeMatrixCredential\n ? {\n storeCredential: async (params) => handlers.storeMatrixCredential(params),\n }\n : undefined,\n // Claim-collection lifecycle service (IXO-2573/2579). The consumer exposes\n // a fully-formed `handlers.collection` service group (get + create + the\n // five updates); wire each method straight through. The core run()\n // dispatcher resolves admin from the on-chain collection.admin and\n // re-fetches via `get` after every write, so we only forward calls here.\n collection:\n handlers?.collection?.get &&\n handlers?.collection?.create &&\n handlers?.collection?.updateState &&\n handlers?.collection?.updateDates &&\n handlers?.collection?.updateQuota &&\n handlers?.collection?.updatePayments &&\n handlers?.collection?.updateIntents\n ? {\n get: async (params) => handlers.collection.get(params),\n create: async (params) => handlers.collection.create(params),\n updateState: async (params) => handlers.collection.updateState(params),\n updateDates: async (params) => handlers.collection.updateDates(params),\n updateQuota: async (params) => handlers.collection.updateQuota(params),\n updatePayments: async (params) => handlers.collection.updatePayments(params),\n updateIntents: async (params) => handlers.collection.updateIntents(params),\n }\n : undefined,\n // Claim-collection user-management service (IXO-2586). The consumer exposes a\n // fully-formed `handlers.collectionUsers` service group (grant + revoke +\n // list + classifyAddress + enumerateMembers); wire each method straight\n // through. The core run() dispatcher validates inputs and proof-guards the\n // results, so we only forward calls here.\n collectionUsers:\n handlers?.collectionUsers?.grant &&\n handlers?.collectionUsers?.revoke &&\n handlers?.collectionUsers?.list &&\n handlers?.collectionUsers?.classifyAddress &&\n handlers?.collectionUsers?.enumerateMembers\n ? {\n grant: async (params) => handlers.collectionUsers.grant(params),\n revoke: async (params) => handlers.collectionUsers.revoke(params),\n list: async (params) => handlers.collectionUsers.list(params),\n classifyAddress: async (params) => handlers.collectionUsers.classifyAddress(params),\n enumerateMembers: async (params) => handlers.collectionUsers.enumerateMembers(params),\n }\n : undefined,\n integrations: handlers?.integrations?.executeTool\n ? {\n executeTool: async (args) => handlers.integrations.executeTool(args),\n fetchCurrentState: handlers.integrations.fetchCurrentState ? async (args) => handlers.integrations.fetchCurrentState(args) : undefined,\n getEntityDid: handlers?.getEntityDid ? () => handlers.getEntityDid() : undefined,\n executeBinding: handlers.integrations.executeBinding ? async (args) => handlers.integrations.executeBinding(args) : undefined,\n }\n : undefined,\n oracle: handlers?.generateWallet\n ? {\n generateWallet: async () => handlers.generateWallet(),\n fundWallet: async (params) => handlers.fundWallet(params),\n createIidDocument: async (params) => handlers.createIidDocument(params),\n registerMatrixAccount: async (params) => handlers.registerMatrixAccount(params),\n createOracleEntity: async (params) => handlers.createOracleEntity(params),\n contract: async (params) => handlers.oracleContract(params),\n provisionSandbox: async (params) => handlers.provisionSandbox(params),\n storeSecrets: async (params) => handlers.storeSecrets(params),\n storeConfig: async (params) => handlers.storeOracleConfig(params),\n validateMcpServer: handlers.validateMcpServer || (async () => ({ success: false, error: 'Handler not configured' })),\n encryptForOracle: async (params) => handlers.encryptSecretForOracle(params),\n readStoredSecrets: async (params) => handlers.readStoredSecrets(params),\n getNetworkConstants: async (params) => handlers.getNetworkConstants(params),\n deploySetup:\n handlers.deploySetup ||\n (async () => {\n throw new Error('deploySetup handler not configured');\n }),\n deployStart:\n handlers.deployStart ||\n (async () => {\n throw new Error('deployStart handler not configured');\n }),\n updateOracleDomain:\n handlers.updateOracleDomain ||\n (async () => {\n throw new Error('updateOracleDomain handler not configured');\n }),\n }\n : undefined,\n // Carbon credit batch service (IXO-2675). The consumer exposes a\n // fully-formed `handlers.carbon` service group (loadBatches + harvest +\n // retire); wire each method straight through. The harvest/retire calls are\n // user-signed inside the consumer handler — we only forward here.\n carbon:\n handlers?.carbon?.loadBatches && handlers?.carbon?.harvest && handlers?.carbon?.retire\n ? {\n loadBatches: async (params) => handlers.carbon.loadBatches(params),\n harvest: async (params) => handlers.carbon.harvest(params),\n retire: async (params) => handlers.carbon.retire(params),\n }\n : undefined,\n // Entity (domain) ownership service (IXO-2696). The consumer exposes a\n // fully-formed `handlers.entity` service group; the transfer is user-signed\n // inside the consumer handler (resolve recipient + IID guard + broadcast) —\n // we only forward the call here.\n entity: handlers?.entity?.transfer\n ? {\n transfer: async (params) => handlers.entity.transfer(params),\n }\n : undefined,\n // KYC verification service (qi/kyc.verify). The consumer exposes the five\n // flat kyc* handlers (all-or-nothing group); wire each method straight\n // through. The consumer handler owns the KYC-server calls, PII handling,\n // and saveCredential idempotency — we only forward calls here.\n kyc:\n handlers?.kycLoadForm && handlers?.kycInitiate && handlers?.kycGetVerificationUrl && handlers?.kycGetStatus && handlers?.kycSaveCredential\n ? {\n loadForm: async (params) => handlers.kycLoadForm(params),\n initiate: async (params) => handlers.kycInitiate(params),\n getVerificationUrl: async (params) => handlers.kycGetVerificationUrl(params),\n getStatus: async (params) => handlers.kycGetStatus(params),\n saveCredential: async (params) => handlers.kycSaveCredential(params),\n }\n : undefined,\n };\n}\n","import type { Doc as YDoc, Map as YMap } from 'yjs';\n\nexport type XeroWorkKind = 'invoice.create' | 'payment.create';\n/**\n * `approved` is the human gate for oracle-managed settlement: a `pending`\n * payment item is only a review card until the flow owner approves it; the\n * flow-manager contractor picks up `approved` items exclusively.\n */\nexport type XeroWorkStatus = 'pending' | 'approved' | 'failed' | 'completed' | 'cancelled';\n\nexport interface XeroWorkAttempt {\n at: number;\n byDid?: string;\n payload: Record<string, any>;\n error?: string;\n result?: Record<string, any>;\n}\n\nexport interface XeroWorkSource {\n claimId: string;\n evaluationBlockId: string;\n deedDid: string;\n collectionId: string;\n invoiceWorkItemId?: string;\n}\n\nexport interface XeroWorkProvenance {\n createdAt: number;\n createdByDid?: string;\n templateBlockId: string;\n templateInputsSnapshot?: unknown;\n evaluationOutput?: Record<string, any>;\n claimSnapshot?: Record<string, any>;\n}\n\nexport interface XeroWorkItem {\n id: string;\n kind: XeroWorkKind;\n status: XeroWorkStatus;\n assignedBlockId: string;\n idempotencyKey: string;\n source: XeroWorkSource;\n originalPayload: Record<string, any>;\n reviewPayload: Record<string, any>;\n submittedPayload?: Record<string, any>;\n provenance: XeroWorkProvenance;\n attempts: XeroWorkAttempt[];\n result?: Record<string, any>;\n error?: { message: string; at: number };\n approvedAt?: number;\n approvedByDid?: string;\n completedAt?: number;\n completedByDid?: string;\n}\n\nexport const XERO_WORK_ITEMS_MAP_NAME = 'xeroWorkItems';\nexport const XERO_WORK_TERMINAL_MAP_NAME = 'xeroWorkItemsTerminal';\n\n/**\n * Write-once record of a completed work item, stored under its own key in a\n * separate Y.Map. This is what makes \"completed is never downgraded\" a\n * *distributed* invariant rather than a local guard: each item lives in the\n * base map as one plain object, so two disconnected peers concurrently\n * writing `completed` and `failed` merge last-writer-wins on the whole value\n * — the losing write is erased and no local status check ever runs. A key\n * that only completion writes (and nothing deletes) cannot lose a merge, so\n * the success survives regardless of Yjs tie-breaking; readers overlay it\n * over whatever the base object says. Concurrent duplicate completions are\n * interchangeable records of the same fact — LWW keeping either is correct.\n */\nexport interface XeroWorkTerminalRecord {\n itemId: string;\n reviewPayload?: Record<string, any>;\n submittedPayload?: Record<string, any>;\n result?: Record<string, any>;\n completedAt: number;\n completedByDid?: string;\n}\n\nexport type XeroWorkItemFilter = { kind?: XeroWorkKind; assignedBlockId?: string; statuses?: XeroWorkStatus[] };\n\n/**\n * Resolve the work-items map from a raw Y.Doc. Flow-manager (and any other\n * consumer holding the doc rather than an editor instance) goes through this.\n */\nexport function getXeroWorkItemsMap(doc: YDoc): YMap<XeroWorkItem> {\n return doc.getMap<XeroWorkItem>(XERO_WORK_ITEMS_MAP_NAME);\n}\n\n/** Resolve the terminal-records map from a raw Y.Doc. */\nexport function getXeroWorkTerminalMap(doc: YDoc): YMap<XeroWorkTerminalRecord> {\n return doc.getMap<XeroWorkTerminalRecord>(XERO_WORK_TERMINAL_MAP_NAME);\n}\n\n/** The terminal map sharing a doc with the given items map (null when the map is unintegrated). */\nfunction terminalMapFor(map: YMap<XeroWorkItem> | null | undefined): YMap<XeroWorkTerminalRecord> | null {\n return map?.doc ? getXeroWorkTerminalMap(map.doc) : null;\n}\n\n/**\n * Effective view of an item: a terminal record outranks whatever the base\n * object says — status is decided by the highest-ranking status ever\n * recorded, not by whichever peer's write happened to win the CRDT merge.\n */\nfunction resolveItem(terminal: YMap<XeroWorkTerminalRecord> | null, item: XeroWorkItem): XeroWorkItem {\n const record = terminal?.get(item.id);\n if (!record || item.status === 'completed') return item;\n return {\n ...item,\n status: 'completed',\n error: undefined,\n ...(record.reviewPayload !== undefined ? { reviewPayload: record.reviewPayload } : {}),\n ...(record.submittedPayload !== undefined ? { submittedPayload: record.submittedPayload } : {}),\n ...(record.result !== undefined ? { result: record.result } : {}),\n completedAt: record.completedAt,\n ...(record.completedByDid !== undefined ? { completedByDid: record.completedByDid } : {}),\n };\n}\n\n/** Mint the write-once terminal record for a completed item (an existing record wins). */\nfunction ensureTerminalRecord(terminal: YMap<XeroWorkTerminalRecord> | null, item: XeroWorkItem): void {\n if (!terminal || terminal.get(item.id)) return;\n terminal.set(item.id, {\n itemId: item.id,\n ...(item.reviewPayload !== undefined ? { reviewPayload: item.reviewPayload } : {}),\n ...(item.submittedPayload !== undefined ? { submittedPayload: item.submittedPayload } : {}),\n ...(item.result !== undefined ? { result: item.result } : {}),\n completedAt: item.completedAt ?? Date.now(),\n ...(item.completedByDid !== undefined ? { completedByDid: item.completedByDid } : {}),\n });\n}\n\nfunction getEditorXeroWorkItemsMap(editor?: any): YMap<XeroWorkItem> | null {\n return (editor?._yXeroWorkItems as YMap<XeroWorkItem> | undefined) || null;\n}\n\nfunction readMapItems(map: YMap<XeroWorkItem> | null | undefined): XeroWorkItem[] {\n if (!map) return [];\n const terminal = terminalMapFor(map);\n const items: XeroWorkItem[] = [];\n map.forEach((value) => {\n if (value && typeof value === 'object' && 'id' in value) {\n items.push(resolveItem(terminal, { ...(value as XeroWorkItem) }));\n }\n });\n return items;\n}\n\n/**\n * Completed-item merge guard — the single implementation shared by every\n * writer (editor-instance and doc-level alike). A `completed` item is\n * immutable: merging anything into it returns it unchanged. This is the\n * ordered-local-writes half of the invariant; the terminal-record overlay\n * (`resolveItem`) is the half that survives concurrent peers merging.\n */\nfunction mergeItem(existing: XeroWorkItem, next: XeroWorkItem): XeroWorkItem {\n if (existing.status === 'completed') {\n return existing;\n }\n\n return {\n ...existing,\n ...next,\n id: existing.id,\n // A re-upsert (e.g. a replayed receipt re-creating the payment item as\n // `pending`) must never revoke a human approval already recorded.\n status: existing.status === 'approved' && next.status === 'pending' ? existing.status : next.status,\n attempts: existing.attempts ?? [],\n originalPayload: existing.originalPayload,\n submittedPayload: existing.submittedPayload,\n result: existing.result,\n approvedAt: existing.approvedAt,\n approvedByDid: existing.approvedByDid,\n completedAt: existing.completedAt,\n completedByDid: existing.completedByDid,\n };\n}\n\n// ── Idempotency keys (§4.1) ─────────────────────────────────────\n// One invoice work item per approved claim per evaluation block. Re-approving\n// the same claim re-upserts the same key; `mergeItem` protects completed items.\n\nexport function buildXeroInvoiceWorkKey(params: { flowId: string; evaluationBlockId: string; claimId: string }): string {\n return ['xero', 'invoice.create', params.flowId, params.evaluationBlockId, params.claimId].join(':');\n}\n\nexport function buildXeroPaymentWorkKey(params: { flowId: string; evaluationBlockId: string; claimId: string; invoiceWorkItemId: string }): string {\n return ['xero', 'payment.create', params.flowId, params.evaluationBlockId, params.claimId, params.invoiceWorkItemId].join(':');\n}\n\n// ── Doc-level helpers — operate on the Y.Map directly ───────────\n// Flow-manager holds a raw Y.Doc (`getXeroWorkItemsMap(doc)`), not an editor\n// instance. These are the canonical implementations; the `...ForEditor`\n// variants below delegate here so the merge guard exists exactly once.\n\nexport function findXeroWorkItems(map: YMap<XeroWorkItem> | null | undefined, filter: XeroWorkItemFilter = {}): XeroWorkItem[] {\n return readMapItems(map).filter((item) => {\n if (filter.kind && item.kind !== filter.kind) return false;\n if (filter.assignedBlockId && item.assignedBlockId !== filter.assignedBlockId) return false;\n if (filter.statuses && !filter.statuses.includes(item.status)) return false;\n return true;\n });\n}\n\n/**\n * Idempotencykey-deduped upsert. An existing item with the same\n * `idempotencyKey` is merged (never resurrecting a `completed` item);\n * otherwise the item is stored as given.\n */\nexport function upsertXeroWorkItem(map: YMap<XeroWorkItem> | null | undefined, next: XeroWorkItem): XeroWorkItem {\n if (!map) {\n return next;\n }\n\n const terminal = terminalMapFor(map);\n let existing: XeroWorkItem | undefined;\n map.forEach((item) => {\n if (item?.idempotencyKey === next.idempotencyKey) existing = item;\n });\n\n const stored = existing ? mergeItem(resolveItem(terminal, existing), next) : next;\n const write = () => {\n map.set(stored.id, stored);\n // An upsert carrying `completed` (e.g. a replayed receipt) must mint the\n // merge-proof record too, not just the clobberable base object.\n if (stored.status === 'completed') ensureTerminalRecord(terminal, stored);\n };\n if (map.doc) map.doc.transact(write);\n else write();\n return stored;\n}\n\nexport function updateXeroWorkReviewPayload(map: YMap<XeroWorkItem> | null | undefined, itemId: string, reviewPayload: Record<string, any>): XeroWorkItem | null {\n if (!map) return null;\n const raw = map.get(itemId);\n if (!raw) return null;\n const item = resolveItem(terminalMapFor(map), raw);\n if (item.status === 'completed') return item;\n const updatedItem = { ...item, reviewPayload };\n map.set(itemId, updatedItem);\n return updatedItem;\n}\n\n/**\n * Record a failed attempt and flip the item to `failed`. Refuses to downgrade\n * a `completed` item — a late/duplicate failure receipt must never erase a\n * recorded success.\n */\nexport function markXeroWorkFailed(\n map: YMap<XeroWorkItem> | null | undefined,\n itemId: string,\n params: { byDid?: string; payload: Record<string, any>; error: string; at?: number }\n): XeroWorkItem | null {\n if (!map) return null;\n const raw = map.get(itemId);\n if (!raw) return null;\n const item = resolveItem(terminalMapFor(map), raw);\n if (item.status === 'completed') return item;\n const at = params.at ?? Date.now();\n const updatedItem: XeroWorkItem = {\n ...item,\n status: 'failed',\n reviewPayload: params.payload,\n error: { message: params.error, at },\n attempts: [...(item.attempts ?? []), { at, byDid: params.byDid, payload: params.payload, error: params.error }],\n };\n map.set(itemId, updatedItem);\n return updatedItem;\n}\n\n/**\n * Record the human approval and flip the item to `approved` — the gate the\n * flow-manager contractor requires before contracting the settlement oracle.\n * Approvable from `pending` (first review) or `failed` (human retry after\n * attempt exhaustion). Idempotent on `approved`; refuses `completed` and\n * `cancelled` items.\n */\nexport function markXeroWorkApproved(map: YMap<XeroWorkItem> | null | undefined, itemId: string, params: { byDid?: string; at?: number }): XeroWorkItem | null {\n if (!map) return null;\n const raw = map.get(itemId);\n if (!raw) return null;\n const item = resolveItem(terminalMapFor(map), raw);\n if (item.status === 'approved' || item.status === 'completed' || item.status === 'cancelled') return item;\n const at = params.at ?? Date.now();\n const updatedItem: XeroWorkItem = {\n ...item,\n status: 'approved',\n error: undefined,\n approvedAt: at,\n approvedByDid: params.byDid,\n };\n map.set(itemId, updatedItem);\n return updatedItem;\n}\n\n/**\n * Record a successful attempt and flip the item to `completed`. Idempotent:\n * an already-completed item is returned unchanged — the first recorded result\n * wins and is never overwritten. Alongside the base object, a write-once\n * terminal record is minted under its own key, so the success survives a\n * concurrent conflicting write from a disconnected peer (see\n * `XeroWorkTerminalRecord`).\n */\nexport function markXeroWorkCompleted(\n map: YMap<XeroWorkItem> | null | undefined,\n itemId: string,\n params: { byDid?: string; payload: Record<string, any>; result: Record<string, any>; at?: number }\n): XeroWorkItem | null {\n if (!map) return null;\n const raw = map.get(itemId);\n if (!raw) return null;\n const terminal = terminalMapFor(map);\n const item = resolveItem(terminal, raw);\n if (item.status === 'completed') return item;\n const at = params.at ?? Date.now();\n const updatedItem: XeroWorkItem = {\n ...item,\n status: 'completed',\n reviewPayload: params.payload,\n submittedPayload: params.payload,\n result: params.result,\n error: undefined,\n completedAt: at,\n completedByDid: params.byDid,\n attempts: [...(item.attempts ?? []), { at, byDid: params.byDid, payload: params.payload, result: params.result }],\n };\n const write = () => {\n map.set(itemId, updatedItem);\n ensureTerminalRecord(terminal, updatedItem);\n };\n if (map.doc) map.doc.transact(write);\n else write();\n return updatedItem;\n}\n\n// ── Editor-instance helpers — thin delegates ────────────────────\n\nexport function findXeroWorkItemsForEditor(editor: any, filter: XeroWorkItemFilter): XeroWorkItem[] {\n return findXeroWorkItems(getEditorXeroWorkItemsMap(editor), filter);\n}\n\nexport function upsertXeroWorkItemForEditor(editor: any, next: XeroWorkItem): XeroWorkItem {\n return upsertXeroWorkItem(getEditorXeroWorkItemsMap(editor), next);\n}\n\nexport function updateXeroWorkReviewPayloadForEditor(editor: any, itemId: string, reviewPayload: Record<string, any>): XeroWorkItem | null {\n return updateXeroWorkReviewPayload(getEditorXeroWorkItemsMap(editor), itemId, reviewPayload);\n}\n\nexport function markXeroWorkApprovedForEditor(editor: any, itemId: string, params: { byDid?: string; at?: number }): XeroWorkItem | null {\n return markXeroWorkApproved(getEditorXeroWorkItemsMap(editor), itemId, params);\n}\n\nexport function markXeroWorkFailedForEditor(\n editor: any,\n itemId: string,\n params: { byDid?: string; payload: Record<string, any>; error: string; at?: number }\n): XeroWorkItem | null {\n return markXeroWorkFailed(getEditorXeroWorkItemsMap(editor), itemId, params);\n}\n\nexport function markXeroWorkCompletedForEditor(\n editor: any,\n itemId: string,\n params: { byDid?: string; payload: Record<string, any>; result: Record<string, any>; at?: number }\n): XeroWorkItem | null {\n return markXeroWorkCompleted(getEditorXeroWorkItemsMap(editor), itemId, params);\n}\n","import * as Y from 'yjs';\nimport type { Doc as YDoc, Map as YMap } from 'yjs';\n\n/**\n * Top-level Y.Doc map holding the integrations a flow needs, keyed by toolkit\n * slug. This is template *configuration* — \"this flow talks to Xero, and needs\n * an organisation and a bank account picked before it can run\" — so it is NOT\n * cleared by `clearRuntimeForTemplateClone` (`flowEngine/runtime.ts`), exactly\n * like the participant roster: a clone that lost its requirements would come up\n * looking ready while every integration call has nowhere to go.\n */\nexport const FLOW_CONNECTIONS_MAP_KEY = 'qi.flow.connections';\n\n/**\n * Top-level Y.Doc map holding the concrete account/organisation/bank selections\n * made for *this* flow, keyed by toolkit slug.\n *\n * Bindings are execution state, not configuration: they name one workspace's\n * connected account. `clearRuntimeForTemplateClone` therefore clears this map —\n * a template cloned out of a live flow must not carry another entity's Xero\n * account into a room whose members were never granted access to it.\n */\nexport const FLOW_CONNECTION_BINDINGS_MAP_KEY = 'qi.flow.connectionBindings';\n\n/** Sub-selections a toolkit needs before it counts as satisfied. */\nexport type FlowConnectionRequirementKey = 'org' | 'bankAccount';\n\nconst REQUIREMENT_KEYS: readonly FlowConnectionRequirementKey[] = ['org', 'bankAccount'];\n\nexport type FlowConnection = {\n /** Toolkit slug, e.g. `'xero'`. Also the map key — one entry per toolkit. */\n toolkit: string;\n label?: string;\n /** Absent/false = required. True = the flow may start without it. */\n optional?: boolean;\n requires: FlowConnectionRequirementKey[];\n /** Epoch ms. Supplied by the caller — this module never calls `Date.now()`. */\n addedAt?: number;\n};\n\nexport type FlowConnectionBinding = {\n /** Toolkit slug, e.g. `'xero'`. Also the map key — one entry per toolkit. */\n toolkit: string;\n connectedAccountId: string;\n /** Entity the connection belongs to — guards template-copy across workspaces. */\n entityDid: string;\n /** Xero organisation (tenant). */\n tenantId?: string;\n /** Xero chart-of-accounts UUID for the bank/treasury account. */\n bankAccountId?: string;\n /** Epoch ms. Supplied by the caller — this module never calls `Date.now()`. */\n boundAt?: number;\n boundByDid?: string;\n};\n\n/**\n * Read the connections a flow requires.\n *\n * Normalizes defensively rather than trusting the map: this is read against a\n * live, replicated doc, so an entry can be observed mid-sync, written by an older\n * client, or malformed outright. Anything that is not a `Y.Map` carrying a\n * non-empty `toolkit` is skipped, and a read never throws.\n *\n * Order is stable across peers — `addedAt` ascending with unstamped entries last,\n * tie-broken by `toolkit` — so a rendered list does not reshuffle on every sync.\n */\nexport function readFlowConnections(yDoc: YDoc): FlowConnection[] {\n const connections: FlowConnection[] = [];\n getConnectionsMap(yDoc).forEach((value) => {\n const connection = toConnection(value);\n if (connection) connections.push(connection);\n });\n\n return connections.sort((a, b) => {\n const aAt = a.addedAt ?? Number.POSITIVE_INFINITY;\n const bAt = b.addedAt ?? Number.POSITIVE_INFINITY;\n if (aAt !== bAt) return aAt < bAt ? -1 : 1;\n return compareKeys(a.toolkit, b.toolkit);\n });\n}\n\n/**\n * Add a connection, or merge into the existing entry for the same `toolkit`.\n *\n * `addedAt` is write-once: an existing stamp is preserved so a later edit (a\n * label refresh, a requirement change) cannot reorder the list. `requires` is\n * part of the connection's identity as a requirement and is always written —\n * pass the full list. `optional` and the optional string fields are merged —\n * omit one to leave it as it is, pass `''` (or `false`) to clear it.\n */\nexport function upsertFlowConnection(yDoc: YDoc, connection: FlowConnection): void {\n const toolkit = connection.toolkit;\n if (typeof toolkit !== 'string' || toolkit.length === 0) return;\n\n yDoc.transact(() => {\n const entry = ensureEntry(getConnectionsMap(yDoc), toolkit);\n entry.set('toolkit', toolkit);\n entry.set('requires', toRequirementKeys(connection.requires));\n mergeOptionalString(entry, 'label', connection.label);\n mergeOptionalFlag(entry, 'optional', connection.optional);\n\n const addedAt = toTimestamp(entry.get('addedAt')) ?? toTimestamp(connection.addedAt);\n if (addedAt !== undefined) entry.set('addedAt', addedAt);\n });\n}\n\n/** Remove a connection. No-op when the flow has no entry for `toolkit`. */\nexport function removeFlowConnection(yDoc: YDoc, toolkit: string): void {\n yDoc.transact(() => {\n const map = getConnectionsMap(yDoc);\n if (map.has(toolkit)) map.delete(toolkit);\n });\n}\n\n/**\n * Mark an existing connection optional or required. No-op when the flow has no\n * entry for `toolkit` — a flag alone carries no identity, so creating an entry\n * from one would invent a requirement nobody declared.\n */\nexport function setFlowConnectionOptional(yDoc: YDoc, toolkit: string, optional: boolean): void {\n yDoc.transact(() => {\n const entry = getConnectionsMap(yDoc).get(toolkit);\n if (entry instanceof Y.Map) mergeOptionalFlag(entry, 'optional', optional);\n });\n}\n\n/**\n * Replace an existing connection's sub-selection requirements. No-op when the\n * flow has no entry for `toolkit`, for the same reason as\n * {@link setFlowConnectionOptional}.\n */\nexport function setFlowConnectionRequires(yDoc: YDoc, toolkit: string, requires: FlowConnectionRequirementKey[]): void {\n yDoc.transact(() => {\n const entry = getConnectionsMap(yDoc).get(toolkit);\n if (entry instanceof Y.Map) entry.set('requires', toRequirementKeys(requires));\n });\n}\n\n/**\n * Read the concrete connection bindings for this flow.\n *\n * Normalized as defensively as {@link readFlowConnections}: an entry is skipped\n * unless it carries the three fields that make a binding usable — `toolkit`,\n * `connectedAccountId` and `entityDid`. A half-written binding is not a binding\n * to a different account, it is no binding at all.\n *\n * Order is stable across peers — `boundAt` ascending with unstamped entries last,\n * tie-broken by `toolkit`.\n */\nexport function readFlowConnectionBindings(yDoc: YDoc): FlowConnectionBinding[] {\n const bindings: FlowConnectionBinding[] = [];\n getBindingsMap(yDoc).forEach((value) => {\n const binding = toBinding(value);\n if (binding) bindings.push(binding);\n });\n\n return bindings.sort((a, b) => {\n const aAt = a.boundAt ?? Number.POSITIVE_INFINITY;\n const bAt = b.boundAt ?? Number.POSITIVE_INFINITY;\n if (aAt !== bAt) return aAt < bAt ? -1 : 1;\n return compareKeys(a.toolkit, b.toolkit);\n });\n}\n\n/**\n * Bind a toolkit to a connected account, or merge into the existing binding for\n * the same `toolkit`.\n *\n * `boundAt` is write-once, so re-picking an organisation does not reorder the\n * list. Optional string fields are merged — omit one to leave it as it is, pass\n * `''` to clear it. Ignored unless `toolkit`, `connectedAccountId` and\n * `entityDid` are all present: those three are what a binding *is*.\n */\nexport function upsertFlowConnectionBinding(yDoc: YDoc, binding: FlowConnectionBinding): void {\n const toolkit = toNonEmptyString(binding.toolkit);\n const connectedAccountId = toNonEmptyString(binding.connectedAccountId);\n const entityDid = toNonEmptyString(binding.entityDid);\n if (toolkit === undefined || connectedAccountId === undefined || entityDid === undefined) return;\n\n yDoc.transact(() => {\n const entry = ensureEntry(getBindingsMap(yDoc), toolkit);\n entry.set('toolkit', toolkit);\n entry.set('connectedAccountId', connectedAccountId);\n entry.set('entityDid', entityDid);\n mergeOptionalString(entry, 'tenantId', binding.tenantId);\n mergeOptionalString(entry, 'bankAccountId', binding.bankAccountId);\n mergeOptionalString(entry, 'boundByDid', binding.boundByDid);\n\n const boundAt = toTimestamp(entry.get('boundAt')) ?? toTimestamp(binding.boundAt);\n if (boundAt !== undefined) entry.set('boundAt', boundAt);\n });\n}\n\n/** Remove a binding. No-op when the flow has no binding for `toolkit`. */\nexport function removeFlowConnectionBinding(yDoc: YDoc, toolkit: string): void {\n yDoc.transact(() => {\n const map = getBindingsMap(yDoc);\n if (map.has(toolkit)) map.delete(toolkit);\n });\n}\n\n// ─── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction getConnectionsMap(yDoc: YDoc): YMap<unknown> {\n return yDoc.getMap<unknown>(FLOW_CONNECTIONS_MAP_KEY);\n}\n\nfunction getBindingsMap(yDoc: YDoc): YMap<unknown> {\n return yDoc.getMap<unknown>(FLOW_CONNECTION_BINDINGS_MAP_KEY);\n}\n\n/** The entry for `toolkit`, replacing any malformed (non-`Y.Map`) value in place. */\nfunction ensureEntry(map: YMap<unknown>, toolkit: string): YMap<unknown> {\n const existing = map.get(toolkit);\n if (existing instanceof Y.Map) return existing;\n const created = new Y.Map<unknown>();\n map.set(toolkit, created);\n return created;\n}\n\nfunction toConnection(value: unknown): FlowConnection | undefined {\n if (!(value instanceof Y.Map)) return undefined;\n\n const toolkit = value.get('toolkit');\n if (typeof toolkit !== 'string' || toolkit.length === 0) return undefined;\n\n const connection: FlowConnection = { toolkit, requires: toRequirementKeys(value.get('requires')) };\n\n const label = toNonEmptyString(value.get('label'));\n if (label !== undefined) connection.label = label;\n\n if (value.get('optional') === true) connection.optional = true;\n\n const addedAt = toTimestamp(value.get('addedAt'));\n if (addedAt !== undefined) connection.addedAt = addedAt;\n\n return connection;\n}\n\nfunction toBinding(value: unknown): FlowConnectionBinding | undefined {\n if (!(value instanceof Y.Map)) return undefined;\n\n const toolkit = toNonEmptyString(value.get('toolkit'));\n const connectedAccountId = toNonEmptyString(value.get('connectedAccountId'));\n const entityDid = toNonEmptyString(value.get('entityDid'));\n if (toolkit === undefined || connectedAccountId === undefined || entityDid === undefined) return undefined;\n\n const binding: FlowConnectionBinding = { toolkit, connectedAccountId, entityDid };\n\n const tenantId = toNonEmptyString(value.get('tenantId'));\n if (tenantId !== undefined) binding.tenantId = tenantId;\n\n const bankAccountId = toNonEmptyString(value.get('bankAccountId'));\n if (bankAccountId !== undefined) binding.bankAccountId = bankAccountId;\n\n const boundAt = toTimestamp(value.get('boundAt'));\n if (boundAt !== undefined) binding.boundAt = boundAt;\n\n const boundByDid = toNonEmptyString(value.get('boundByDid'));\n if (boundByDid !== undefined) binding.boundByDid = boundByDid;\n\n return binding;\n}\n\n/**\n * Keeps only the requirement keys this version understands, de-duplicated, in\n * the caller's order. An unknown key from a newer client is dropped rather than\n * carried through: a requirement nobody can satisfy would block the flow\n * forever.\n */\nfunction toRequirementKeys(value: unknown): FlowConnectionRequirementKey[] {\n if (!Array.isArray(value)) return [];\n const keys: FlowConnectionRequirementKey[] = [];\n for (const entry of value) {\n if (!isRequirementKey(entry)) continue;\n if (!keys.includes(entry)) keys.push(entry);\n }\n return keys;\n}\n\nfunction isRequirementKey(value: unknown): value is FlowConnectionRequirementKey {\n return typeof value === 'string' && (REQUIREMENT_KEYS as readonly string[]).includes(value);\n}\n\nfunction toTimestamp(value: unknown): number | undefined {\n const numeric = typeof value === 'string' ? Number(value) : value;\n return typeof numeric === 'number' && Number.isFinite(numeric) ? Math.trunc(numeric) : undefined;\n}\n\nfunction toNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction mergeOptionalString(entry: YMap<unknown>, key: string, value: string | undefined): void {\n if (value === undefined) return;\n if (value.length === 0) entry.delete(key);\n else entry.set(key, value);\n}\n\n/** `false` is the default, so it is stored as absence rather than as `false`. */\nfunction mergeOptionalFlag(entry: YMap<unknown>, key: string, value: boolean | undefined): void {\n if (value === undefined) return;\n if (value) entry.set(key, true);\n else entry.delete(key);\n}\n\nfunction compareKeys(a: string, b: string): number {\n if (a === b) return 0;\n return a < b ? -1 : 1;\n}\n","import type { Doc as YDoc } from 'yjs';\n\nimport { readFlowConnectionBindings, type FlowConnectionBinding } from '@/core/lib/flowCompiler/connections';\n\nexport const XERO_TOOLKIT = 'xero';\n\n/**\n * The Xero account, organisation and bank account this flow acts through.\n *\n * Flow-level, not block-level: the binding is chosen once in the flow's\n * Connections and is a prerequisite of starting a session, so by the time any\n * action runs it is already there. Blocks therefore no longer carry their own\n * connection or bank-account pin — two payment blocks in one flow debiting two\n * different accounts was never a real case, and a per-block pin could disagree\n * with the account the actors were actually granted.\n *\n * Reads defensively and never throws: the doc is live and replicated, so this\n * can be called mid-sync.\n */\nexport function readFlowXeroBinding(yDoc?: YDoc | null): FlowConnectionBinding | undefined {\n if (!yDoc) return undefined;\n try {\n return readFlowConnectionBindings(yDoc).find((binding) => binding.toolkit === XERO_TOOLKIT);\n } catch {\n return undefined;\n }\n}\n\n/** Same, from an editor (or anything carrying `_yDoc`). */\nexport function readFlowXeroBindingFromEditor(editor: { _yDoc?: YDoc } | null | undefined): FlowConnectionBinding | undefined {\n return readFlowXeroBinding(editor?._yDoc);\n}\n","import type { DiffResolver, ActionNarrativeProps } from './diffTypes';\nimport { resolveActionType } from './registry';\n\nexport interface DiffResolverRegistration {\n resolver: DiffResolver;\n NarrativeComponent?: React.ComponentType<ActionNarrativeProps>;\n}\n\nconst diffResolvers = new Map<string, DiffResolverRegistration>();\n\nexport function registerDiffResolver(actionType: string, reg: DiffResolverRegistration): void {\n diffResolvers.set(resolveActionType(actionType), reg);\n}\n\nexport function getDiffResolver(actionType: string): DiffResolverRegistration | undefined {\n return diffResolvers.get(resolveActionType(actionType));\n}\n\nexport function hasDiffResolver(actionType: string): boolean {\n return diffResolvers.has(resolveActionType(actionType));\n}\n","import { registerAction, doneWhenCompleted } from '../../registry';\n\n/**\n * @description AI-assisted intent capture that queries the Domain Indexer for matching\n * Blueprint candidates. Returns a ranked list of blueprint DIDs with metadata.\n * @flowStep 1 — Define Purpose\n * @paramsSchema { agentMessage: string, userMessage: string }\n */\nregisterAction({\n type: 'qi/pod.domain-indexer-lookup',\n can: 'pod/domain-indexer-lookup',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: [],\n properties: {\n userMessage: { type: 'string', description: 'The user-provided purpose text used to query the Domain Indexer.' },\n purposeDescription: { type: 'string', description: 'Fallback purpose text used when userMessage is absent.' },\n },\n },\n\n outputSchema: [\n { path: 'purposeDescription', displayName: 'Purpose Description', type: 'string', description: 'The user-provided purpose text' },\n { path: 'blueprintCandidates', displayName: 'Blueprint Candidates', type: 'array', description: 'Ranked array of matching blueprint DIDs and metadata' },\n ],\n\n // Mirrors run(): either userMessage or purposeDescription satisfies the\n // purpose-text requirement, reported under the primary name.\n getMissingInputs: (inputs) => (String(inputs.userMessage || inputs.purposeDescription || '').trim() ? [] : ['userMessage']),\n\n run: async (inputs) => {\n const purposeDescription = String(inputs.userMessage || inputs.purposeDescription || '').trim();\n if (!purposeDescription) throw new Error('userMessage is required');\n\n // Stub: return placeholder until real Domain Indexer is wired\n return {\n output: {\n purposeDescription,\n blueprintCandidates: [],\n },\n };\n },\n});\n","const DID_PATTERN = /\\bdid:[a-z0-9]+:[A-Za-z0-9._:%-]+/i;\n\nexport function extractDid(value: unknown): string {\n const raw = String(value || '').trim();\n if (!raw) return '';\n const match = raw.match(DID_PATTERN);\n return match?.[0] || '';\n}\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { extractDid } from '@/core/lib/did';\n\n/**\n * @description Single-select a Blueprint (protocol entity) from a filtered list.\n * The selected blueprint DID is carried forward to all subsequent POD setup steps.\n * @flowStep 2 — Select Blueprint\n * @paramsSchema { filter: string }\n */\nregisterAction({\n type: 'qi/pod.domain-single-selection',\n can: 'pod/domain-single-selection',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: ['selectedBlueprintDid'],\n properties: {\n selectedBlueprintDid: { type: 'string', description: 'DID of the blueprint to select.' },\n selectedBlueprintName: { type: 'string', description: 'Display name of the selected blueprint.' },\n selectedBlueprintDescription: { type: 'string', description: 'Description of the selected blueprint.' },\n },\n },\n\n outputSchema: [\n { path: 'selectedBlueprintDid', displayName: 'Selected Blueprint DID', type: 'string', description: 'DID of the selected blueprint' },\n { path: 'selectedBlueprintName', displayName: 'Selected Blueprint Name', type: 'string', description: 'Display name of the selected blueprint' },\n { path: 'selectedBlueprintDescription', displayName: 'Selected Blueprint Description', type: 'string', description: 'Description of the selected blueprint' },\n { path: 'context', displayName: 'Entity Context', type: 'array', description: 'Entity context entries derived from the selected blueprint' },\n ],\n\n events: [\n {\n name: 'selected',\n displayName: 'Blueprint Selected',\n description: 'Fires when a blueprint is selected for the POD.',\n payloadSchema: [\n { path: 'selectedBlueprintDid', displayName: 'Selected Blueprint DID', type: 'string', description: 'DID of the selected blueprint' },\n { path: 'selectedBlueprintName', displayName: 'Selected Blueprint Name', type: 'string', description: 'Display name of the selected blueprint' },\n { path: 'selectedBlueprintDescription', displayName: 'Selected Blueprint Description', type: 'string', description: 'Description of the selected blueprint' },\n { path: 'context', displayName: 'Entity Context', type: 'array', description: 'Entity context entries for createDomain, including class = selected blueprint DID' },\n ],\n pendingDisplayFields: ['selectedBlueprintName', 'selectedBlueprintDid'],\n },\n ],\n\n run: async (inputs) => {\n const selectedBlueprintDid = extractDid(inputs.selectedBlueprintDid);\n if (!selectedBlueprintDid) throw new Error('selectedBlueprintDid is required');\n const selectedBlueprintName = String(inputs.selectedBlueprintName || '').trim();\n const selectedBlueprintDescription = String(inputs.selectedBlueprintDescription || '').trim();\n const context = [{ key: 'class', val: selectedBlueprintDid }];\n const output = {\n selectedBlueprintDid,\n selectedBlueprintName,\n selectedBlueprintDescription,\n context,\n };\n\n return {\n output,\n events: [{ name: 'selected', payload: output }],\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { isBlankInputValue } from '../../inputRequirements';\n\n/**\n * @description Lists IXO entities where the current user holds a specified role (e.g. controller).\n * Optional step — the user may skip to leave parentDID as null.\n * @flowStep 3A — Parent Organisation (optional)\n * @paramsSchema { did: string, role: string }\n */\nregisterAction({\n type: 'qi/pod.entity-single-selection',\n can: 'pod/entity-single-selection',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: [],\n properties: {\n skipped: { type: 'boolean', description: 'True to skip selecting a parent entity, leaving parentDID null.' },\n selectedEntityDid: { type: 'string', description: 'DID of the selected parent entity; required when not skipping.' },\n selectedEntityName: { type: 'string', description: 'Display name of the selected parent entity.' },\n selectedEntityType: { type: 'string', description: 'Entity type of the selected parent entity.' },\n },\n },\n\n outputSchema: [\n { path: 'selectedEntityDid', displayName: 'Selected Entity DID', type: 'string', description: 'DID of the selected parent entity, or null if skipped' },\n { path: 'selectedEntityName', displayName: 'Selected Entity Name', type: 'string', description: 'Display name of the selected parent entity' },\n { path: 'selectedEntityType', displayName: 'Selected Entity Type', type: 'string', description: 'Entity type of the selected parent entity' },\n { path: 'skipped', displayName: 'Skipped', type: 'boolean', description: 'True if the user skipped this step' },\n ],\n\n events: [\n {\n name: 'selected',\n displayName: 'Entity Selected',\n description: 'Fires when a parent DAO or POD is selected.',\n payloadSchema: [\n { path: 'selectedEntityDid', displayName: 'Selected Entity DID', type: 'string', description: 'DID of the selected parent entity' },\n { path: 'selectedEntityName', displayName: 'Selected Entity Name', type: 'string', description: 'Display name of the selected parent entity' },\n { path: 'selectedEntityType', displayName: 'Selected Entity Type', type: 'string', description: 'Entity type of the selected parent entity' },\n { path: 'skipped', displayName: 'Skipped', type: 'boolean', description: 'False when a parent entity was selected' },\n ],\n pendingDisplayFields: ['selectedEntityName', 'selectedEntityDid'],\n },\n ],\n\n // Mirrors run(): a truthy `skipped` waives the selection entirely.\n getMissingInputs: (inputs) => (inputs.skipped ? [] : isBlankInputValue(inputs.selectedEntityDid) ? ['selectedEntityDid'] : []),\n\n run: async (inputs) => {\n const skipped = !!inputs.skipped;\n if (skipped) {\n const output = { selectedEntityDid: null, selectedEntityName: '', selectedEntityType: '', skipped: true };\n return { output, events: [] };\n }\n\n const selectedEntityDid = String(inputs.selectedEntityDid || '').trim();\n if (!selectedEntityDid) throw new Error('selectedEntityDid is required when not skipping');\n\n const selectedEntityType = String(inputs.selectedEntityType || '').trim();\n const output = {\n selectedEntityDid,\n selectedEntityName: String(inputs.selectedEntityName || '').trim(),\n selectedEntityType,\n skipped: false,\n };\n\n return {\n output,\n events: [{ name: 'selected', payload: output }],\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { isBlankInputValue } from '../../inputRequirements';\n\ntype GroupType = 'categorical' | 'multisig' | 'nftStaking' | 'tokenStaking';\n\n/**\n * @description Configure POD membership. Behaviour depends on the governance group type\n * selected in the previous step:\n * - categorical: members with role + votingPower (weight-based)\n * - multisig: signatories + absolute threshold count (no voting power)\n * - nftStaking: NFT contract address (no explicit member list)\n * - tokenStaking: token config — existing address or new token params (no explicit member list)\n *\n * @flowStep 5 — Membership\n * @inputsFrom orchestrator: { groupType: 'categorical' | 'multisig' | 'nftStaking' | 'tokenStaking' }\n */\nregisterAction({\n type: 'qi/pod.member-multi-select',\n can: 'pod/member-multi-select',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: [],\n properties: {\n groupType: { type: 'string', description: 'Governance group type that determines which member fields apply; defaults to categorical.' },\n members: { type: 'array', description: 'Array of { did, role, votingPower } members; required for categorical and multisig groups.' },\n multisigThreshold: { type: 'number', description: 'Minimum number of signers required; used for multisig groups.' },\n nftContractAddress: { type: 'string', description: 'NFT staking contract address; required for nftStaking groups.' },\n tokenConfig: { type: 'object', description: 'Token configuration; required for tokenStaking groups.' },\n },\n },\n\n outputSchema: [\n { path: 'members', displayName: 'Members', type: 'array', description: 'Array of { did, role, votingPower } — categorical/multisig only' },\n { path: 'multisigThreshold', displayName: 'Multisig Threshold', type: 'number', description: 'Minimum signers required — multisig only' },\n { path: 'nftContractAddress', displayName: 'NFT Contract Address', type: 'string', description: 'NFT staking contract address — nftStaking only' },\n { path: 'tokenConfig', displayName: 'Token Config', type: 'object', description: 'Token configuration — tokenStaking only' },\n ],\n\n events: [\n {\n name: 'configured',\n displayName: 'Members Configured',\n description: 'Fires when membership configuration is complete.',\n payloadSchema: [\n {\n path: 'memberConfig',\n displayName: 'Member Config',\n type: 'object',\n description: 'Full member configuration (members, multisigThreshold, nftContractAddress, or tokenConfig depending on group type)',\n },\n ],\n pendingDisplayFields: ['memberConfig.memberCount'],\n },\n ],\n\n // Mirrors run(), including its default: an absent groupType is treated as\n // 'categorical', not as a missing input.\n getMissingInputs: (inputs) => {\n const groupType = String(inputs.groupType || '').trim() || 'categorical';\n\n if (groupType === 'nftStaking') {\n return String(inputs.nftContractAddress || '').trim() ? [] : ['nftContractAddress'];\n }\n\n if (groupType === 'tokenStaking') {\n const tokenConfig = inputs.tokenConfig as Record<string, unknown> | undefined;\n if (!tokenConfig || typeof tokenConfig !== 'object') return ['tokenConfig'];\n if (tokenConfig.isExistingToken) {\n return String(tokenConfig.tokenAddress || '').trim() ? [] : ['tokenConfig.tokenAddress'];\n }\n const missing: string[] = [];\n if (!String(tokenConfig.tokenName || '').trim()) missing.push('tokenConfig.tokenName');\n if (!String(tokenConfig.tokenSymbol || '').trim()) missing.push('tokenConfig.tokenSymbol');\n if (isBlankInputValue(tokenConfig.tokenSupply)) missing.push('tokenConfig.tokenSupply');\n return missing;\n }\n\n // categorical and multisig both require a member list\n const missing: string[] = [];\n if (!Array.isArray(inputs.members) || inputs.members.length === 0) missing.push('members');\n if (groupType === 'multisig' && isBlankInputValue(inputs.multisigThreshold)) missing.push('multisigThreshold');\n return missing;\n },\n\n run: async (inputs) => {\n const groupType: GroupType = (inputs.groupType as GroupType) || 'categorical';\n\n if (groupType === 'nftStaking') {\n const addr = String(inputs.nftContractAddress || '').trim();\n if (!addr) throw new Error('NFT contract address is required for nftStaking groups');\n return {\n output: { nftContractAddress: addr },\n events: [{ name: 'configured', payload: { memberConfig: { nftContractAddress: addr, memberCount: 0 } } }],\n };\n }\n\n if (groupType === 'tokenStaking') {\n const tokenConfig = inputs.tokenConfig as Record<string, any>;\n if (!tokenConfig) throw new Error('tokenConfig is required for tokenStaking groups');\n if (tokenConfig.isExistingToken) {\n if (!String(tokenConfig.tokenAddress || '').trim()) throw new Error('Token contract address is required');\n } else {\n if (!String(tokenConfig.tokenName || '').trim()) throw new Error('Token name is required');\n if (!String(tokenConfig.tokenSymbol || '').trim()) throw new Error('Token symbol is required');\n const supply = Number(tokenConfig.tokenSupply);\n if (isNaN(supply) || supply <= 0) throw new Error('Token supply must be a positive number');\n }\n return {\n output: { tokenConfig },\n events: [{ name: 'configured', payload: { memberConfig: { tokenConfig, memberCount: 0 } } }],\n };\n }\n\n // categorical and multisig both require a member list\n const members = Array.isArray(inputs.members) ? inputs.members : [];\n if (members.length === 0) throw new Error('At least one member is required');\n\n const dids = members.map((m: any) => String(m.did || ''));\n const uniqueDids = new Set(dids);\n if (uniqueDids.size !== dids.length) throw new Error('Duplicate member DIDs are not allowed');\n\n if (groupType === 'multisig') {\n const threshold = Number(inputs.multisigThreshold);\n if (!Number.isInteger(threshold) || threshold < 1) throw new Error('Multisig threshold must be a positive integer');\n if (threshold > members.length) throw new Error(`Threshold (${threshold}) cannot exceed member count (${members.length})`);\n return {\n output: { members, multisigThreshold: threshold },\n events: [{ name: 'configured', payload: { memberConfig: { members, multisigThreshold: threshold, memberCount: members.length } } }],\n };\n }\n\n // categorical\n const hasAdmin = members.some((m: any) => String(m.role || '').toLowerCase() === 'admin');\n if (!hasAdmin) throw new Error('At least one member must have the Admin role');\n\n for (const m of members) {\n const vp = Number(m.votingPower);\n if (!Number.isInteger(vp) || vp <= 0) throw new Error(`Voting power must be a positive integer (got ${m.votingPower} for ${m.did})`);\n }\n\n return {\n output: { members },\n events: [{ name: 'configured', payload: { memberConfig: { members, memberCount: members.length } } }],\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\n\ntype GroupType = 'categorical' | 'multisig' | 'nftStaking' | 'tokenStaking';\n\nconst VALID_GROUP_TYPES: GroupType[] = ['categorical', 'multisig', 'nftStaking', 'tokenStaking'];\n\n/**\n * @description Configure the governance group type and Cosmos group DecisionPolicy.\n * The groupType determines which validation rules apply and what member\n * configuration is collected in the next step.\n *\n * @flowStep 4 — Governance\n */\nregisterAction({\n type: 'qi/pod.governance-config',\n can: 'pod/governance-config',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: ['groupName', 'groupType', 'governance'],\n properties: {\n groupName: { type: 'string', description: 'Human-readable name for the governance group.' },\n groupType: { type: 'string', description: 'Governance group type: categorical, multisig, nftStaking, or tokenStaking.' },\n governance: { type: 'object', description: 'Cosmos group decision policy parameters; must include votingPeriod.' },\n },\n },\n\n outputSchema: [\n { path: 'groupName', displayName: 'Group Name', type: 'string', description: 'Human-readable name for the governance group' },\n { path: 'groupType', displayName: 'Group Type', type: 'string', description: 'Governance group type (categorical | multisig | nftStaking | tokenStaking)' },\n { path: 'governance', displayName: 'Governance Settings', type: 'object', description: 'Cosmos group decision policy parameters' },\n ],\n\n events: [\n {\n name: 'configured',\n displayName: 'Governance Configured',\n description: 'Fires when governance group type and decision policy are configured.',\n payloadSchema: [\n { path: 'governanceConfig.groupName', displayName: 'Group Name', type: 'string' },\n { path: 'governanceConfig.groupType', displayName: 'Group Type', type: 'string' },\n { path: 'governanceConfig.governance', displayName: 'Governance Settings', type: 'object' },\n ],\n pendingDisplayFields: ['governanceConfig.groupName', 'governanceConfig.groupType'],\n },\n ],\n\n // Mirrors run()'s presence preamble: base fields always, then the decision\n // policy fields the selected groupType demands. Value validity (quorum and\n // threshold ranges, veto sum) stays in run().\n getMissingInputs: (inputs) => {\n const missing: string[] = [];\n if (!String(inputs.groupName || '').trim()) missing.push('groupName');\n const groupType = String(inputs.groupType || '').trim();\n if (!groupType) missing.push('groupType');\n\n const governance = inputs.governance as Record<string, unknown> | undefined;\n if (!governance || typeof governance !== 'object') {\n missing.push('governance', 'governance.votingPeriod');\n return missing;\n }\n if (!governance.votingPeriod) missing.push('governance.votingPeriod');\n\n if (!groupType) return missing;\n if (groupType === 'multisig') {\n if (!String(governance.threshold ?? '').trim()) missing.push('governance.threshold');\n } else {\n if (governance.quorum == null || String(governance.quorum).trim() === '') missing.push('governance.quorum');\n if (governance.threshold == null || String(governance.threshold).trim() === '') missing.push('governance.threshold');\n }\n return missing;\n },\n\n run: async (inputs) => {\n const groupName = String(inputs.groupName || '').trim();\n if (!groupName) throw new Error('groupName is required');\n\n const groupType = inputs.groupType as GroupType;\n if (!groupType || !VALID_GROUP_TYPES.includes(groupType)) {\n throw new Error(`groupType must be one of: ${VALID_GROUP_TYPES.join(', ')}`);\n }\n\n const governance = inputs.governance as Record<string, any>;\n if (!governance) throw new Error('governance settings are required');\n if (!governance.votingPeriod) throw new Error('votingPeriod is required');\n\n if (groupType === 'multisig') {\n const raw = String(governance.threshold ?? '').trim();\n const threshold = Number(raw);\n if (!raw || !Number.isFinite(threshold) || !Number.isInteger(threshold) || threshold < 1) {\n throw new Error('multisig threshold must be a positive integer');\n }\n } else {\n const quorum = parseFloat(governance.quorum);\n if (isNaN(quorum) || quorum <= 0 || quorum > 1) throw new Error('quorum must be between 0 and 1 (e.g. 0.33)');\n const threshold = parseFloat(governance.threshold);\n if (isNaN(threshold) || threshold <= 0 || threshold > 1) throw new Error('threshold must be between 0 and 1 (e.g. 0.51)');\n const vetoThreshold = parseFloat(governance.vetoThreshold);\n if (!isNaN(vetoThreshold) && vetoThreshold + threshold > 1) {\n throw new Error('threshold + vetoThreshold cannot exceed 1.0');\n }\n }\n\n return {\n output: { groupName, groupType, governance },\n events: [{ name: 'configured', payload: { governanceConfig: { groupName, groupType, governance } } }],\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\n\ntype SelectedProtocolTemplate = {\n protocolDid: string;\n protocolName: string;\n sourceRoomId: string;\n sourceLabel: string;\n path?: string;\n};\n\nfunction normalizeSelectedTemplates(value: unknown): SelectedProtocolTemplate[] {\n if (!Array.isArray(value)) return [];\n\n return value\n .map((item) => {\n if (!item || typeof item !== 'object') return null;\n const raw = item as Record<string, unknown>;\n const protocolDid = String(raw.protocolDid || '').trim();\n const sourceRoomId = String(raw.sourceRoomId || '').trim();\n if (!protocolDid || !sourceRoomId) return null;\n\n const sourceLabel = String(raw.sourceLabel || raw.label || sourceRoomId).trim();\n return {\n protocolDid,\n protocolName: String(raw.protocolName || protocolDid).trim(),\n sourceRoomId,\n sourceLabel,\n ...(raw.path ? { path: String(raw.path) } : {}),\n };\n })\n .filter((item): item is SelectedProtocolTemplate => item !== null);\n}\n\n/**\n * @description Lists protocol deeds and their Matrix flow templates.\n * Multi-select across deeds. The selected templates are carried forward so\n * POD creation can import them after the POD entity and flows space exist.\n * @flowStep 3D - Flow Templates\n * @paramsSchema { entity?: string, domainFlowsSubspaceId?: string }\n */\nregisterAction({\n type: 'qi/pod.list-domain-flows',\n can: 'pod/list-domain-flows',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: [],\n properties: {\n selectedProtocolTemplates: { type: 'array', description: 'Selected protocol templates, each with protocolDid and sourceRoomId; empty selection is valid.' },\n selectedFlowDids: { type: 'array', description: 'Source Matrix room IDs for selected templates; used as a fallback when no templates are selected.' },\n },\n },\n\n outputSchema: [\n {\n path: 'selectedProtocolTemplates',\n displayName: 'Selected Protocol Templates',\n type: 'array',\n description: 'Selected protocol templates with protocol DID and source room ID',\n },\n { path: 'selectedFlowDids', displayName: 'Selected Flow Room IDs', type: 'array', description: 'Source Matrix room IDs for selected templates' },\n { path: 'flowTemplateConfig', displayName: 'Flow Template Config', type: 'object', description: 'Event payload consumed by POD signing/import steps' },\n ],\n\n events: [\n {\n name: 'selected',\n displayName: 'Flow Templates Selected',\n description: 'Fires when the flow template selection is confirmed, including an empty selection.',\n payloadSchema: [\n {\n path: 'flowTemplateConfig',\n displayName: 'Flow Template Config',\n type: 'object',\n description: 'Selected templates grouped by their protocol DID for later import',\n },\n {\n path: 'selectedProtocolTemplates',\n displayName: 'Selected Protocol Templates',\n type: 'array',\n description: 'Selected protocol templates with protocol DID and source room ID',\n },\n {\n path: 'selectedFlowDids',\n displayName: 'Selected Flow Room IDs',\n type: 'array',\n description: 'Source Matrix room IDs for selected templates',\n },\n ],\n pendingDisplayFields: ['flowTemplateConfig.templateCount', 'flowTemplateConfig.protocolCount'],\n },\n ],\n\n run: async (inputs) => {\n // Zero templates selected is valid. It means \"create the POD without imported flow templates\".\n const selectedProtocolTemplates = normalizeSelectedTemplates(inputs.selectedProtocolTemplates);\n const selectedFlowDids =\n selectedProtocolTemplates.length > 0\n ? selectedProtocolTemplates.map((template) => template.sourceRoomId)\n : Array.isArray(inputs.selectedFlowDids)\n ? inputs.selectedFlowDids\n : [];\n\n const protocolCount = new Set(selectedProtocolTemplates.map((template) => template.protocolDid)).size;\n const flowTemplateConfig = {\n selectedTemplates: selectedProtocolTemplates,\n templateCount: selectedProtocolTemplates.length,\n protocolCount,\n };\n\n return {\n output: { selectedProtocolTemplates, selectedFlowDids, flowTemplateConfig },\n events: [\n {\n name: 'selected',\n payload: {\n flowTemplateConfig,\n selectedProtocolTemplates,\n selectedFlowDids,\n },\n },\n ],\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\nimport type { ActionContext, ActionResult, OutputSchemaField } from '../types';\n\ntype BlueprintActionSpec = {\n type: string;\n can: string;\n sideEffect: boolean;\n confirmation: boolean;\n required: string[];\n properties: Record<string, { type: string; description: string }>;\n};\n\nconst OUTPUT_SCHEMA: OutputSchemaField[] = [\n {\n path: 'receiptRef',\n displayName: 'Runtime receipt',\n type: 'string',\n description: 'Immutable Blueprint Runtime reference proving the governed operation completed.',\n },\n {\n path: 'result',\n displayName: 'Result',\n type: 'object',\n description: 'The governed Blueprint Runtime result.',\n },\n];\n\nconst WORKSPACE_ID = {\n type: 'string',\n description: 'Opaque Blueprint workspace reference supplied by Portal.',\n};\n\nconst ACTIONS: BlueprintActionSpec[] = [\n {\n type: 'qi/blueprint.workspace-start',\n can: 'blueprint/workspace-start',\n sideEffect: true,\n confirmation: true,\n required: ['name'],\n properties: {\n name: {\n type: 'string',\n description: 'Plain-language name for the professional Service POD.',\n },\n },\n },\n {\n type: 'qi/blueprint.journey-resume',\n can: 'blueprint/journey-resume',\n sideEffect: false,\n confirmation: false,\n required: ['workspaceId'],\n properties: { workspaceId: WORKSPACE_ID },\n },\n {\n type: 'qi/blueprint.guided-authoring',\n can: 'blueprint/guided-authoring',\n sideEffect: false,\n confirmation: false,\n required: ['workspaceId', 'phase'],\n properties: {\n workspaceId: WORKSPACE_ID,\n phase: {\n type: 'string',\n description: 'The current product phase: discovery, design, validation, testing, or deployment.',\n },\n },\n },\n {\n type: 'qi/blueprint.artifact-preview',\n can: 'blueprint/artifact-preview',\n sideEffect: false,\n confirmation: false,\n required: ['workspaceId', 'stage', 'content'],\n properties: {\n workspaceId: WORKSPACE_ID,\n stage: {\n type: 'string',\n description: 'Internal Blueprint control receiving the draft.',\n },\n content: {\n type: 'object',\n description: 'Draft artifact content to validate without saving.',\n },\n },\n },\n {\n type: 'qi/blueprint.artifact-save',\n can: 'blueprint/artifact-save',\n sideEffect: true,\n confirmation: true,\n required: ['workspaceId', 'stage', 'content'],\n properties: {\n workspaceId: WORKSPACE_ID,\n stage: {\n type: 'string',\n description: 'Internal Blueprint control receiving the approved draft.',\n },\n content: {\n type: 'object',\n description: 'User-confirmed artifact content to save.',\n },\n },\n },\n {\n type: 'qi/blueprint.checklist-update',\n can: 'blueprint/checklist-update',\n sideEffect: true,\n confirmation: true,\n required: ['workspaceId', 'operation'],\n properties: {\n workspaceId: WORKSPACE_ID,\n operation: {\n type: 'string',\n description: 'Add, accept for later, or resolve a checklist item.',\n },\n item: {\n type: 'object',\n description: 'Checklist proposal or disposition selected by the user.',\n },\n },\n },\n {\n type: 'qi/blueprint.phase-confirm',\n can: 'blueprint/phase-confirm',\n sideEffect: true,\n confirmation: true,\n required: ['workspaceId', 'phase'],\n properties: {\n workspaceId: WORKSPACE_ID,\n phase: {\n type: 'string',\n description: 'Discovery, design, validation, testing, or deployment.',\n },\n },\n },\n {\n type: 'qi/blueprint.reviewer-assign',\n can: 'blueprint/reviewer-assign',\n sideEffect: true,\n confirmation: true,\n required: ['workspaceId'],\n properties: {\n workspaceId: WORKSPACE_ID,\n reviewer: {\n type: 'object',\n description: 'Portal-selected independent reviewer or IXO-supported review request.',\n },\n },\n },\n {\n type: 'qi/blueprint.review-submit',\n can: 'blueprint/review-submit',\n sideEffect: true,\n confirmation: true,\n required: ['workspaceId'],\n properties: { workspaceId: WORKSPACE_ID },\n },\n {\n type: 'qi/blueprint.review-respond',\n can: 'blueprint/review-respond',\n sideEffect: true,\n confirmation: true,\n required: ['workspaceId', 'response'],\n properties: {\n workspaceId: WORKSPACE_ID,\n response: {\n type: 'object',\n description: 'Reviewer decision or provider response bound to the complete revision set.',\n },\n },\n },\n {\n type: 'qi/blueprint.release-compile',\n can: 'blueprint/release-compile',\n sideEffect: true,\n confirmation: true,\n required: ['workspaceId'],\n properties: { workspaceId: WORKSPACE_ID },\n },\n {\n type: 'qi/blueprint.publish',\n can: 'blueprint/publish',\n sideEffect: true,\n confirmation: true,\n required: ['workspaceId', 'releaseRef', 'network'],\n properties: {\n workspaceId: WORKSPACE_ID,\n releaseRef: {\n type: 'string',\n description: 'Exact approved release to publish.',\n },\n network: {\n type: 'string',\n description: 'Target IXO network selected by the user.',\n },\n },\n },\n];\n\nfunction requireInputs(inputs: Record<string, unknown>, required: string[]): void {\n for (const field of required) {\n const value = inputs[field];\n if (value === undefined || value === null || (typeof value === 'string' && value.trim().length === 0)) {\n throw new Error(`${field} is required`);\n }\n }\n}\n\nasync function executeBlueprintAction(spec: BlueprintActionSpec, inputs: Record<string, unknown>, ctx: ActionContext): Promise<ActionResult> {\n requireInputs(inputs, spec.required);\n const execute = ctx.services.blueprint?.execute;\n if (!execute) {\n throw new Error(`${spec.type} handler not available`);\n }\n const response = await execute({\n action: spec.type,\n inputs,\n actorDid: ctx.actorDid,\n flowId: ctx.flowId,\n nodeId: ctx.nodeId,\n });\n if (!response.receiptRef) {\n throw new Error(`${spec.type} returned no Blueprint Runtime receipt`);\n }\n return {\n output: {\n receiptRef: response.receiptRef,\n result: response.result ?? {},\n },\n };\n}\n\nfor (const spec of ACTIONS) {\n registerAction({\n type: spec.type,\n can: spec.can,\n sideEffect: spec.sideEffect,\n defaultRequiresConfirmation: spec.confirmation,\n proof: { fields: ['receiptRef'] },\n done: doneWhenCompleted,\n inputSchema: {\n type: 'object',\n required: spec.required,\n properties: spec.properties,\n },\n outputSchema: OUTPUT_SCHEMA,\n run: async (inputs, ctx) => executeBlueprintAction(spec, inputs, ctx),\n });\n}\n","import { registerAction, doneWhenCompleted } from '../../registry';\n\n/**\n * @description Create an on-chain governance proposal that changes the\n * membership of a DAO DAO group: add members, remove members, or change a\n * member's voting power. All three map onto a single cw4 `update_members`\n * message wrapped as a DAO proposal `UpdateMembers` action — cw4 upserts by\n * address, so re-adding an existing address with a new weight changes it and\n * a `remove` entry drops it.\n *\n * First of the `qi/governance.*` action family. Flow-panel reference:\n * `MembershipComposerStep` in impacts-x-web's PodSim FlowStepActionPane.\n *\n * @inputs\n * - coreAddress: DAO core contract address. TODO(governance): when empty in\n * flow mode, derive the current entity's governance group core address\n * (getEntityDid → getDAOGroups) instead of requiring it in template config.\n * - operation: 'add' | 'remove' | 'update-weight'\n * - members: Array<{ address: string; weight?: number }>\n * - title / description: optional; sensible defaults derived per operation.\n */\n\ntype GovernanceMemberOperation = 'add' | 'remove' | 'update-weight';\n\nconst VALID_OPERATIONS: GovernanceMemberOperation[] = ['add', 'remove', 'update-weight'];\n\ninterface RawMember {\n address?: string;\n addr?: string;\n weight?: number | string;\n}\n\nfunction defaultTitle(operation: GovernanceMemberOperation, count: number): string {\n const noun = count === 1 ? 'member' : 'members';\n switch (operation) {\n case 'add':\n return `Add ${count} ${noun}`;\n case 'remove':\n return `Remove ${count} ${noun}`;\n case 'update-weight':\n return `Update voting power for ${count} ${noun}`;\n }\n}\n\nregisterAction({\n type: 'qi/governance.member-proposal',\n can: 'governance/member-proposal',\n sideEffect: true,\n proof: { fields: ['proposalId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n\n outputSchema: [\n { path: 'proposalId', displayName: 'Proposal ID', type: 'string', description: 'The on-chain proposal identifier' },\n { path: 'proposalTitle', displayName: 'Proposal Title', type: 'string', description: 'The proposal name voters see on-chain' },\n { path: 'proposalDescription', displayName: 'Proposal Description', type: 'string', description: 'The long-form description voters see on-chain' },\n { path: 'status', displayName: 'Proposal Status', type: 'string', description: 'Current proposal status (open, passed, rejected, executed, etc.)' },\n { path: 'proposalContractAddress', displayName: 'Proposal Contract Address', type: 'string', description: 'The proposal module contract address' },\n { path: 'coreAddress', displayName: 'Core Address', type: 'string', description: 'The DAO core contract address' },\n { path: 'operation', displayName: 'Operation', type: 'string', description: 'add | remove | update-weight' },\n { path: 'createdAt', displayName: 'Created At', type: 'string', description: 'ISO timestamp of proposal creation' },\n ],\n\n // Mirrors run()'s throw-preamble (there is no inputSchema to declare\n // requiredness on): coreAddress, operation and a non-empty members list.\n getMissingInputs: (inputs) => {\n const missing: string[] = [];\n if (!String(inputs.coreAddress || '').trim()) missing.push('coreAddress');\n if (!String(inputs.operation || '').trim()) missing.push('operation');\n if (!Array.isArray(inputs.members) || inputs.members.length === 0) missing.push('members');\n return missing;\n },\n run: async (inputs, ctx) => {\n const handlers = ctx.handlers;\n if (!handlers) {\n throw new Error('Handlers not available');\n }\n if (!handlers.getPreProposalContractAddress || !handlers.getGroupContractAddress || !handlers.getProposalContractAddress || !handlers.createProposal) {\n throw new Error('Governance proposal handlers not available');\n }\n\n const coreAddress = String(inputs.coreAddress || '').trim();\n // TODO(governance): when coreAddress is empty in flow mode, resolve the\n // current entity's governance group core address rather than throwing.\n if (!coreAddress) throw new Error('coreAddress is required');\n\n const operation = String(inputs.operation || '').trim() as GovernanceMemberOperation;\n if (!VALID_OPERATIONS.includes(operation)) {\n throw new Error(`operation must be one of: ${VALID_OPERATIONS.join(', ')}`);\n }\n\n const rawMembers: RawMember[] = Array.isArray(inputs.members) ? inputs.members : [];\n if (rawMembers.length === 0) throw new Error('At least one member is required');\n\n const normalized = rawMembers.map((m) => ({\n addr: String(m.address || m.addr || '').trim(),\n weight: Number(m.weight ?? 0),\n }));\n if (normalized.some((m) => !m.addr)) throw new Error('Every member needs an address');\n\n const addrs = normalized.map((m) => m.addr);\n if (new Set(addrs).size !== addrs.length) throw new Error('Duplicate member addresses are not allowed');\n\n // cw4 update_members upserts by address:\n // add / update-weight → { addr, weight } entries (existing addr + new weight = change)\n // remove → { addr } entries\n let add: Array<{ addr: string; weight: number }> = [];\n let remove: Array<{ addr: string }> = [];\n\n if (operation === 'remove') {\n remove = normalized.map((m) => ({ addr: m.addr }));\n } else {\n if (normalized.some((m) => !Number.isFinite(m.weight) || m.weight <= 0)) {\n throw new Error('Voting power must be a positive number');\n }\n add = normalized.map((m) => ({ addr: m.addr, weight: Math.trunc(m.weight) }));\n }\n\n const title = String(inputs.title || '').trim() || defaultTitle(operation, normalized.length);\n const description = String(inputs.description || '').trim() || title;\n\n const updateMembersAction = { type: 'UpdateMembers', data: { add, remove } };\n\n const { preProposalContractAddress } = await handlers.getPreProposalContractAddress({ coreAddress });\n const { groupContractAddress } = await handlers.getGroupContractAddress({ coreAddress });\n const { proposalContractAddress } = await handlers.getProposalContractAddress({ coreAddress });\n\n const proposalId = await handlers.createProposal({\n preProposalContractAddress,\n title,\n description,\n actions: [updateMembersAction],\n coreAddress,\n groupContractAddress,\n });\n\n // Proof guard: a proposal id is the contract that the consumer must return\n // when the proposal was actually broadcast. No id → treat as a failure.\n if (proposalId === undefined || proposalId === null || String(proposalId).trim() === '') {\n throw new Error('Proposal creation returned no proposal id. Check the handler logs.');\n }\n\n return {\n output: {\n proposalId: String(proposalId),\n proposalTitle: title,\n proposalDescription: description,\n status: 'open',\n proposalContractAddress: proposalContractAddress || '',\n coreAddress,\n operation,\n createdAt: new Date().toISOString(),\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\n\n/**\n * @description Create an on-chain governance proposal that updates a DAO DAO\n * POD's voting rules: voting period, quorum, pass threshold, and whether\n * members may change their vote while voting is open.\n * Maps onto a single `UpdateVotingConfig` proposal action — once the proposal\n * passes, the voting module's config is replaced.\n *\n * Second of the `qi/governance.*` action family. Flow-panel reference:\n * `GovernanceComposerStep` in impacts-x-web's PodSim FlowStepActionPane.\n *\n * @inputs\n * - coreAddress: DAO core contract address. TODO(governance): when empty in\n * flow mode, derive the current entity's governance group core address.\n * - votingPeriodHours: voting window in hours.\n * - quorumPercent / thresholdPercent: 0–100.\n * - allowRevoting: boolean.\n * - title / description: optional; sensible defaults.\n *\n * A veto threshold is intentionally not an input: the deployed\n * dao_proposal_single contract has no veto config, so one can never reach\n * the chain. Any `vetoThresholdPercent` supplied by older templates is\n * ignored.\n */\n\nfunction clampPercent(value: unknown, label: string, { allowZero = false } = {}): number {\n const n = Number(value);\n if (!Number.isFinite(n)) throw new Error(`${label} must be a number`);\n if (n < 0 || n > 100) throw new Error(`${label} must be between 0 and 100`);\n if (!allowZero && n <= 0) throw new Error(`${label} must be greater than 0`);\n return n;\n}\n\nregisterAction({\n type: 'qi/governance.settings-proposal',\n can: 'governance/settings-proposal',\n sideEffect: true,\n proof: { fields: ['proposalId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n\n outputSchema: [\n { path: 'proposalId', displayName: 'Proposal ID', type: 'string', description: 'The on-chain proposal identifier' },\n { path: 'proposalTitle', displayName: 'Proposal Title', type: 'string', description: 'The proposal name voters see on-chain' },\n { path: 'proposalDescription', displayName: 'Proposal Description', type: 'string', description: 'The long-form description voters see on-chain' },\n { path: 'status', displayName: 'Proposal Status', type: 'string', description: 'Current proposal status (open, passed, rejected, executed, etc.)' },\n { path: 'proposalContractAddress', displayName: 'Proposal Contract Address', type: 'string', description: 'The proposal module contract address' },\n { path: 'coreAddress', displayName: 'Core Address', type: 'string', description: 'The DAO core contract address' },\n { path: 'createdAt', displayName: 'Created At', type: 'string', description: 'ISO timestamp of proposal creation' },\n ],\n\n // Mirrors run()'s throw-preamble (there is no inputSchema to declare\n // requiredness on): coreAddress and the three numeric voting settings.\n getMissingInputs: (inputs) => {\n const missing: string[] = [];\n if (!String(inputs.coreAddress || '').trim()) missing.push('coreAddress');\n for (const name of ['votingPeriodHours', 'quorumPercent', 'thresholdPercent']) {\n const value = inputs[name];\n if (value === undefined || value === null || String(value).trim() === '') missing.push(name);\n }\n return missing;\n },\n run: async (inputs, ctx) => {\n const handlers = ctx.handlers;\n if (!handlers) {\n throw new Error('Handlers not available');\n }\n if (!handlers.getPreProposalContractAddress || !handlers.getGroupContractAddress || !handlers.getProposalContractAddress || !handlers.createProposal) {\n throw new Error('Governance proposal handlers not available');\n }\n\n const coreAddress = String(inputs.coreAddress || '').trim();\n // TODO(governance): when coreAddress is empty in flow mode, resolve the\n // current entity's governance group core address rather than throwing.\n if (!coreAddress) throw new Error('coreAddress is required');\n\n const votingPeriodHours = Number(inputs.votingPeriodHours);\n if (!Number.isFinite(votingPeriodHours) || votingPeriodHours <= 0) {\n throw new Error('votingPeriodHours must be a positive number');\n }\n\n const quorumPercent = clampPercent(inputs.quorumPercent, 'quorumPercent', { allowZero: true });\n const thresholdPercent = clampPercent(inputs.thresholdPercent, 'thresholdPercent');\n\n const allowRevoting = Boolean(inputs.allowRevoting);\n\n const data = {\n // Group creation instantiates the proposal module with\n // only_members_execute: true — preserve that policy on updates.\n onlyMembersExecute: true,\n thresholdType: '%' as const,\n thresholdPercentage: thresholdPercent,\n quorumEnabled: quorumPercent > 0,\n quorumType: '%' as const,\n quorumPercentage: quorumPercent,\n proposalDuration: Math.trunc(votingPeriodHours),\n proposalDurationUnits: 'hours' as const,\n allowRevoting,\n };\n\n const updateVotingConfigAction = { type: 'UpdateVotingConfig', data };\n\n const title = String(inputs.title || '').trim() || 'Update governance settings';\n const description = String(inputs.description || '').trim() || \"Updates the POD's voting rules once the proposal passes.\";\n\n const { preProposalContractAddress } = await handlers.getPreProposalContractAddress({ coreAddress });\n const { groupContractAddress } = await handlers.getGroupContractAddress({ coreAddress });\n const { proposalContractAddress } = await handlers.getProposalContractAddress({ coreAddress });\n\n const proposalId = await handlers.createProposal({\n preProposalContractAddress,\n title,\n description,\n actions: [updateVotingConfigAction],\n coreAddress,\n groupContractAddress,\n });\n\n // Proof guard: a proposal id is the contract the consumer must return when\n // the proposal was actually broadcast. No id → treat as a failure.\n if (proposalId === undefined || proposalId === null || String(proposalId).trim() === '') {\n throw new Error('Proposal creation returned no proposal id. Check the handler logs.');\n }\n\n return {\n output: {\n proposalId: String(proposalId),\n proposalTitle: title,\n proposalDescription: description,\n status: 'open',\n proposalContractAddress: proposalContractAddress || '',\n coreAddress,\n createdAt: new Date().toISOString(),\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport type { OutputSchemaField } from '../../types';\n\n/**\n * A DAO DAO proposal action in the legacy `{ type, data }` shape that the\n * consumer's `transformActionsToMsgs` converts into on-chain messages. Every\n * `qi/governance.*` proposal action emits these, so the editor never builds\n * cosmos messages itself and existing consumers (ixo-portal,\n * impacts-x-webapp) need no changes to support a new block.\n */\nexport interface LegacyProposalAction {\n type: string;\n data: Record<string, any>;\n}\n\n/**\n * Spec for one `qi/governance.*` proposal-creating action. The registered\n * action shares the whole create-proposal lifecycle (handler checks, core\n * address, title/description, proof guard, standard outputs) — the spec only\n * contributes input validation and the legacy proposal action(s) to wrap.\n */\nexport interface GovernanceProposalActionSpec {\n /** Action type, e.g. `qi/governance.nft.burn`. */\n type: string;\n /** UCAN-style ability string, e.g. `governance.nft/burn`. */\n can: string;\n /**\n * Validate inputs and build the legacy DAO DAO proposal action(s) this\n * proposal executes when passed. Throw with a clear message on invalid\n * input — the flow engine surfaces it as a failed run.\n */\n buildActions: (inputs: Record<string, any>) => LegacyProposalAction[];\n /** Fallback proposal title for templates authored before the name field existed. */\n defaultTitle: (inputs: Record<string, any>) => string;\n /** Fallback long-form description. Defaults to the title when omitted. */\n defaultDescription?: (inputs: Record<string, any>) => string;\n /** Extra action-specific fields copied into the runtime output. */\n buildExtraOutput?: (inputs: Record<string, any>) => Record<string, string>;\n /** Schema entries for the fields `buildExtraOutput` adds. */\n extraOutputSchema?: OutputSchemaField[];\n}\n\nconst STANDARD_OUTPUT_SCHEMA: OutputSchemaField[] = [\n { path: 'proposalId', displayName: 'Proposal ID', type: 'string', description: 'The on-chain proposal identifier' },\n { path: 'proposalTitle', displayName: 'Proposal Title', type: 'string', description: 'The proposal name voters see on-chain' },\n { path: 'proposalDescription', displayName: 'Proposal Description', type: 'string', description: 'The long-form description voters see on-chain' },\n { path: 'status', displayName: 'Proposal Status', type: 'string', description: 'Current proposal status (open, passed, rejected, executed, etc.)' },\n { path: 'proposalContractAddress', displayName: 'Proposal Contract Address', type: 'string', description: 'The proposal module contract address' },\n { path: 'coreAddress', displayName: 'Core Address', type: 'string', description: 'The DAO core contract address' },\n { path: 'createdAt', displayName: 'Created At', type: 'string', description: 'ISO timestamp of proposal creation' },\n];\n\n/**\n * Register a `qi/governance.*` action that creates an on-chain DAO DAO\n * proposal. Mirrors the hand-rolled member/settings/send-funds actions:\n * the consumer's `createProposal` handler broadcasts the proposal against the\n * group's pre-propose module, and the returned proposal id is the proof of\n * execution.\n *\n * Common inputs every registered action accepts:\n * - coreAddress: DAO core contract address (required; the flow detail\n * resolves it from the current entity when the template leaves it blank).\n * - title / description: the proposal name and long-form description shown\n * to voters. Stored on-chain in the proposal itself, so anyone voting can\n * read what the proposal does. Falls back to the spec's defaults for\n * templates authored before these fields existed.\n */\nexport function registerGovernanceProposalAction(spec: GovernanceProposalActionSpec): void {\n registerAction({\n type: spec.type,\n can: spec.can,\n sideEffect: true,\n proof: { fields: ['proposalId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n\n outputSchema: [...STANDARD_OUTPUT_SCHEMA, ...(spec.extraOutputSchema || [])],\n\n run: async (inputs, ctx) => {\n const handlers = ctx.handlers;\n if (!handlers) {\n throw new Error('Handlers not available');\n }\n if (!handlers.getPreProposalContractAddress || !handlers.getGroupContractAddress || !handlers.getProposalContractAddress || !handlers.createProposal) {\n throw new Error('Governance proposal handlers not available');\n }\n\n const coreAddress = String(inputs.coreAddress || '').trim();\n if (!coreAddress) throw new Error('coreAddress is required');\n\n const actions = spec.buildActions(inputs);\n if (!actions.length) throw new Error('The proposal must contain at least one action');\n\n const title = String(inputs.title || '').trim() || spec.defaultTitle(inputs);\n const description = String(inputs.description || '').trim() || (spec.defaultDescription ? spec.defaultDescription(inputs) : title);\n\n const { preProposalContractAddress } = await handlers.getPreProposalContractAddress({ coreAddress });\n const { groupContractAddress } = await handlers.getGroupContractAddress({ coreAddress });\n const { proposalContractAddress } = await handlers.getProposalContractAddress({ coreAddress });\n\n const proposalId = await handlers.createProposal({\n preProposalContractAddress,\n title,\n description,\n actions,\n coreAddress,\n groupContractAddress,\n });\n\n // Proof guard: a proposal id is the contract the consumer must return\n // when the proposal was actually broadcast. No id → treat as a failure.\n if (proposalId === undefined || proposalId === null || String(proposalId).trim() === '') {\n throw new Error('Proposal creation returned no proposal id. Check the handler logs.');\n }\n\n return {\n output: {\n proposalId: String(proposalId),\n proposalTitle: title,\n proposalDescription: description,\n status: 'open',\n proposalContractAddress: proposalContractAddress || '',\n coreAddress,\n createdAt: new Date().toISOString(),\n ...(spec.buildExtraOutput ? spec.buildExtraOutput(inputs) : {}),\n },\n };\n },\n });\n}\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that updates a DAO DAO\n * group's proposal submission rules: whether anyone (vs members only) may\n * submit proposals, and the deposit required with each submission. Maps\n * onto a single `UpdatePreProposeConfig` proposal action — the consumer\n * turns it into an `update_config` execute on the pre-propose module.\n *\n * The on-chain update replaces BOTH fields at once. Groups are created\n * members-only, so `anyoneCanPropose` defaults to false — updating the\n * deposit must never silently open submission to everyone (see the legacy\n * proposal block's actionRegistry for the same policy).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - anyoneCanPropose: whether non-members may submit proposals.\n * - depositRequired: whether a deposit is required to submit a proposal.\n * - depositAmount: deposit in uixo base units (the UI collects whole IXO\n * and converts; the deposit token is fixed to native uixo for now).\n * - depositRefundPolicy: 'always' | 'only_passed' | 'never'.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\n\nconst REFUND_POLICIES = ['always', 'only_passed', 'never'] as const;\ntype RefundPolicy = (typeof REFUND_POLICIES)[number];\n\nregisterGovernanceProposalAction({\n type: 'qi/governance.submission-config-proposal',\n can: 'governance/submission-config-proposal',\n\n buildActions: (inputs) => {\n const anyoneCanPropose = Boolean(inputs.anyoneCanPropose);\n const depositRequired = Boolean(inputs.depositRequired);\n\n let amount = '0';\n let refundPolicy: RefundPolicy = 'always';\n if (depositRequired) {\n amount = String(inputs.depositAmount || '').trim();\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('depositAmount must be a positive whole number in uixo base units');\n }\n const policy = String(inputs.depositRefundPolicy || '').trim();\n if (!REFUND_POLICIES.includes(policy as RefundPolicy)) {\n throw new Error(\"depositRefundPolicy must be one of 'always', 'only_passed' or 'never'\");\n }\n refundPolicy = policy as RefundPolicy;\n }\n\n return [\n {\n type: 'UpdatePreProposeConfig',\n data: {\n depositRequired,\n // Deposit token fixed to the chain's native IXO (uixo) for now.\n depositInfo: { amount, type: 'native', denomOrAddress: 'uixo', refundPolicy },\n anyoneCanPropose,\n },\n },\n ];\n },\n\n defaultTitle: () => 'Update proposal submission rules',\n defaultDescription: () => 'Updates who may submit proposals and the required deposit once the proposal passes.',\n\n buildExtraOutput: (inputs) => {\n const depositRequired = Boolean(inputs.depositRequired);\n return {\n anyoneCanPropose: String(Boolean(inputs.anyoneCanPropose)),\n depositRequired: String(depositRequired),\n depositAmount: depositRequired ? String(inputs.depositAmount || '') : '0',\n depositRefundPolicy: depositRequired ? String(inputs.depositRefundPolicy || '') : 'always',\n };\n },\n extraOutputSchema: [\n { path: 'anyoneCanPropose', displayName: 'Anyone Can Propose', type: 'string', description: 'Whether non-members may submit proposals after the update' },\n { path: 'depositRequired', displayName: 'Deposit Required', type: 'string', description: 'Whether a deposit is required to submit a proposal' },\n { path: 'depositAmount', displayName: 'Deposit Amount', type: 'string', description: 'Required deposit in uixo base units' },\n { path: 'depositRefundPolicy', displayName: 'Deposit Refund Policy', type: 'string', description: 'What happens to the deposit after voting ends' },\n ],\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\n\n/**\n * @description Create an on-chain governance proposal that sends funds from a\n * DAO DAO POD's treasury to a recipient address. Maps onto a single\n * `Spend` proposal action — once the proposal passes, the treasury transfers\n * the funds.\n *\n * First of the `qi/governance.transaction.*` sub-family (treasury / asset\n * transactions; more coming — send-nft, swap, stake, …). Flow-panel\n * reference: `TransactionComposerStep` in impacts-x-web's PodSim\n * FlowStepActionPane, narrowed here to the only thing it does today: send\n * funds.\n *\n * @inputs\n * - coreAddress: DAO core contract address. TODO(governance): when empty in\n * flow mode, derive the current entity's governance group core address.\n * - recipient: bech32 (ixo1…) destination address.\n * - denom: token denom to send (from the treasury balances). Only denoms\n * with a known exponent are accepted (currently uixo/IXO) so the display\n * amount can be converted to base units correctly.\n * - amount: number to send, in the token's display units.\n * - title / description: optional; sensible defaults.\n */\nregisterAction({\n type: 'qi/governance.transaction.send-funds',\n can: 'governance.transaction/send-funds',\n sideEffect: true,\n proof: { fields: ['proposalId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n\n outputSchema: [\n { path: 'proposalId', displayName: 'Proposal ID', type: 'string', description: 'The on-chain proposal identifier' },\n { path: 'proposalTitle', displayName: 'Proposal Title', type: 'string', description: 'The proposal name voters see on-chain' },\n { path: 'proposalDescription', displayName: 'Proposal Description', type: 'string', description: 'The long-form description voters see on-chain' },\n { path: 'status', displayName: 'Proposal Status', type: 'string', description: 'Current proposal status (open, passed, rejected, executed, etc.)' },\n { path: 'proposalContractAddress', displayName: 'Proposal Contract Address', type: 'string', description: 'The proposal module contract address' },\n { path: 'coreAddress', displayName: 'Core Address', type: 'string', description: 'The DAO core contract address' },\n { path: 'recipient', displayName: 'Recipient', type: 'string', description: 'Destination address of the spend' },\n { path: 'createdAt', displayName: 'Created At', type: 'string', description: 'ISO timestamp of proposal creation' },\n ],\n\n // Mirrors run()'s throw-preamble (there is no inputSchema to declare\n // requiredness on): coreAddress, recipient, denom and amount.\n getMissingInputs: (inputs) => {\n const missing: string[] = [];\n for (const name of ['coreAddress', 'recipient', 'denom']) {\n if (!String(inputs[name] || '').trim()) missing.push(name);\n }\n const amount = inputs.amount;\n if (amount === undefined || amount === null || String(amount).trim() === '') missing.push('amount');\n return missing;\n },\n run: async (inputs, ctx) => {\n const handlers = ctx.handlers;\n if (!handlers) {\n throw new Error('Handlers not available');\n }\n if (!handlers.getPreProposalContractAddress || !handlers.getGroupContractAddress || !handlers.getProposalContractAddress || !handlers.createProposal) {\n throw new Error('Governance proposal handlers not available');\n }\n\n const coreAddress = String(inputs.coreAddress || '').trim();\n // TODO(governance): when coreAddress is empty in flow mode, resolve the\n // current entity's governance group core address rather than throwing.\n if (!coreAddress) throw new Error('coreAddress is required');\n\n const recipient = String(inputs.recipient || '').trim();\n if (!recipient) throw new Error('recipient is required');\n\n const denom = String(inputs.denom || '').trim();\n if (!denom) throw new Error('denom is required');\n\n const amount = Number(inputs.amount);\n if (!Number.isFinite(amount) || amount <= 0) throw new Error('amount must be greater than 0');\n\n // The Spend message needs the amount in the token's smallest unit\n // (1 IXO = 1,000,000 uixo). The input is in display units, so convert\n // using the denom's exponent — and refuse denoms whose exponent we don't\n // know rather than sending a silently wrong amount.\n const KNOWN_DENOMS: Record<string, { symbol: string; exponent: number }> = {\n uixo: { symbol: 'IXO', exponent: 6 },\n };\n const tokenInfo = KNOWN_DENOMS[denom];\n if (!tokenInfo) {\n throw new Error(`Sending ${denom} is not supported yet — only IXO transfers are currently available`);\n }\n const baseAmount = BigInt(Math.round(amount * 10 ** tokenInfo.exponent)).toString();\n\n const spendAction = { type: 'Spend', data: { to: recipient, denom, amount: baseAmount } };\n\n const title = String(inputs.title || '').trim() || `Send ${amount} ${tokenInfo.symbol} to ${recipient}`;\n const description = String(inputs.description || '').trim() || 'Sends funds from the POD treasury once the proposal passes.';\n\n const { preProposalContractAddress } = await handlers.getPreProposalContractAddress({ coreAddress });\n const { groupContractAddress } = await handlers.getGroupContractAddress({ coreAddress });\n const { proposalContractAddress } = await handlers.getProposalContractAddress({ coreAddress });\n\n const proposalId = await handlers.createProposal({\n preProposalContractAddress,\n title,\n description,\n actions: [spendAction],\n coreAddress,\n groupContractAddress,\n });\n\n // Proof guard: a proposal id is the contract the consumer must return when\n // the proposal was actually broadcast. No id → treat as a failure.\n if (proposalId === undefined || proposalId === null || String(proposalId).trim() === '') {\n throw new Error('Proposal creation returned no proposal id. Check the handler logs.');\n }\n\n return {\n output: {\n proposalId: String(proposalId),\n proposalTitle: title,\n proposalDescription: description,\n status: 'open',\n proposalContractAddress: proposalContractAddress || '',\n coreAddress,\n recipient,\n createdAt: new Date().toISOString(),\n },\n };\n },\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that transfers cw20\n * group tokens held by the DAO treasury to a recipient. Maps onto a single\n * `SendGroupToken` proposal action — the consumer turns it into a cw20\n * `transfer` execute on the token contract.\n *\n * Part of the `qi/governance.transaction.*` sub-family (treasury / asset\n * transactions).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - tokenContract: cw20 token contract address to transfer from.\n * - recipient: bech32 (ixo1…) destination address.\n * - amount: token amount in the token's base units (cw20 amounts are raw\n * integer strings; exponent varies per token, so no display conversion).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.transaction.send-group-token',\n can: 'governance.transaction/send-group-token',\n\n buildActions: (inputs) => {\n const contract = String(inputs.tokenContract || '').trim();\n if (!contract) throw new Error('tokenContract is required');\n\n const toAddress = String(inputs.recipient || '').trim();\n if (!toAddress) throw new Error('recipient is required');\n\n const amount = String(inputs.amount || '').trim();\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('amount must be a positive whole number in the token’s base units');\n }\n\n return [{ type: 'SendGroupToken', data: { contract, toAddress, amount } }];\n },\n\n defaultTitle: (inputs) => `Send ${inputs.amount} group tokens to ${inputs.recipient}`,\n defaultDescription: () => 'Transfers group tokens from the treasury once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ recipient: String(inputs.recipient || ''), tokenContract: String(inputs.tokenContract || '') }),\n extraOutputSchema: [\n { path: 'recipient', displayName: 'Recipient', type: 'string', description: 'Destination address of the transfer' },\n { path: 'tokenContract', displayName: 'Token Contract', type: 'string', description: 'The cw20 token contract transferred from' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that mints new\n * governance tokens to a recipient. Maps onto a single `Mint` proposal\n * action — the consumer turns it into a cw20 `mint` execute on the group's\n * governance token contract, so it only works for groups with a governance\n * token (token-staking groups, not member-weight groups).\n *\n * Part of the `qi/governance.transaction.*` sub-family (treasury / asset\n * transactions).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - recipient: bech32 (ixo1…) destination address the tokens are minted to.\n * - amount: amount to mint in the governance token's base units (cw20 mint\n * amounts are raw integer strings; exponent varies per token, so no\n * display conversion).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.transaction.mint',\n can: 'governance.transaction/mint',\n\n buildActions: (inputs) => {\n const to = String(inputs.recipient || '').trim();\n if (!to) throw new Error('recipient is required');\n\n // The consumer feeds this straight into a cw20 `mint` execute\n // (`action.data.amount.toString()`), which requires a raw integer string\n // in the token's base units — a float or exponent-notation number would\n // produce an invalid message.\n const amount = String(inputs.amount ?? '').trim();\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('amount must be a positive whole number in the token’s base units');\n }\n\n return [{ type: 'Mint', data: { to, amount } }];\n },\n\n defaultTitle: (inputs) => `Mint ${inputs.amount} governance tokens to ${inputs.recipient}`,\n defaultDescription: () => 'Mints new governance tokens to the recipient once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ recipient: String(inputs.recipient || ''), amount: String(inputs.amount || '') }),\n extraOutputSchema: [\n { path: 'recipient', displayName: 'Recipient', type: 'string', description: 'Destination address the tokens are minted to' },\n { path: 'amount', displayName: 'Amount', type: 'string', description: 'Number of governance tokens minted' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that funds the group's\n * side of a cw-token-swap contract. Maps onto a single `PerformTokenSwap`\n * proposal action — the consumer turns it into a `provide` execute (native\n * funds attached, or a cw20 `send`) on the swap contract.\n *\n * Part of the `qi/governance.transaction.*` sub-family (treasury / asset\n * transactions).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - tokenSwapContractAddress: the cw-token-swap contract to fund.\n * - selfPartyType: what the group provides — 'native' or 'cw20'.\n * - selfPartyDenomOrAddress: the native denom (e.g. uixo) or cw20 token\n * contract address of the provided token.\n * - selfPartyAmount: amount in the token's base units (raw integer string;\n * exponent varies per token, so no display conversion).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.transaction.perform-token-swap',\n can: 'governance.transaction/perform-token-swap',\n\n buildActions: (inputs) => {\n const tokenSwapContractAddress = String(inputs.tokenSwapContractAddress || '').trim();\n if (!tokenSwapContractAddress) throw new Error('tokenSwapContractAddress is required');\n\n const type = String(inputs.selfPartyType || '').trim();\n if (type !== 'native' && type !== 'cw20') throw new Error(\"selfPartyType must be 'native' or 'cw20'\");\n\n const denomOrAddress = String(inputs.selfPartyDenomOrAddress || '').trim();\n if (!denomOrAddress) throw new Error('selfPartyDenomOrAddress is required');\n\n const amount = String(inputs.selfPartyAmount || '').trim();\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('selfPartyAmount must be a positive whole number in the token’s base units');\n }\n\n return [\n {\n type: 'PerformTokenSwap',\n data: { contractChosen: true, tokenSwapContractAddress, selfParty: { type, denomOrAddress, amount } },\n },\n ];\n },\n\n defaultTitle: (inputs) => `Fund token swap ${inputs.tokenSwapContractAddress}`,\n defaultDescription: () => 'Sends the group’s side of the token swap to the swap contract once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({\n tokenSwapContractAddress: String(inputs.tokenSwapContractAddress || ''),\n selfPartyDenomOrAddress: String(inputs.selfPartyDenomOrAddress || ''),\n selfPartyAmount: String(inputs.selfPartyAmount || ''),\n }),\n extraOutputSchema: [\n { path: 'tokenSwapContractAddress', displayName: 'Swap Contract', type: 'string', description: 'The cw-token-swap contract funded' },\n { path: 'selfPartyDenomOrAddress', displayName: 'Token Denom / Address', type: 'string', description: 'The native denom or cw20 address the group provides' },\n { path: 'selfPartyAmount', displayName: 'Amount', type: 'string', description: 'Amount provided, in the token’s base units' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that withdraws the\n * group's funds from a cw-token-swap contract before the counterparty pays\n * in. Maps onto a single `WithdrawTokenSwap` proposal action — the consumer\n * turns it into a `withdraw` execute on the swap contract.\n *\n * Part of the `qi/governance.transaction.*` sub-family (treasury / asset\n * transactions).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - tokenSwapContractAddress: the cw-token-swap contract to withdraw from.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.transaction.withdraw-token-swap',\n can: 'governance.transaction/withdraw-token-swap',\n\n buildActions: (inputs) => {\n const tokenSwapContractAddress = String(inputs.tokenSwapContractAddress || '').trim();\n if (!tokenSwapContractAddress) throw new Error('tokenSwapContractAddress is required');\n\n return [{ type: 'WithdrawTokenSwap', data: { contractChosen: true, tokenSwapContractAddress } }];\n },\n\n defaultTitle: (inputs) => `Withdraw from token swap ${inputs.tokenSwapContractAddress}`,\n defaultDescription: () => 'Returns the group’s funds from the token swap contract once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ tokenSwapContractAddress: String(inputs.tokenSwapContractAddress || '') }),\n extraOutputSchema: [{ path: 'tokenSwapContractAddress', displayName: 'Swap Contract', type: 'string', description: 'The cw-token-swap contract withdrawn from' }],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that stakes the group\n * treasury's IXO with a validator — or unstakes, restakes and claims\n * rewards. Maps onto a single `Stake` proposal action — the consumer turns\n * it into the matching cosmos message (MsgDelegate, MsgUndelegate,\n * MsgBeginRedelegate or MsgWithdrawDelegatorReward) signed by the DAO core.\n *\n * Part of the `qi/governance.staking.*` sub-family (treasury staking).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - stakeType: the operation — delegate, undelegate, redelegate or\n * withdraw_delegator_reward (values match the legacy `StakeType` enum).\n * - validator: validator operator (ixovaloper1…) address; the source\n * validator for redelegations.\n * - toValidator: destination validator address (redelegations only).\n * - amount: uixo amount in base units (1 IXO = 1,000,000 uixo; the UI\n * collects IXO display units and converts). Ignored for reward claims.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\n\nconst STAKE_TYPES = ['delegate', 'undelegate', 'redelegate', 'withdraw_delegator_reward'] as const;\n\n/** uixo base units → IXO display units, for the default proposal title. */\nconst displayIxo = (amount: unknown): string => {\n const base = Number(amount);\n return Number.isFinite(base) ? String(base / 1e6) : String(amount || '');\n};\n\nregisterGovernanceProposalAction({\n type: 'qi/governance.staking.stake',\n can: 'governance.staking/stake',\n\n buildActions: (inputs) => {\n const stakeType = String(inputs.stakeType || '').trim();\n if (!STAKE_TYPES.includes(stakeType as (typeof STAKE_TYPES)[number])) {\n throw new Error('stakeType must be delegate, undelegate, redelegate or withdraw_delegator_reward');\n }\n\n const validator = String(inputs.validator || '').trim();\n if (!validator) throw new Error('validator is required');\n\n const isRedelegate = stakeType === 'redelegate';\n const toValidator = String(inputs.toValidator || '').trim();\n if (isRedelegate && !toValidator) throw new Error('toValidator is required for redelegations');\n\n // Reward claims carry no amount; every other operation needs a positive\n // whole number of uixo (the UI converts from IXO display units).\n let amount = '0';\n if (stakeType !== 'withdraw_delegator_reward') {\n amount = String(inputs.amount || '').trim();\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('amount must be a positive whole number of uixo (base units)');\n }\n }\n\n return [{ type: 'Stake', data: { stakeType, validator, toValidator: isRedelegate ? toValidator : '', amount, denom: 'uixo' } }];\n },\n\n // buildActions runs first, so the stake type is always a valid option here.\n defaultTitle: (inputs) => {\n switch (String(inputs.stakeType)) {\n case 'undelegate':\n return `Unstake ${displayIxo(inputs.amount)} IXO from ${inputs.validator}`;\n case 'redelegate':\n return `Restake ${displayIxo(inputs.amount)} IXO from ${inputs.validator} to ${inputs.toValidator}`;\n case 'withdraw_delegator_reward':\n return `Claim staking rewards from ${inputs.validator}`;\n default:\n return `Stake ${displayIxo(inputs.amount)} IXO with ${inputs.validator}`;\n }\n },\n defaultDescription: () => 'Executes the staking operation from the POD treasury once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({\n stakeType: String(inputs.stakeType || ''),\n validator: String(inputs.validator || ''),\n amount: String(inputs.amount || ''),\n }),\n extraOutputSchema: [\n { path: 'stakeType', displayName: 'Stake Type', type: 'string', description: 'The staking operation (delegate, undelegate, redelegate, withdraw_delegator_reward)' },\n { path: 'validator', displayName: 'Validator', type: 'string', description: 'The validator the operation targets (source for redelegations)' },\n { path: 'amount', displayName: 'Amount', type: 'string', description: 'The uixo amount staked, in base units' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that stakes cw20 tokens\n * held by the DAO treasury into a group's staking contract. Maps onto a\n * single `StakeToGroup` proposal action — the consumer turns it into a cw20\n * `send` execute on the token contract with an embedded `{stake:{}}` hook\n * the staking contract runs on receipt.\n *\n * Part of the `qi/governance.staking.*` sub-family (treasury staking).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - tokenContract: cw20 token contract address the tokens are sent from.\n * - stakingContract: cw20-stake staking contract that receives the tokens.\n * - amount: token amount in the token's base units (cw20 amounts are raw\n * integer strings; exponent varies per token, so no display conversion).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.staking.stake-to-group',\n can: 'governance.staking/stake-to-group',\n\n buildActions: (inputs) => {\n const tokenContract = String(inputs.tokenContract || '').trim();\n if (!tokenContract) throw new Error('tokenContract is required');\n\n const stakingContract = String(inputs.stakingContract || '').trim();\n if (!stakingContract) throw new Error('stakingContract is required');\n\n const amount = String(inputs.amount || '').trim();\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('amount must be a positive whole number in the token’s base units');\n }\n\n return [{ type: 'StakeToGroup', data: { tokenContract, stakingContract, amount } }];\n },\n\n defaultTitle: (inputs) => `Stake ${inputs.amount} tokens to the group`,\n defaultDescription: () => 'Stakes treasury tokens into the group staking contract once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ tokenContract: String(inputs.tokenContract || ''), stakingContract: String(inputs.stakingContract || '') }),\n extraOutputSchema: [\n { path: 'tokenContract', displayName: 'Token Contract', type: 'string', description: 'The cw20 token contract the tokens are sent from' },\n { path: 'stakingContract', displayName: 'Staking Contract', type: 'string', description: 'The staking contract the tokens are staked into' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that grants an address\n * authorization to execute a message type on the POD's behalf. Maps onto\n * a single `AuthzGrant` proposal action — the consumer builds a\n * `GenericAuthorization` for the message type with a 1-year expiry, with\n * the group as the granter.\n *\n * Part of the `qi/governance.authz.*` sub-family (authorizations).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - grantee: bech32 (ixo1…) address that receives the authorization.\n * - msgTypeUrl: fully-qualified message type URL the grantee may execute,\n * e.g. `/cosmos.bank.v1beta1.MsgSend`.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.authz.grant',\n can: 'governance.authz/grant',\n\n buildActions: (inputs) => {\n const grantee = String(inputs.grantee || '').trim();\n if (!grantee) throw new Error('grantee is required');\n\n const msgTypeUrl = String(inputs.msgTypeUrl || '').trim();\n if (!msgTypeUrl) throw new Error('msgTypeUrl is required');\n if (!msgTypeUrl.startsWith('/')) {\n throw new Error('msgTypeUrl must be a fully-qualified message type URL starting with \"/\"');\n }\n\n return [{ type: 'AuthzGrant', data: { typeUrl: '/cosmos.authz.v1beta1.MsgGrant', value: { grantee, msgTypeUrl } } }];\n },\n\n defaultTitle: (inputs) => `Grant ${inputs.msgTypeUrl} authorization to ${inputs.grantee}`,\n defaultDescription: () => 'Authorizes the grantee to execute the message type on the group’s behalf (1-year expiry) once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ grantee: String(inputs.grantee || ''), msgTypeUrl: String(inputs.msgTypeUrl || '') }),\n extraOutputSchema: [\n { path: 'grantee', displayName: 'Grantee', type: 'string', description: 'Address that receives the authorization' },\n { path: 'msgTypeUrl', displayName: 'Message Type URL', type: 'string', description: 'The message type the grantee may execute' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that revokes a\n * previously granted authorization from an address. Maps onto a single\n * `AuthzRevoke` proposal action — the consumer turns it into a\n * `MsgRevoke` for the message type, with the group as the granter.\n *\n * Part of the `qi/governance.authz.*` sub-family (authorizations).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - grantee: bech32 (ixo1…) address whose authorization is revoked.\n * - msgTypeUrl: fully-qualified message type URL of the grant to revoke,\n * e.g. `/cosmos.bank.v1beta1.MsgSend`.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.authz.revoke',\n can: 'governance.authz/revoke',\n\n buildActions: (inputs) => {\n const grantee = String(inputs.grantee || '').trim();\n if (!grantee) throw new Error('grantee is required');\n\n const msgTypeUrl = String(inputs.msgTypeUrl || '').trim();\n if (!msgTypeUrl) throw new Error('msgTypeUrl is required');\n if (!msgTypeUrl.startsWith('/')) {\n throw new Error('msgTypeUrl must be a fully-qualified message type URL starting with \"/\"');\n }\n\n return [{ type: 'AuthzRevoke', data: { typeUrl: '/cosmos.authz.v1beta1.MsgRevoke', value: { grantee, msgTypeUrl } } }];\n },\n\n defaultTitle: (inputs) => `Revoke ${inputs.msgTypeUrl} authorization from ${inputs.grantee}`,\n defaultDescription: () => 'Revokes the grantee’s authorization to execute the message type on the group’s behalf once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ grantee: String(inputs.grantee || ''), msgTypeUrl: String(inputs.msgTypeUrl || '') }),\n extraOutputSchema: [\n { path: 'grantee', displayName: 'Grantee', type: 'string', description: 'Address whose authorization is revoked' },\n { path: 'msgTypeUrl', displayName: 'Message Type URL', type: 'string', description: 'The message type of the revoked grant' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that makes the group\n * execute a message it was previously authorized to run (authz exec). Maps\n * onto a single `AuthzExec` proposal action whose data matches the legacy\n * `AuthzExecData` shape — the consumer turns the selected sub-object into a\n * `MsgExec`-wrapped staking / distribution / custom message.\n *\n * Part of the `qi/governance.authz.*` sub-family (authorizations).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - authzExecActionType: one of the message type URLs below, or `custom`.\n * - delegatorAddress / validatorAddress: staking + claim-rewards ops.\n * - validatorDstAddress: redelegate destination validator.\n * - amount: staking amount in uixo base units (raw integer string).\n * - custom: raw JSON array of encoded msgs (custom mode only).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\n\n/**\n * Mirrors `AuthzExecActionTypes` in `src/mantine/context/types.ts` — the\n * exact type URLs the consumer's `transformActionsToMsgs` switches on. Kept\n * local so the core registry stays independent of the UI layer.\n */\nconst AUTHZ_EXEC_ACTION_TYPES = {\n delegate: '/cosmos.staking.v1beta1.MsgDelegate',\n undelegate: '/cosmos.staking.v1beta1.MsgUndelegate',\n redelegate: '/cosmos.staking.v1beta1.MsgBeginRedelegate',\n claimRewards: '/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward',\n custom: 'custom',\n} as const;\n\nconst ACTION_LABELS: Record<string, string> = {\n [AUTHZ_EXEC_ACTION_TYPES.delegate]: 'delegate',\n [AUTHZ_EXEC_ACTION_TYPES.undelegate]: 'undelegate',\n [AUTHZ_EXEC_ACTION_TYPES.redelegate]: 'redelegate',\n [AUTHZ_EXEC_ACTION_TYPES.claimRewards]: 'claim-rewards',\n [AUTHZ_EXEC_ACTION_TYPES.custom]: 'custom',\n};\n\nregisterGovernanceProposalAction({\n type: 'qi/governance.authz.exec',\n can: 'governance.authz/exec',\n\n buildActions: (inputs) => {\n const actionType = String(inputs.authzExecActionType || '').trim();\n const known = Object.values(AUTHZ_EXEC_ACTION_TYPES) as string[];\n if (!known.includes(actionType)) {\n throw new Error(`authzExecActionType must be one of: ${known.join(', ')}`);\n }\n\n const delegator = String(inputs.delegatorAddress || '').trim();\n const validator = String(inputs.validatorAddress || '').trim();\n const validatorDst = String(inputs.validatorDstAddress || '').trim();\n const amount = String(inputs.amount || '').trim();\n\n const requireStakingFields = () => {\n if (!delegator) throw new Error('delegatorAddress is required');\n if (!validator) throw new Error('validatorAddress is required');\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('amount must be a positive whole number in uixo base units');\n }\n };\n\n // Build only the selected sub-object; the others stay empty objects like\n // the legacy proposal block's defaults so `AuthzExecData` stays complete.\n const data: Record<string, any> = {\n authzExecActionType: actionType,\n delegate: {},\n undelegate: {},\n redelegate: {},\n claimRewards: {},\n custom: '',\n };\n\n // The consumer protobuf-encodes the selected sub-object with cosmjs-types\n // (`encodeRawProtobufMsg`), whose generated encoders read camelCase field\n // names — snake_case keys (as the legacy form's placeholders suggested)\n // would encode empty messages.\n switch (actionType) {\n case AUTHZ_EXEC_ACTION_TYPES.delegate:\n requireStakingFields();\n data.delegate = { delegatorAddress: delegator, validatorAddress: validator, amount: { denom: 'uixo', amount } };\n break;\n case AUTHZ_EXEC_ACTION_TYPES.undelegate:\n requireStakingFields();\n data.undelegate = { delegatorAddress: delegator, validatorAddress: validator, amount: { denom: 'uixo', amount } };\n break;\n case AUTHZ_EXEC_ACTION_TYPES.redelegate:\n requireStakingFields();\n if (!validatorDst) throw new Error('validatorDstAddress is required');\n data.redelegate = { delegatorAddress: delegator, validatorSrcAddress: validator, validatorDstAddress: validatorDst, amount: { denom: 'uixo', amount } };\n break;\n case AUTHZ_EXEC_ACTION_TYPES.claimRewards:\n if (!delegator) throw new Error('delegatorAddress is required');\n if (!validator) throw new Error('validatorAddress is required');\n data.claimRewards = { delegatorAddress: delegator, validatorAddress: validator };\n break;\n case AUTHZ_EXEC_ACTION_TYPES.custom: {\n const custom = String(inputs.custom || '').trim();\n if (!custom) throw new Error('custom is required');\n let parsed: unknown;\n try {\n parsed = JSON.parse(custom);\n } catch {\n throw new Error('custom must be valid JSON');\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n throw new Error('custom must be a non-empty JSON array of encoded msgs');\n }\n data.custom = custom;\n break;\n }\n }\n\n return [{ type: 'AuthzExec', data }];\n },\n\n defaultTitle: (inputs) => `Execute authorized ${ACTION_LABELS[String(inputs.authzExecActionType || '').trim()] || 'authz'} action`,\n defaultDescription: () => 'Executes a message the group was previously authorized to run once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({\n authzExecActionType: String(inputs.authzExecActionType || ''),\n validatorAddress: String(inputs.validatorAddress || ''),\n }),\n extraOutputSchema: [\n { path: 'authzExecActionType', displayName: 'Exec Action Type', type: 'string', description: 'The executed message type URL (or `custom`)' },\n { path: 'validatorAddress', displayName: 'Validator Address', type: 'string', description: 'The validator targeted by staking ops (empty for custom)' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that casts the group\n * treasury's vote on a COSMOS CHAIN governance proposal (cosmos.gov\n * MsgVote) — not a DAO proposal. Maps onto a single `GovernanceVote`\n * proposal action — the consumer turns it into a MsgVote signed by the DAO\n * core once the proposal passes.\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - proposalId: chain governance proposal number (digits).\n * - vote: cosmos.gov vote option number — 1 = Yes, 2 = Abstain, 3 = No,\n * 4 = No with veto.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\n\nconst VOTE_LABELS: Record<number, string> = { 1: 'Yes', 2: 'Abstain', 3: 'No', 4: 'No with veto' };\n\nregisterGovernanceProposalAction({\n type: 'qi/governance.chain-governance-vote',\n can: 'governance/chain-governance-vote',\n\n buildActions: (inputs) => {\n const proposalId = String(inputs.proposalId || '').trim();\n if (!/^\\d+$/.test(proposalId)) {\n throw new Error('proposalId must be a chain governance proposal number (digits only)');\n }\n\n const vote = Number(inputs.vote);\n if (!VOTE_LABELS[vote]) {\n throw new Error('vote must be 1 (Yes), 2 (Abstain), 3 (No) or 4 (No with veto)');\n }\n\n return [{ type: 'GovernanceVote', data: { proposalId, vote } }];\n },\n\n // buildActions runs first, so the vote is always a valid option here.\n defaultTitle: (inputs) => `Vote ${VOTE_LABELS[Number(inputs.vote)]} on chain governance proposal #${inputs.proposalId}`,\n defaultDescription: () => \"Casts the group's vote on the chain governance proposal once this proposal passes.\",\n\n buildExtraOutput: (inputs) => ({\n chainProposalId: String(inputs.proposalId || ''),\n voteOption: VOTE_LABELS[Number(inputs.vote)] || String(inputs.vote || ''),\n }),\n extraOutputSchema: [\n { path: 'chainProposalId', displayName: 'Chain Proposal ID', type: 'string', description: 'The chain governance proposal the POD votes on' },\n { path: 'voteOption', displayName: 'Vote Option', type: 'string', description: 'The vote cast (Yes, Abstain, No, No with veto)' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that links this group\n * as a member of another entity. Maps onto a single `Join` proposal action —\n * the consumer turns it into a `MsgAddLinkedEntity` that records the member\n * on the joined entity's IID document, signed by the group's core address.\n *\n * Part of the `qi/governance.dao.*` sub-family (DAO management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode). Passed through as the Join action's\n * signer.\n * - entityDid: DID of the entity being joined.\n * - memberId: the member entity's DID/id recorded as the linked entity —\n * typically this group's own entity DID.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.dao.join',\n can: 'governance.dao/join',\n\n buildActions: (inputs) => {\n const id = String(inputs.entityDid || '').trim();\n if (!id) throw new Error('entityDid is required');\n\n const address = String(inputs.memberId || '').trim();\n if (!address) throw new Error('memberId is required');\n\n // The factory validated coreAddress before calling buildActions; the Join\n // action records it as the signer of the MsgAddLinkedEntity.\n const coreAddress = String(inputs.coreAddress || '').trim();\n\n return [{ type: 'Join', data: { id, coreAddress, address } }];\n },\n\n defaultTitle: (inputs) => `Join entity ${inputs.entityDid}`,\n defaultDescription: (inputs) => `Links ${inputs.memberId} as a member of ${inputs.entityDid} once the proposal passes.`,\n\n buildExtraOutput: (inputs) => ({ entityDid: String(inputs.entityDid || ''), memberId: String(inputs.memberId || '') }),\n extraOutputSchema: [\n { path: 'entityDid', displayName: 'Entity DID', type: 'string', description: 'The entity the group joined' },\n { path: 'memberId', displayName: 'Member ID', type: 'string', description: 'The member DID/id recorded as the linked entity' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that updates the DAO's\n * public info. Maps onto a single `UpdateInfo` proposal action — the\n * consumer turns it into a dao_core `update_config` execute. The config is\n * replaced in full, so every field is submitted every time (the consumer\n * nulls an empty image_url).\n *\n * Part of the `qi/governance.dao.*` sub-family (DAO management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - name: the DAO's display name.\n * - daoDescription: the DAO's public description — distinct from the\n * proposal description voters read (that one only describes this change).\n * - imageUrl: optional logo/banner URL. Empty → nulled by the consumer.\n * - automaticallyAddCw20s / automaticallyAddCw721s: whether tokens/NFTs\n * received by the DAO are auto-registered in the treasury.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.dao.update-info',\n can: 'governance.dao/update-info',\n\n buildActions: (inputs) => {\n const name = String(inputs.name || '').trim();\n if (!name) throw new Error('name is required');\n\n const daoDescription = String(inputs.daoDescription || '').trim();\n const imageUrl = String(inputs.imageUrl || '').trim();\n\n return [\n {\n type: 'UpdateInfo',\n data: {\n name,\n description: daoDescription,\n automatically_add_cw20s: inputs.automaticallyAddCw20s === true || inputs.automaticallyAddCw20s === 'true',\n automatically_add_cw721s: inputs.automaticallyAddCw721s === true || inputs.automaticallyAddCw721s === 'true',\n image_url: imageUrl || null,\n },\n },\n ];\n },\n\n defaultTitle: (inputs) => `Update DAO info to “${inputs.name}”`,\n defaultDescription: () => 'Replaces the DAO name, description, image and auto-add settings once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ daoName: String(inputs.name || '') }),\n extraOutputSchema: [{ path: 'daoName', displayName: 'DAO Name', type: 'string', description: 'The DAO display name the proposal sets' }],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that recognises or\n * removes SubDAOs of this DAO. Maps onto a single `ManageSubDaos` proposal\n * action — the consumer turns it into a dao_core `update_sub_daos` execute.\n *\n * Part of the `qi/governance.dao.*` sub-family (DAO management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - toAdd: SubDAO core addresses to recognise (strings, or `{ addr }` /\n * `{ address }` objects from templated inputs).\n * - toRemove: SubDAO core addresses to remove, same accepted shapes.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\n\n/** Accept string entries or `{ addr }` / `{ address }` objects from templates. */\nfunction normalizeAddresses(value: unknown): string[] {\n return (Array.isArray(value) ? value : []).map((entry: any) => String(typeof entry === 'string' ? entry : entry?.addr || entry?.address || '').trim());\n}\n\nregisterGovernanceProposalAction({\n type: 'qi/governance.dao.manage-subdaos',\n can: 'governance.dao/manage-subdaos',\n\n buildActions: (inputs) => {\n const toAdd = normalizeAddresses(inputs.toAdd);\n const toRemove = normalizeAddresses(inputs.toRemove);\n\n if (toAdd.some((addr) => !addr) || toRemove.some((addr) => !addr)) {\n throw new Error('Every SubDAO entry needs an address');\n }\n if (toAdd.length + toRemove.length === 0) {\n throw new Error('Add or remove at least one SubDAO');\n }\n\n const all = [...toAdd, ...toRemove];\n if (new Set(all).size !== all.length) throw new Error('Duplicate SubDAO addresses are not allowed');\n\n // Note the asymmetric key names the consumer expects: additions use\n // `addr` (dao_core SubDao entries), removals use `address`.\n return [\n {\n type: 'ManageSubDaos',\n data: {\n toAdd: toAdd.map((addr) => ({ addr })),\n toRemove: toRemove.map((address) => ({ address })),\n },\n },\n ];\n },\n\n defaultTitle: (inputs) => {\n const added = normalizeAddresses(inputs.toAdd).length;\n const removed = normalizeAddresses(inputs.toRemove).length;\n return `Add ${added} and remove ${removed} SubDAOs`;\n },\n defaultDescription: () => 'Updates the set of SubDAOs this DAO recognises once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({\n addedCount: String(normalizeAddresses(inputs.toAdd).length),\n removedCount: String(normalizeAddresses(inputs.toRemove).length),\n }),\n extraOutputSchema: [\n { path: 'addedCount', displayName: 'SubDAOs Added', type: 'string', description: 'Number of SubDAOs the proposal recognises' },\n { path: 'removedCount', displayName: 'SubDAOs Removed', type: 'string', description: 'Number of SubDAOs the proposal removes' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that sets or removes a\n * key/value item in the DAO's on-chain storage. Maps onto a single\n * `ManageStorageItems` proposal action — the consumer turns it into a\n * dao_core `set_item` (setting) or `remove_item` execute.\n *\n * Part of the `qi/governance.dao.*` sub-family (DAO management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - setting: true → set the item, false → remove it.\n * - key: the storage key.\n * - value: the value to store. Required when setting, ignored on remove.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.dao.manage-storage',\n can: 'governance.dao/manage-storage',\n\n buildActions: (inputs) => {\n const setting = inputs.setting === true || inputs.setting === 'true';\n\n const key = String(inputs.key || '').trim();\n if (!key) throw new Error('key is required');\n\n const value = String(inputs.value || '').trim();\n if (setting && !value) throw new Error('value is required when setting a storage item');\n\n return [{ type: 'ManageStorageItems', data: { setting, key, value: setting ? value : '' } }];\n },\n\n defaultTitle: (inputs) => {\n const setting = inputs.setting === true || inputs.setting === 'true';\n return setting ? `Set storage item “${inputs.key}”` : `Remove storage item “${inputs.key}”`;\n },\n defaultDescription: () => \"Updates the DAO's on-chain key/value storage once the proposal passes.\",\n\n buildExtraOutput: (inputs) => ({\n storageKey: String(inputs.key || ''),\n storageAction: inputs.setting === true || inputs.setting === 'true' ? 'set' : 'remove',\n }),\n extraOutputSchema: [\n { path: 'storageKey', displayName: 'Storage Key', type: 'string', description: 'The storage key the proposal targets' },\n { path: 'storageAction', displayName: 'Storage Action', type: 'string', description: 'set | remove' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that executes arbitrary\n * messages on a SubDAO this group is the admin of. Maps onto a single\n * `DaoAdminExec` proposal action — the consumer turns it into an\n * `execute_admin_msgs` execute on the TARGET dao_core, so the action's\n * `coreAddress` is the SubDAO's core address, not this group's.\n *\n * Advanced block: the messages are raw CosmWasm/cosmos messages the SubDAO\n * executes verbatim.\n *\n * Part of the `qi/governance.dao.*` sub-family (DAO management).\n *\n * @inputs\n * - coreAddress: THIS group's DAO core contract address (blank → resolved\n * from the current entity in flow mode). The proposal is created here.\n * - targetCoreAddress: core address of the SubDAO the admin messages run on.\n * - msgs: JSON array of messages to execute (array, or a JSON string that\n * parses to one).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.dao.admin-exec',\n can: 'governance.dao/admin-exec',\n\n buildActions: (inputs) => {\n const targetCoreAddress = String(inputs.targetCoreAddress || '').trim();\n if (!targetCoreAddress) throw new Error('targetCoreAddress is required');\n\n let msgs = inputs.msgs;\n if (typeof msgs === 'string') {\n try {\n msgs = JSON.parse(msgs);\n } catch {\n throw new Error('msgs must be valid JSON');\n }\n }\n if (!Array.isArray(msgs) || msgs.length === 0) {\n throw new Error('msgs must be a non-empty JSON array of messages');\n }\n\n // data.coreAddress is the TARGET SubDAO core the admin messages execute\n // on — the proposal itself lives on this group's core (inputs.coreAddress).\n return [{ type: 'DaoAdminExec', data: { coreAddress: targetCoreAddress, msgs } }];\n },\n\n defaultTitle: (inputs) => `Execute admin messages on ${inputs.targetCoreAddress}`,\n defaultDescription: () => 'Executes the listed admin messages on the target SubDAO once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ targetCoreAddress: String(inputs.targetCoreAddress || '') }),\n extraOutputSchema: [{ path: 'targetCoreAddress', displayName: 'Target Core Address', type: 'string', description: 'The SubDAO core address the admin messages execute on' }],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that accepts an entity\n * into the marketplace. Maps onto a single `AcceptToMarketplace` proposal\n * action — the consumer turns it into a `MsgUpdateEntityVerified` that marks\n * the entity verified. The group must be the entity's relayer node for the\n * message to succeed.\n *\n * Part of the `qi/governance.dao.*` sub-family (DAO management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - did: DID of the entity to mark verified.\n * - relayerNodeDid: DID of the relayer node vouching for the entity.\n * - relayerNodeAddress: bech32 (ixo1…) address of the relayer node.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.dao.accept-to-marketplace',\n can: 'governance.dao/accept-to-marketplace',\n\n buildActions: (inputs) => {\n const did = String(inputs.did || '').trim();\n if (!did) throw new Error('did is required');\n\n const relayerNodeDid = String(inputs.relayerNodeDid || '').trim();\n if (!relayerNodeDid) throw new Error('relayerNodeDid is required');\n\n const relayerNodeAddress = String(inputs.relayerNodeAddress || '').trim();\n if (!relayerNodeAddress) throw new Error('relayerNodeAddress is required');\n\n return [{ type: 'AcceptToMarketplace', data: { did, relayerNodeDid, relayerNodeAddress } }];\n },\n\n defaultTitle: (inputs) => `Accept ${inputs.did} to the marketplace`,\n defaultDescription: () => 'Marks the entity as verified on the marketplace once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ entityDid: String(inputs.did || ''), relayerNodeDid: String(inputs.relayerNodeDid || '') }),\n extraOutputSchema: [\n { path: 'entityDid', displayName: 'Entity DID', type: 'string', description: 'The entity marked verified' },\n { path: 'relayerNodeDid', displayName: 'Relayer Node DID', type: 'string', description: 'The relayer node vouching for the entity' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that broadcasts a raw\n * entity-creation message when it passes. Maps onto a single `CreateEntity`\n * proposal action — the consumer wraps it as a stargate message, typically\n * `/ixo.entity.v1beta1.MsgCreateEntity`.\n *\n * Advanced block: the message value is passed through verbatim, so the\n * author is responsible for a well-formed message body.\n *\n * Part of the `qi/governance.dao.*` sub-family (DAO management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - typeUrl: fully-qualified message type url. Defaults to\n * `/ixo.entity.v1beta1.MsgCreateEntity` when blank.\n * - value: the message body (JSON object, or a JSON string that parses to\n * one).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\n\nconst DEFAULT_TYPE_URL = '/ixo.entity.v1beta1.MsgCreateEntity';\n\nregisterGovernanceProposalAction({\n type: 'qi/governance.dao.create-entity',\n can: 'governance.dao/create-entity',\n\n buildActions: (inputs) => {\n const typeUrl = String(inputs.typeUrl || '').trim() || DEFAULT_TYPE_URL;\n if (!typeUrl.startsWith('/')) throw new Error('typeUrl must be a fully-qualified message type url starting with “/”');\n\n let value = inputs.value;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n throw new Error('value must be valid JSON');\n }\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('value must be a JSON object with the message fields');\n }\n\n return [{ type: 'CreateEntity', data: { typeUrl, value } }];\n },\n\n defaultTitle: () => 'Create entity',\n defaultDescription: (inputs) => `Broadcasts a ${String(inputs.typeUrl || '').trim() || DEFAULT_TYPE_URL} message once the proposal passes.`,\n\n buildExtraOutput: (inputs) => ({ typeUrl: String(inputs.typeUrl || '').trim() || DEFAULT_TYPE_URL }),\n extraOutputSchema: [{ path: 'typeUrl', displayName: 'Message Type URL', type: 'string', description: 'The stargate message type the proposal broadcasts' }],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that burns an NFT held\n * by the DAO treasury. Maps onto a single `BurnNft` proposal action — the\n * consumer turns it into a cw721 `burn` execute on the collection contract.\n *\n * Part of the `qi/governance.nft.*` sub-family (treasury NFT management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - collection: cw721 collection contract address holding the token.\n * - tokenId: id of the token to burn.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.nft.burn',\n can: 'governance.nft/burn',\n\n buildActions: (inputs) => {\n const collection = String(inputs.collection || '').trim();\n if (!collection) throw new Error('collection is required');\n\n const tokenId = String(inputs.tokenId || '').trim();\n if (!tokenId) throw new Error('tokenId is required');\n\n return [{ type: 'BurnNft', data: { collection, tokenId } }];\n },\n\n defaultTitle: (inputs) => `Burn NFT ${inputs.tokenId} from ${inputs.collection}`,\n defaultDescription: () => 'Permanently burns the NFT from the treasury once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ collection: String(inputs.collection || ''), tokenId: String(inputs.tokenId || '') }),\n extraOutputSchema: [\n { path: 'collection', displayName: 'Collection', type: 'string', description: 'The cw721 collection contract the token is burned from' },\n { path: 'tokenId', displayName: 'Token ID', type: 'string', description: 'The id of the burned token' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that transfers an NFT\n * held by the DAO treasury to a recipient. Maps onto a single `TransferNft`\n * proposal action — the consumer turns it into a cw721 `transfer_nft`\n * execute, or a `send_nft` carrying the JSON msg when the recipient is a\n * smart contract that should be executed on receipt.\n *\n * Part of the `qi/governance.nft.*` sub-family (treasury NFT management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - collection: cw721 collection contract address holding the token.\n * - tokenId: id of the token to transfer.\n * - recipient: bech32 (ixo1…) destination address (wallet or contract).\n * - executeSmartContract: when true the consumer sends `send_nft` with\n * `smartContractMsg`; otherwise a plain `transfer_nft`.\n * - smartContractMsg: JSON execute msg for the receiving contract (required\n * and must parse when executeSmartContract is true).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.nft.transfer',\n can: 'governance.nft/transfer',\n\n buildActions: (inputs) => {\n const collection = String(inputs.collection || '').trim();\n if (!collection) throw new Error('collection is required');\n\n const tokenId = String(inputs.tokenId || '').trim();\n if (!tokenId) throw new Error('tokenId is required');\n\n const recipient = String(inputs.recipient || '').trim();\n if (!recipient) throw new Error('recipient is required');\n\n const executeSmartContract = inputs.executeSmartContract === true || inputs.executeSmartContract === 'true';\n // The consumer JSON.stringifies smartContractMsg before base64-encoding it\n // into the send_nft hook — so it must be the PARSED object, not the JSON\n // string (a string would double-encode and the contract would reject it).\n let smartContractMsg: unknown = '';\n if (executeSmartContract) {\n const raw = String(inputs.smartContractMsg || '').trim();\n if (!raw) throw new Error('smartContractMsg is required when executeSmartContract is enabled');\n try {\n smartContractMsg = JSON.parse(raw);\n } catch {\n throw new Error('smartContractMsg must be valid JSON');\n }\n }\n\n return [{ type: 'TransferNft', data: { collection, tokenId, recipient, executeSmartContract, smartContractMsg } }];\n },\n\n defaultTitle: (inputs) => `Transfer NFT ${inputs.tokenId} to ${inputs.recipient}`,\n defaultDescription: () => 'Transfers the NFT from the treasury once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({\n collection: String(inputs.collection || ''),\n tokenId: String(inputs.tokenId || ''),\n recipient: String(inputs.recipient || ''),\n }),\n extraOutputSchema: [\n { path: 'collection', displayName: 'Collection', type: 'string', description: 'The cw721 collection contract the token is transferred from' },\n { path: 'tokenId', displayName: 'Token ID', type: 'string', description: 'The id of the transferred token' },\n { path: 'recipient', displayName: 'Recipient', type: 'string', description: 'Destination address of the transfer' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that tracks or untracks\n * an NFT collection in the DAO treasury. Maps onto a single `ManageCw721`\n * proposal action — the consumer turns it into an `update_cw721_list`\n * execute on the dao_core contract.\n *\n * Part of the `qi/governance.nft.*` sub-family (treasury NFT management).\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - adding: true → track (add) the collection in the treasury;\n * false → untrack (remove) it.\n * - address: cw721 collection contract address to track or untrack.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.nft.manage-collections',\n can: 'governance.nft/manage-collections',\n\n buildActions: (inputs) => {\n const address = String(inputs.address || '').trim();\n if (!address) throw new Error('address is required');\n\n const adding = inputs.adding === true || inputs.adding === 'true';\n\n return [{ type: 'ManageCw721', data: { adding, address } }];\n },\n\n defaultTitle: (inputs) => {\n const adding = inputs.adding === true || inputs.adding === 'true';\n return `${adding ? 'Track' : 'Untrack'} NFT collection ${inputs.address}`;\n },\n defaultDescription: () => 'Updates the NFT collections tracked in the treasury once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({\n adding: String(inputs.adding === true || inputs.adding === 'true'),\n address: String(inputs.address || ''),\n }),\n extraOutputSchema: [\n { path: 'adding', displayName: 'Adding', type: 'string', description: 'Whether the collection is tracked (true) or untracked (false)' },\n { path: 'address', displayName: 'Collection Address', type: 'string', description: 'The cw721 collection contract tracked or untracked' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that executes an\n * arbitrary message on a smart contract as the DAO. Maps onto a single\n * `Execute` proposal action — the consumer turns it into a\n * `MsgExecuteContract` from the DAO core, parsing the message with JSON5.\n *\n * Part of the `qi/governance.contract.*` sub-family (smart contracts).\n * Advanced: a malformed message fails on-chain when the proposal executes.\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - address: the smart contract address to execute against.\n * - message: the execute message as a JSON string (validated with strict\n * JSON here; the consumer parses it with JSON5, a superset).\n * - funds: optional native coins attached to the execute, each\n * `{ denom, amount }` with the amount in base units.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.contract.execute',\n can: 'governance.contract/execute',\n\n buildActions: (inputs) => {\n const address = String(inputs.address || '').trim();\n if (!address) throw new Error('address is required');\n\n const message = String(inputs.message || '').trim();\n if (!message) throw new Error('message is required');\n try {\n JSON.parse(message);\n } catch {\n throw new Error('message must be a valid JSON object');\n }\n\n const rawFunds = Array.isArray(inputs.funds) ? inputs.funds : [];\n const funds = rawFunds.map((fund: any) => {\n const denom = String(fund?.denom || '').trim();\n if (!denom) throw new Error('every attached fund needs a denom');\n const amount = String(fund?.amount || '').trim();\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('every attached fund amount must be a positive whole number in base units');\n }\n return { denom, amount };\n });\n\n return [{ type: 'Execute', data: { address, message, funds } }];\n },\n\n defaultTitle: (inputs) => `Execute a message on contract ${inputs.address}`,\n defaultDescription: () => 'Executes the message on the smart contract as the DAO once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ contractAddress: String(inputs.address || '') }),\n extraOutputSchema: [{ path: 'contractAddress', displayName: 'Contract Address', type: 'string', description: 'The smart contract the message executes on' }],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that instantiates a new\n * smart contract from an uploaded code id, with the DAO as the sender. Maps\n * onto a single `Instantiate` proposal action — the consumer turns it into\n * a `MsgInstantiateContract` from the DAO core, parsing the init message\n * with JSON5.\n *\n * Part of the `qi/governance.contract.*` sub-family (smart contracts).\n * Advanced: a wrong code id or malformed init message fails on-chain when\n * the proposal executes.\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - codeId: the uploaded wasm code id to instantiate (positive integer).\n * - label: human-readable label stored on the new contract.\n * - admin: optional address allowed to migrate the new contract (blank →\n * no admin, the contract is immutable).\n * - message: the init message as a JSON string (validated with strict JSON\n * here; the consumer parses it with JSON5, a superset).\n * - funds: optional native coins sent to the new contract, each\n * `{ denom, amount }` with the amount in base units.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.contract.instantiate',\n can: 'governance.contract/instantiate',\n\n buildActions: (inputs) => {\n const codeId = Number(inputs.codeId);\n if (!Number.isInteger(codeId) || codeId <= 0) throw new Error('codeId must be a positive whole number');\n\n const label = String(inputs.label || '').trim();\n if (!label) throw new Error('label is required');\n\n // The consumer builds MsgInstantiateContract with `sender: admin`, so a\n // blank admin would produce an invalid message. Default to the group's\n // core address — the natural owner of contracts the group deploys.\n const admin = String(inputs.admin || '').trim() || String(inputs.coreAddress || '').trim();\n if (!admin) throw new Error('admin is required (defaults to the group core address)');\n\n const message = String(inputs.message || '').trim();\n if (!message) throw new Error('message is required');\n try {\n JSON.parse(message);\n } catch {\n throw new Error('message must be a valid JSON object');\n }\n\n const rawFunds = Array.isArray(inputs.funds) ? inputs.funds : [];\n const funds = rawFunds.map((fund: any) => {\n const denom = String(fund?.denom || '').trim();\n if (!denom) throw new Error('every attached fund needs a denom');\n const amount = String(fund?.amount || '').trim();\n if (!/^\\d+$/.test(amount) || BigInt(amount) <= 0n) {\n throw new Error('every attached fund amount must be a positive whole number in base units');\n }\n return { denom, amount };\n });\n\n return [{ type: 'Instantiate', data: { admin, codeId, label, message, funds } }];\n },\n\n defaultTitle: (inputs) => `Instantiate code ${inputs.codeId} as “${inputs.label}”`,\n defaultDescription: () => 'Instantiates a new smart contract from the code id once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ codeId: String(inputs.codeId || ''), contractLabel: String(inputs.label || '') }),\n extraOutputSchema: [\n { path: 'codeId', displayName: 'Code ID', type: 'string', description: 'The wasm code id instantiated' },\n { path: 'contractLabel', displayName: 'Contract Label', type: 'string', description: 'The label stored on the new contract' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that migrates a smart\n * contract the DAO administers to a new code id. Maps onto a single\n * `Migrate` proposal action — the consumer turns it into a\n * `MsgMigrateContract` from the DAO core, parsing the migrate msg with\n * JSON5.\n *\n * Part of the `qi/governance.contract.*` sub-family (smart contracts).\n * Advanced: only works when the DAO is the contract's admin, and a wrong\n * code id fails on-chain when the proposal executes.\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - contract: the smart contract address to migrate.\n * - codeId: the new wasm code id to migrate to (positive integer).\n * - msg: the migrate msg as a JSON string, usually `{}` (validated with\n * strict JSON here; the consumer parses it with JSON5, a superset).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.contract.migrate',\n can: 'governance.contract/migrate',\n\n buildActions: (inputs) => {\n const contract = String(inputs.contract || '').trim();\n if (!contract) throw new Error('contract is required');\n\n const codeId = Number(inputs.codeId);\n if (!Number.isInteger(codeId) || codeId <= 0) throw new Error('codeId must be a positive whole number');\n\n const msg = String(inputs.msg || '').trim();\n if (!msg) throw new Error('msg is required (use {} for contracts whose migrate entry point takes no data)');\n try {\n JSON.parse(msg);\n } catch {\n throw new Error('msg must be a valid JSON object');\n }\n\n return [{ type: 'Migrate', data: { contract, codeId, msg } }];\n },\n\n defaultTitle: (inputs) => `Migrate contract ${inputs.contract} to code ${inputs.codeId}`,\n defaultDescription: () => 'Migrates the smart contract to the new code id once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ contractAddress: String(inputs.contract || ''), codeId: String(inputs.codeId || '') }),\n extraOutputSchema: [\n { path: 'contractAddress', displayName: 'Contract Address', type: 'string', description: 'The smart contract migrated' },\n { path: 'codeId', displayName: 'Code ID', type: 'string', description: 'The wasm code id migrated to' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that transfers admin\n * rights over a smart contract the DAO administers to a new address. Maps\n * onto a single `UpdateAdmin` proposal action — the consumer turns it into\n * a `MsgUpdateAdmin` from the DAO core.\n *\n * Part of the `qi/governance.contract.*` sub-family (smart contracts).\n * Only works when the DAO is the contract's current admin; handing the\n * admin away means the DAO can no longer migrate the contract.\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - contract: the smart contract address whose admin changes.\n * - newAdmin: bech32 (ixo1…) address that becomes the contract's admin.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.contract.update-admin',\n can: 'governance.contract/update-admin',\n\n buildActions: (inputs) => {\n const contract = String(inputs.contract || '').trim();\n if (!contract) throw new Error('contract is required');\n\n const newAdmin = String(inputs.newAdmin || '').trim();\n if (!newAdmin) throw new Error('newAdmin is required');\n\n return [{ type: 'UpdateAdmin', data: { contract, newAdmin } }];\n },\n\n defaultTitle: (inputs) => `Update admin of ${inputs.contract} to ${inputs.newAdmin}`,\n defaultDescription: () => 'Transfers admin rights over the smart contract once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ contractAddress: String(inputs.contract || ''), newAdmin: String(inputs.newAdmin || '') }),\n extraOutputSchema: [\n { path: 'contractAddress', displayName: 'Contract Address', type: 'string', description: 'The smart contract whose admin changed' },\n { path: 'newAdmin', displayName: 'New Admin', type: 'string', description: 'The address that becomes the contract admin' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that tracks or untracks\n * a cw20 token in the DAO treasury. Maps onto a single `ManageCw20`\n * proposal action — the consumer turns it into an `update_cw20_list`\n * execute on the dao_core contract.\n *\n * Part of the `qi/governance.contract.*` sub-family (smart contracts).\n * Tracking only changes what the treasury displays — it never moves tokens.\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - adding: true to track the token in the treasury, false to untrack it.\n * - address: the cw20 token contract address to track or untrack.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.contract.manage-cw20',\n can: 'governance.contract/manage-cw20',\n\n buildActions: (inputs) => {\n const rawAdding = inputs.adding;\n const adding = rawAdding === true || rawAdding === 'true' ? true : rawAdding === false || rawAdding === 'false' ? false : null;\n if (adding === null) throw new Error('adding must be true (track the token) or false (untrack it)');\n\n const address = String(inputs.address || '').trim();\n if (!address) throw new Error('address is required');\n\n return [{ type: 'ManageCw20', data: { adding, address } }];\n },\n\n defaultTitle: (inputs) => {\n const adding = inputs.adding === true || inputs.adding === 'true';\n return `${adding ? 'Track' : 'Untrack'} cw20 token ${inputs.address} in the treasury`;\n },\n defaultDescription: () => 'Updates the treasury’s cw20 token list once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({\n tokenContract: String(inputs.address || ''),\n adding: inputs.adding === true || inputs.adding === 'true' ? 'true' : 'false',\n }),\n extraOutputSchema: [\n { path: 'tokenContract', displayName: 'Token Contract', type: 'string', description: 'The cw20 token contract tracked or untracked' },\n { path: 'adding', displayName: 'Tracking', type: 'string', description: \"'true' when the token was tracked, 'false' when untracked\" },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that performs a\n * validator operation with the POD's validator account. Maps onto a\n * single `ValidatorActions` proposal action — the consumer turns it into\n * the matching stargate message (MsgWithdrawValidatorCommission,\n * MsgCreateValidator, MsgEditValidator or MsgUnjail) signed by the DAO\n * core. Withdraw-commission and unjail take no message body: the consumer\n * fills in the POD's validator address automatically.\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - validatorActionType: full cosmos typeUrl of the operation (values match\n * the legacy `ValidatorActionType` enum in src/mantine/context/types.ts).\n * - createMsg: MsgCreateValidator body as JSON (CreateValidator only).\n * - editMsg: MsgEditValidator body as JSON (EditValidator only).\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\n\n// Full typeUrls, mirroring the legacy `ValidatorActionType` enum.\nconst VALIDATOR_ACTION_LABELS: Record<string, string> = {\n '/cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission': 'Withdraw validator commission',\n '/cosmos.staking.v1beta1.MsgCreateValidator': 'Create validator',\n '/cosmos.staking.v1beta1.MsgEditValidator': 'Edit validator',\n '/cosmos.slashing.v1beta1.MsgUnjail': 'Unjail validator',\n};\n\nregisterGovernanceProposalAction({\n type: 'qi/governance.validator.actions',\n can: 'governance.validator/actions',\n\n buildActions: (inputs) => {\n const validatorActionType = String(inputs.validatorActionType || '').trim();\n if (!VALIDATOR_ACTION_LABELS[validatorActionType]) {\n throw new Error('validatorActionType must be one of the supported typeUrls (MsgWithdrawValidatorCommission, MsgCreateValidator, MsgEditValidator, MsgUnjail)');\n }\n\n const isCreate = validatorActionType === '/cosmos.staking.v1beta1.MsgCreateValidator';\n const isEdit = validatorActionType === '/cosmos.staking.v1beta1.MsgEditValidator';\n\n let createMsg = '';\n if (isCreate) {\n createMsg = String(inputs.createMsg || '').trim();\n if (!createMsg) throw new Error('createMsg is required for MsgCreateValidator');\n try {\n JSON.parse(createMsg);\n } catch {\n throw new Error('createMsg must be valid JSON');\n }\n }\n\n let editMsg = '';\n if (isEdit) {\n editMsg = String(inputs.editMsg || '').trim();\n if (!editMsg) throw new Error('editMsg is required for MsgEditValidator');\n try {\n JSON.parse(editMsg);\n } catch {\n throw new Error('editMsg must be valid JSON');\n }\n }\n\n return [{ type: 'ValidatorActions', data: { validatorActionType, createMsg, editMsg } }];\n },\n\n // buildActions runs first, so the action type is always a valid option here.\n defaultTitle: (inputs) => `Validator action: ${VALIDATOR_ACTION_LABELS[String(inputs.validatorActionType)] || inputs.validatorActionType}`,\n defaultDescription: () => \"Executes the validator operation with the POD's validator account once the proposal passes.\",\n\n buildExtraOutput: (inputs) => ({\n validatorActionType: String(inputs.validatorActionType || ''),\n validatorActionLabel: VALIDATOR_ACTION_LABELS[String(inputs.validatorActionType)] || '',\n }),\n extraOutputSchema: [\n { path: 'validatorActionType', displayName: 'Validator Action Type', type: 'string', description: 'The full cosmos typeUrl of the validator operation' },\n { path: 'validatorActionLabel', displayName: 'Validator Action', type: 'string', description: 'Human-readable name of the validator operation' },\n ],\n});\n","import { registerGovernanceProposalAction } from './_shared';\n\n/**\n * @description Create an on-chain governance proposal that executes a raw\n * cosmos message exactly as written. Maps onto a single `Custom` proposal\n * action — the consumer parses the JSON (JSON5 is tolerated on the consumer\n * side, but this action validates strict JSON) into a CosmosMsg\n * (`{\"bank\":…}`, `{\"wasm\":…}`, `{\"stargate\":…}`, …) the DAO core executes\n * when the proposal passes. An expert escape hatch for anything the typed\n * blocks don't cover.\n *\n * @inputs\n * - coreAddress: DAO core contract address (blank → resolved from the\n * current entity in flow mode).\n * - message: the raw cosmos message as a JSON object string.\n * - title / description: the proposal name and long-form description voters\n * see; required in the UI, with defaults for legacy templates.\n */\nregisterGovernanceProposalAction({\n type: 'qi/governance.custom-message',\n can: 'governance/custom-message',\n\n buildActions: (inputs) => {\n const message = String(inputs.message || '').trim();\n if (!message) throw new Error('message is required');\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(message);\n } catch (err) {\n throw new Error(`message must be valid JSON: ${err instanceof Error ? err.message : String(err)}`);\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('message must be a JSON object — a single cosmos msg like {\"bank\":…}, {\"wasm\":…} or {\"stargate\":…}');\n }\n\n return [{ type: 'Custom', data: { message } }];\n },\n\n defaultTitle: () => 'Execute custom message',\n defaultDescription: () => 'Executes the raw cosmos message exactly as written once the proposal passes.',\n\n buildExtraOutput: (inputs) => ({ message: String(inputs.message || '') }),\n extraOutputSchema: [{ path: 'message', displayName: 'Message', type: 'string', description: 'The raw JSON cosmos message the proposal executes' }],\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/http.request',\n can: 'http/request',\n sideEffect: false,\n proof: { fields: ['status'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n // HTTP request can be triggered as a listener — a human assignee is DM'd\n // to invoke it when the upstream event fires. See §3.6 of the\n // events-and-triggers plan.\n eligibleForEventTrigger: true,\n\n inputSchema: {\n type: 'object',\n required: ['endpoint'],\n properties: {\n endpoint: { type: 'string', description: 'The request URL. Either endpoint or its alias url must be provided.' },\n url: { type: 'string', description: 'Alias for endpoint; the request URL. Either url or endpoint satisfies the URL requirement.' },\n method: { type: 'string', description: 'HTTP method (GET, POST, etc.). Defaults to GET.' },\n headers: { type: 'object', description: 'Request headers as a key/value map.' },\n body: { type: 'string', description: 'Request body; sent for non-GET methods. Accepts a string or an object (serialized to JSON).' },\n },\n },\n\n // run() accepts `endpoint` OR `url` — mirror the alias the schema's\n // required array can't express.\n getMissingInputs: (inputs) => (String(inputs.endpoint || inputs.url || '').trim() ? [] : ['endpoint']),\n run: async (inputs, ctx) => {\n const endpoint = inputs.endpoint ?? inputs.url;\n const url = typeof endpoint === 'string' ? endpoint : '';\n if (!url) {\n throw new Error('HTTP request action requires an endpoint or url input');\n }\n\n const method = typeof inputs.method === 'string' ? inputs.method : 'GET';\n const headers = inputs.headers && typeof inputs.headers === 'object' && !Array.isArray(inputs.headers) ? (inputs.headers as Record<string, string>) : {};\n const body = inputs.body;\n\n const requestFn = ctx.services.http?.request;\n if (requestFn) {\n const result = await requestFn({ url, method, headers, body });\n return {\n output: {\n status: result.status,\n data: result.data,\n response: JSON.stringify(result.data, null, 2),\n },\n };\n }\n\n // Fallback to native fetch\n const fetchOptions: RequestInit = {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n };\n\n if (method !== 'GET' && body) {\n fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n const data = await response.json().catch(() => ({}));\n\n return {\n output: {\n status: response.status,\n data,\n response: JSON.stringify(data, null, 2),\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/email.send',\n can: 'email/send',\n sideEffect: true,\n proof: { fields: ['messageId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'email/send',\n\n // Email send is autonomous-enough to be triggered by another block's event.\n // When wired as a listener, the assignee on the email block is DM'd to\n // invoke it for each pending event. See docs/flow-engine/events-and-triggers-plan.md §3.6.\n eligibleForEventTrigger: true,\n\n inputSchema: {\n type: 'object',\n required: ['to', 'templateName'],\n properties: {\n to: { type: 'string', description: 'Recipient email address.' },\n templateName: { type: 'string', description: 'The email template to send. A template is required — either templateName or its alias template must be provided.' },\n template: { type: 'string', description: 'Alias for templateName; the template id to send. Either template or templateName satisfies the template requirement.' },\n subject: { type: 'string', description: 'Email subject line.' },\n templateVersion: { type: 'string', description: 'Optional specific version of the template to render.' },\n variables: { type: 'object', description: 'Template variables to interpolate; may be passed as an object or a JSON string.' },\n cc: { type: 'string', description: 'Carbon-copy recipient address.' },\n bcc: { type: 'string', description: 'Blind-carbon-copy recipient address.' },\n replyTo: { type: 'string', description: 'Reply-to address for the email.' },\n },\n },\n\n outputSchema: [\n { path: 'messageId', displayName: 'Message ID', type: 'string', description: 'The unique ID of the sent email' },\n { path: 'sentAt', displayName: 'Sent At', type: 'string', description: 'Timestamp when the email was sent' },\n ],\n\n // run() accepts `template` OR `templateName` for the template — the\n // schema's required array can't express the alias, so mirror the OR here.\n getMissingInputs: (inputs) => {\n const missing: string[] = [];\n if (!String(inputs.to || '').trim()) missing.push('to');\n if (!String(inputs.template || '').trim() && !String(inputs.templateName || '').trim()) missing.push('templateName');\n return missing;\n },\n run: async (inputs, ctx) => {\n if (!ctx.services.email) {\n throw new Error('Email service not configured');\n }\n\n const { to, subject, template, templateName, templateVersion, variables, cc, bcc, replyTo } = inputs;\n const resolvedTemplate = template || templateName;\n\n if (!resolvedTemplate) throw new Error('No template selected');\n if (!to) throw new Error('Recipient (to) is required');\n\n // variables may be a JSON string from the config editor — parse if needed\n let resolvedVariables = variables;\n if (typeof resolvedVariables === 'string') {\n try {\n resolvedVariables = JSON.parse(resolvedVariables);\n } catch {\n resolvedVariables = {};\n }\n }\n\n const result = await ctx.services.email.send({\n to,\n subject,\n template: resolvedTemplate,\n templateVersion,\n variables: resolvedVariables,\n cc,\n bcc,\n replyTo,\n });\n\n return {\n output: {\n messageId: result.messageId,\n sentAt: result.sentAt || new Date().toISOString(),\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/human.checkbox.set',\n can: 'human/checkbox',\n sideEffect: true,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n requiredCapability: 'flow/execute',\n\n inputSchema: {\n type: 'object',\n required: [],\n properties: {\n checked: { type: 'boolean', description: 'Whether the checkbox should be checked (defaults to true).' },\n },\n },\n\n run: async (inputs) => {\n // Default to true — \"executing\" a checkbox means checking it\n const checked = inputs.checked !== undefined ? !!inputs.checked : true;\n return { output: { checked } };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nfunction normalizeAnswers(rawAnswers: unknown): Record<string, unknown> {\n if (rawAnswers == null) {\n return {};\n }\n\n if (typeof rawAnswers === 'string') {\n try {\n const parsed = JSON.parse(rawAnswers) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error();\n }\n return parsed as Record<string, unknown>;\n } catch {\n throw new Error('answers must be a valid JSON object');\n }\n }\n\n if (typeof rawAnswers !== 'object' || Array.isArray(rawAnswers)) {\n throw new Error('answers must be an object');\n }\n\n return rawAnswers as Record<string, unknown>;\n}\n\nfunction registerFormSubmitAction(type: string, can?: string): void {\n registerAction({\n type,\n can,\n sideEffect: true,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n requiredCapability: 'flow/execute',\n // Additive: makes the form an event SOURCE so downstream blocks can\n // auto-trigger on submission (e.g. form → send email). Nothing existing\n // consumes this; it only enables new event wiring.\n eligibleForEventTrigger: true,\n inputSchema: {\n type: 'object',\n required: [],\n properties: {\n answers: { type: 'object', description: 'Form answers as an object or JSON-string object; also read from form.answers.' },\n },\n },\n outputSchema: [\n { path: 'form.answers', displayName: 'Form Answers JSON', type: 'string', description: 'JSON stringified form answers, matching form block runtime output.' },\n { path: 'answers', displayName: 'Form Answers', type: 'object', description: 'Parsed form answers object for convenience.' },\n ],\n events: [\n {\n name: 'form.submitted',\n displayName: 'Form submitted',\n description: 'Fires when the human submits the form. Payload carries the parsed answers.',\n payloadSchema: [{ path: 'answers', displayName: 'Form Answers', type: 'object' }],\n pendingDisplayFields: ['answers'],\n },\n ],\n run: async (inputs) => {\n const answers = normalizeAnswers(inputs.answers ?? inputs.form?.answers);\n const answersJson = JSON.stringify(answers);\n\n return {\n output: {\n form: {\n answers: answersJson,\n },\n answers,\n },\n events: [{ name: 'form.submitted', payload: { answers } }],\n };\n },\n });\n}\n\n// Canonical action type that aligns with the form block naming.\nregisterFormSubmitAction('qi/form.submit', 'form/submit');\n// Backward-compatible alias for existing saved flows.\nregisterFormSubmitAction('qi/human.form.submit', 'human/form');\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/flow.run.start',\n can: 'flow/run.start',\n sideEffect: true,\n proof: { fields: ['runId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/run.start',\n executionOwner: 'agent',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string' },\n },\n },\n outputSchema: [\n { path: 'runId', displayName: 'Session run id', type: 'string' },\n { path: 'eventId', displayName: 'Started event id', type: 'string' },\n { path: 'startedAt', displayName: 'Started at', type: 'number' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.flowRuns?.start) {\n throw new Error('flowRuns.start handler not available');\n }\n return {\n output: await ctx.services.flowRuns.start({\n actorDid: ctx.actorDid,\n flowId: ctx.flowId,\n flowUri: ctx.flowUri,\n ...(typeof inputs.label === 'string' && inputs.label ? { label: inputs.label } : {}),\n }),\n };\n },\n});\n\nregisterAction({\n type: 'qi/flow.run.close',\n can: 'flow/run.close',\n sideEffect: true,\n proof: { fields: ['status'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/run.close',\n executionOwner: 'agent',\n eligibleForEventTrigger: true,\n inputSchema: {\n type: 'object',\n properties: {\n allowIncomplete: { type: 'boolean' },\n cancel: { type: 'boolean' },\n reason: { type: 'string' },\n },\n },\n outputSchema: [\n { path: 'status', displayName: 'Terminal status', type: 'string' },\n { path: 'eventId', displayName: 'Terminal event id', type: 'string' },\n { path: 'closedAt', displayName: 'Closed at', type: 'number' },\n { path: 'cancelledAt', displayName: 'Cancelled at', type: 'number' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.sessionRunId) {\n throw new Error('flow/run.close requires an explicit session run id');\n }\n if (!ctx.services.flowRuns) {\n throw new Error('flowRuns lifecycle handler not available');\n }\n if (inputs.cancel === true) {\n return {\n output: await ctx.services.flowRuns.cancel({\n actorDid: ctx.actorDid,\n flowId: ctx.flowId,\n flowUri: ctx.flowUri,\n runId: ctx.sessionRunId,\n ...(typeof inputs.reason === 'string' && inputs.reason ? { reason: inputs.reason } : {}),\n }),\n };\n }\n return {\n output: await ctx.services.flowRuns.close({\n actorDid: ctx.actorDid,\n flowId: ctx.flowId,\n flowUri: ctx.flowUri,\n runId: ctx.sessionRunId,\n allowIncomplete: inputs.allowIncomplete === true,\n }),\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/notification.push',\n can: 'notification/push',\n sideEffect: true,\n proof: { fields: ['messageId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'notify/send',\n inputSchema: {\n type: 'object',\n required: ['to'],\n properties: {\n channel: { type: 'string', description: 'Delivery channel for the notification.' },\n to: { type: 'array', description: 'Recipient(s); a single value or array, at least one required.' },\n cc: { type: 'array', description: 'CC recipients.' },\n bcc: { type: 'array', description: 'BCC recipients.' },\n subject: { type: 'string', description: 'Notification subject.' },\n body: { type: 'string', description: 'Notification body content.' },\n bodyType: { type: 'string', description: \"Body format: 'text' or 'html'.\" },\n from: { type: 'string', description: 'Sender address.' },\n replyTo: { type: 'string', description: 'Reply-to address.' },\n },\n },\n\n run: async (inputs, ctx) => {\n if (!ctx.services.notify) {\n throw new Error('Notification service not configured');\n }\n\n const { channel, to, cc, bcc, subject, body, bodyType, from, replyTo } = inputs;\n\n if (!to || (Array.isArray(to) && to.length === 0)) {\n throw new Error('At least one recipient is required');\n }\n\n const result = await ctx.services.notify.send({\n channel,\n to: Array.isArray(to) ? to : [to],\n cc,\n bcc,\n subject,\n body,\n bodyType,\n from,\n replyTo,\n });\n\n return {\n output: {\n messageId: result.messageId,\n sentAt: result.sentAt || new Date().toISOString(),\n },\n };\n },\n});\n","import type { ActionContext, ActionResult } from '../../types';\n\n/**\n * Group execution — \"act as the DAO DAO group\" — for work blocks (claim,\n * evaluate-claim, bid, evaluate-bid, collection lifecycle, collection users).\n *\n * When a user chooses to act on behalf of their governance group instead of\n * their own account, the block does NOT broadcast the side effect directly.\n * Instead:\n *\n * 1. The consumer prepares the SAME on-chain message(s) with the group's\n * core address as the actor (agent / grantee) and returns them\n * protobuf-encoded (`EncodedProposalMsg`), so the editor stays\n * codec-free.\n * 2. The editor wraps them in an on-chain governance proposal via\n * `handlers.createGroupExecutionProposal` — the user signs only the\n * proposal creation (they must be a member of the group).\n * 3. The run returns `awaiting_readback`: the block is NOT complete and\n * downstream blocks stay gated. The FlowDetail polls the proposal and\n * reconciles the block to `completed` (with the same outputs a direct\n * signature would have produced) once the proposal passes and executes —\n * or `failed` when it is rejected.\n *\n * Off-chain side effects that a proposal cannot execute (Matrix bot calls —\n * bid submission, bid status updates) run as a `finalize` step: the\n * initiating user's client performs them after the proposal executes, with\n * the group's approval recorded on-chain in the proposal itself.\n */\n\n/** A protobuf message pre-encoded by the consumer: `value` is base64 bytes. */\nexport interface EncodedProposalMsg {\n typeUrl: string;\n value: string;\n}\n\n/** readBack.kind marking a run that awaits a group proposal's execution. */\nexport const GROUP_PROPOSAL_READBACK_KIND = 'group-proposal';\n\n/** Common inputs every group-executable action accepts on top of its own. */\nexport interface GroupExecutionInputs {\n /** True (or 'true') → act as the group instead of the current user. */\n actAsGroup?: boolean | string;\n /** DAO core contract address of the group being acted for. */\n groupCoreAddress?: string;\n /** Proposal name shown to voters. Required in group mode. */\n proposalTitle?: string;\n /** Long-form proposal description shown to voters. Required in group mode. */\n proposalDescription?: string;\n}\n\nexport function isGroupExecution(inputs: Record<string, any>): boolean {\n return inputs?.actAsGroup === true || inputs?.actAsGroup === 'true';\n}\n\n/** Validate and pull the group-execution params out of merged inputs. */\nexport function requireGroupExecutionParams(inputs: Record<string, any>): { coreAddress: string; title: string; description: string } {\n const coreAddress = String(inputs.groupCoreAddress || '').trim();\n if (!coreAddress) throw new Error('groupCoreAddress is required when acting as a POD');\n const title = String(inputs.proposalTitle || '').trim();\n if (!title) throw new Error('proposalTitle is required when acting as a POD — voters must see what they are approving');\n const description = String(inputs.proposalDescription || '').trim();\n if (!description) throw new Error('proposalDescription is required when acting as a POD — voters must see what they are approving');\n return { coreAddress, title, description };\n}\n\nexport interface ProposeGroupExecutionParams {\n coreAddress: string;\n title: string;\n description: string;\n /** Pre-encoded chain messages the proposal executes when it passes. May be\n * empty for approval-only proposals whose side effect is a finalize step. */\n msgs: EncodedProposalMsg[];\n /**\n * The output fields the block will complete with once the proposal\n * executes — the same shape a direct signature would have produced, so\n * downstream references keep working.\n */\n expectedOutput: Record<string, any>;\n /**\n * Optional finalize step key for off-chain side effects the proposal cannot\n * execute (e.g. 'bid.submit' → the initiating user's client submits the\n * Matrix bid after the group approves). Resolved by the FlowDetail's\n * read-back driver.\n */\n finalize?: string;\n /** Params the finalize step needs, persisted in readBack metadata. */\n finalizeParams?: Record<string, any>;\n /**\n * Event name to emit (with the completed output as payload) when the block\n * completes via read-back — keeps listener blocks working in group mode\n * (e.g. the claim block's 'submitted' event).\n */\n completionEvent?: string;\n}\n\n/**\n * Create the group proposal and return the `awaiting_readback` ActionResult.\n * Call from an action's `run()` after `isGroupExecution(inputs)` matched and\n * the action-specific messages were prepared.\n */\nexport async function proposeGroupExecution(ctx: ActionContext, params: ProposeGroupExecutionParams): Promise<ActionResult> {\n const handlers = ctx.handlers as any;\n if (!handlers?.createGroupExecutionProposal) {\n throw new Error('Group execution is not available: the host does not implement createGroupExecutionProposal');\n }\n\n const { coreAddress, title, description, msgs, expectedOutput, finalize, finalizeParams, completionEvent } = params;\n\n const { proposalId, proposalContractAddress } = await handlers.createGroupExecutionProposal({\n coreAddress,\n title,\n description,\n msgs,\n });\n\n if (proposalId === undefined || proposalId === null || String(proposalId).trim() === '') {\n throw new Error('POD proposal creation returned no proposal id. Check the handler logs.');\n }\n\n return {\n output: {\n ...expectedOutput,\n groupExecution: true,\n groupCoreAddress: coreAddress,\n groupProposalId: String(proposalId),\n groupProposalContractAddress: String(proposalContractAddress || ''),\n proposalTitle: title,\n proposalDescription: description,\n },\n completion: {\n state: 'awaiting_readback',\n readBack: {\n kind: GROUP_PROPOSAL_READBACK_KIND,\n proposalId: String(proposalId),\n proposalContractAddress: String(proposalContractAddress || ''),\n coreAddress,\n expectedOutput,\n ...(completionEvent ? { completionEvent } : {}),\n ...(finalize ? { finalize, finalizeParams: finalizeParams || {} } : {}),\n },\n },\n };\n}\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { isGroupExecution, proposeGroupExecution, requireGroupExecutionParams } from '../_shared/groupExecution';\nimport type { BidRunInputs } from './types';\n\nfunction normalizeBidRole(role: string): 'SA' | 'EA' {\n const normalized = String(role || '')\n .trim()\n .toLowerCase();\n if (normalized === 'service_agent' || normalized === 'sa') return 'SA';\n if (normalized === 'evaluation_agent' || normalized === 'ea') return 'EA';\n throw new Error('Invalid bid role. Expected service_agent or evaluation_agent');\n}\n\nregisterAction<BidRunInputs>({\n type: 'qi/bid.submit',\n can: 'bid/submit',\n sideEffect: true,\n proof: { fields: ['bidId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n inputSchema: {\n type: 'object',\n required: ['collectionId', 'role', 'surveyAnswers'],\n properties: {\n collectionId: { type: 'string', description: 'Claim collection identifier the bid is submitted against.' },\n role: { type: 'string', description: 'Bid role: service_agent or evaluation_agent.' },\n surveyAnswers: { type: 'object', description: 'Survey answers object (or a JSON string parsed to an object) attached to the bid.' },\n deedDid: { type: 'string', description: 'Optional deed/entity DID associated with the bid.' },\n },\n },\n outputSchema: [\n { path: 'bidId', displayName: 'Bid ID', type: 'string', description: 'The submitted bid identifier' },\n { path: 'collectionId', displayName: 'Collection ID', type: 'string', description: 'Claim collection identifier' },\n { path: 'role', displayName: 'Role', type: 'string', description: 'Submitted role (service_agent or evaluation_agent)' },\n { path: 'submitterDid', displayName: 'Submitter DID', type: 'string', description: 'Actor DID that submitted the bid' },\n { path: 'deedDid', displayName: 'Deed DID', type: 'string', description: 'Deed identifier if provided' },\n ],\n run: async (inputs, ctx) => {\n const service = ctx.services.bid;\n if (!service) {\n throw new Error('Bid service not configured');\n }\n\n const collectionId = String(inputs.collectionId || '').trim();\n const roleInput = String(inputs.role || '').trim();\n let surveyAnswers = inputs.surveyAnswers;\n const deedDid = String(inputs.deedDid || '').trim();\n\n if (!collectionId) throw new Error('collectionId is required');\n if (!roleInput) throw new Error('role is required');\n if (typeof surveyAnswers === 'string') {\n try {\n surveyAnswers = JSON.parse(surveyAnswers);\n } catch {\n throw new Error('surveyAnswers must be a valid JSON object');\n }\n }\n\n if (!surveyAnswers || typeof surveyAnswers !== 'object' || Array.isArray(surveyAnswers)) {\n throw new Error('surveyAnswers must be an object');\n }\n\n const chainRole = normalizeBidRole(roleInput);\n\n // ---- Act as the DAO group: propose first, submit after approval --------\n // A bid is a Matrix bid-bot submission — a proposal cannot execute it\n // on-chain. Group mode therefore creates an APPROVAL proposal (no\n // messages, the bid content in the description); once the group passes\n // it, the initiating user's client performs the actual bid submission as\n // the finalize step, with the group's approval recorded on-chain.\n if (isGroupExecution(inputs)) {\n const { coreAddress, title, description } = requireGroupExecutionParams(inputs);\n return proposeGroupExecution(ctx, {\n coreAddress,\n title,\n description,\n msgs: [],\n expectedOutput: {\n bidId: '',\n collectionId,\n role: roleInput,\n submitterDid: coreAddress,\n deedDid,\n },\n finalize: 'bid.submit',\n finalizeParams: {\n collectionId,\n role: chainRole,\n surveyAnswers,\n entityDid: deedDid || undefined,\n // The bid bot records the bid under the POD's identity so the\n // approval grants the claim authorization to the POD, not the\n // member who submitted on its behalf.\n onBehalfOfAddress: coreAddress,\n },\n });\n }\n\n const submission = await service.submitBid({\n collectionId,\n role: chainRole,\n surveyAnswers,\n entityDid: deedDid || undefined,\n });\n\n const bidId = String((submission as any)?.claimId || (submission as any)?.bidId || (submission as any)?.id || '');\n if (!bidId) {\n throw new Error('submitBid returned no bid identifier');\n }\n\n return {\n output: {\n bidId,\n collectionId,\n role: roleInput,\n submitterDid: ctx.actorDid || '',\n deedDid,\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { isGroupExecution, proposeGroupExecution, requireGroupExecutionParams } from '../_shared/groupExecution';\nimport type { EvaluateBidRunInputs } from './types';\n\ntype Decision = 'approve' | 'reject';\n\nfunction normalizeDecision(value: string): Decision {\n const normalized = String(value || '')\n .trim()\n .toLowerCase();\n if (normalized === 'approve' || normalized === 'reject') {\n return normalized;\n }\n throw new Error('decision must be either approve or reject');\n}\n\nfunction isServiceAgentRole(role: string): boolean {\n const normalized = String(role || '')\n .trim()\n .toLowerCase();\n return normalized === 'service_agent' || normalized === 'sa';\n}\n\nfunction isEvaluationAgentRole(role: string): boolean {\n const normalized = String(role || '')\n .trim()\n .toLowerCase();\n return normalized === 'evaluation_agent' || normalized === 'ea';\n}\n\nregisterAction<EvaluateBidRunInputs>({\n type: 'qi/bid.evaluate',\n can: 'bid/evaluate',\n // Superseded by qi/collection.users (IXO-2586) — not offered to authors\n // anymore; kept registered so existing flows and templates still work.\n hiddenFromAuthoring: true,\n sideEffect: true,\n proof: { fields: ['bidId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n outputSchema: [\n { path: 'bidId', displayName: 'Bid ID', type: 'string', description: 'Evaluated bid identifier' },\n { path: 'decision', displayName: 'Decision', type: 'string', description: 'approve or reject' },\n { path: 'status', displayName: 'Status', type: 'string', description: 'approved or rejected' },\n { path: 'evaluatedByDid', displayName: 'Evaluated By DID', type: 'string', description: 'Actor DID that evaluated the bid' },\n { path: 'evaluatedAt', displayName: 'Evaluated At', type: 'string', description: 'ISO timestamp of evaluation' },\n { path: 'reason', displayName: 'Reason', type: 'string', description: 'Rejection reason when decision is reject' },\n { path: 'collectionId', displayName: 'Collection ID', type: 'string', description: 'Claim collection identifier' },\n { path: 'role', displayName: 'Role', type: 'string', description: 'Applicant role' },\n { path: 'deedDid', displayName: 'Deed DID', type: 'string', description: 'Deed identifier' },\n { path: 'applicantDid', displayName: 'Applicant DID', type: 'string', description: 'Applicant DID' },\n { path: 'applicantAddress', displayName: 'Applicant Address', type: 'string', description: 'Applicant wallet address' },\n ],\n inputSchema: {\n type: 'object',\n required: ['decision', 'bidId', 'collectionId', 'deedDid', 'role', 'applicantDid', 'applicantAddress'],\n properties: {\n decision: { type: 'string', description: 'Evaluation decision: approve or reject.' },\n bidId: { type: 'string', description: 'Identifier of the bid being evaluated.' },\n collectionId: { type: 'string', description: 'Claim collection identifier.' },\n deedDid: { type: 'string', description: 'Deed (entity) DID.' },\n role: { type: 'string', description: 'Applicant role: service_agent (sa) or evaluation_agent (ea).' },\n applicantDid: { type: 'string', description: 'Applicant DID.' },\n applicantAddress: { type: 'string', description: 'Applicant wallet address.' },\n adminAddress: { type: 'string', description: 'Entity admin account address; required when decision is approve.' },\n maxAmounts: { type: 'string', description: 'JSON-encoded per-claim max amounts for the evaluation_agent approval.' },\n reason: { type: 'string', description: 'Rejection reason; required when decision is reject.' },\n },\n },\n run: async (inputs, ctx) => {\n const service = ctx.services.bid;\n if (!service) {\n throw new Error('Bid service not configured');\n }\n\n const decision = normalizeDecision(inputs.decision);\n const bidId = String(inputs.bidId || '').trim();\n const collectionId = String(inputs.collectionId || '').trim();\n const deedDid = String(inputs.deedDid || '').trim();\n const role = String(inputs.role || '').trim();\n const applicantDid = String(inputs.applicantDid || '').trim();\n const applicantAddress = String(inputs.applicantAddress || '').trim();\n\n if (!bidId) throw new Error('bidId is required');\n if (!collectionId) throw new Error('collectionId is required');\n if (!deedDid) throw new Error('deedDid is required');\n if (!role) throw new Error('role is required');\n if (!applicantDid) throw new Error('applicantDid is required');\n if (!applicantAddress) throw new Error('applicantAddress is required');\n\n // ---- Act as the DAO group: propose instead of broadcasting directly ----\n // Approve: the authz-grant chain messages go in the proposal (the GROUP\n // must hold the entity owner's authorization to grant); the Matrix bid\n // status update runs as the finalize step after execution. Reject is\n // Matrix-only, so it is an approval proposal whose finalize performs the\n // rejection.\n if (isGroupExecution(inputs)) {\n const { coreAddress, title, description } = requireGroupExecutionParams(inputs);\n const expectedOutput = {\n bidId,\n decision,\n status: decision === 'approve' ? 'approved' : 'rejected',\n evaluatedByDid: coreAddress,\n evaluatedAt: new Date().toISOString(),\n reason: decision === 'reject' ? String(inputs.reason || '') : '',\n collectionId,\n role,\n deedDid,\n applicantDid,\n applicantAddress,\n };\n\n if (decision === 'approve') {\n const adminAddress = String(inputs.adminAddress || '').trim();\n if (!adminAddress) throw new Error('adminAddress is required when decision is approve');\n if (!isServiceAgentRole(role) && !isEvaluationAgentRole(role)) {\n throw new Error('Invalid role for evaluation. Expected service_agent or evaluation_agent');\n }\n const groupHandlers = ctx.handlers as any;\n if (typeof groupHandlers?.prepareGroupAgentApplicationApproval !== 'function') {\n throw new Error('Acting as a POD is not available: the host does not implement prepareGroupAgentApplicationApproval');\n }\n let maxAmounts = inputs.maxAmounts;\n if (typeof maxAmounts === 'string' && maxAmounts.trim()) {\n try {\n maxAmounts = JSON.parse(maxAmounts);\n } catch {\n throw new Error('maxAmounts must be valid JSON when provided');\n }\n }\n const prepared = await groupHandlers.prepareGroupAgentApplicationApproval({\n groupAddress: coreAddress,\n deedDid,\n collectionId,\n adminAddress,\n role: isServiceAgentRole(role) ? 'service_agent' : 'evaluation_agent',\n applicantAddress,\n agentQuota: isServiceAgentRole(role) ? 30 : 10,\n maxAmounts: Array.isArray(maxAmounts) ? maxAmounts : undefined,\n });\n return proposeGroupExecution(ctx, {\n coreAddress,\n title,\n description,\n msgs: prepared.msgs || [],\n expectedOutput,\n finalize: 'bid.approve',\n finalizeParams: { bidId, collectionId, did: applicantDid, entityDid: deedDid },\n });\n }\n\n const reason = String(inputs.reason || '').trim();\n if (!reason) throw new Error('reason is required when decision is reject');\n return proposeGroupExecution(ctx, {\n coreAddress,\n title,\n description,\n msgs: [],\n expectedOutput,\n finalize: 'bid.reject',\n finalizeParams: { bidId, collectionId, did: deedDid, reason, entityDid: deedDid },\n });\n }\n\n if (decision === 'approve') {\n const adminAddress = String(inputs.adminAddress || '').trim();\n if (!adminAddress) {\n throw new Error('adminAddress is required when decision is approve');\n }\n\n if (isServiceAgentRole(role)) {\n await service.approveServiceAgentApplication({\n adminAddress,\n collectionId,\n agentQuota: 30,\n deedDid,\n currentUserAddress: applicantAddress,\n });\n } else if (isEvaluationAgentRole(role)) {\n let maxAmounts = inputs.maxAmounts;\n if (typeof maxAmounts === 'string') {\n try {\n maxAmounts = JSON.parse(maxAmounts);\n } catch {\n throw new Error('maxAmounts must be valid JSON when provided');\n }\n }\n\n await service.approveEvaluatorApplication({\n adminAddress,\n collectionId,\n deedDid,\n evaluatorAddress: applicantAddress,\n agentQuota: 10,\n maxAmounts: Array.isArray(maxAmounts) ? maxAmounts : undefined,\n });\n } else {\n throw new Error('Invalid role for evaluation. Expected service_agent or evaluation_agent');\n }\n\n await service.approveBid({\n bidId,\n collectionId,\n did: applicantDid,\n entityDid: deedDid,\n });\n } else {\n const reason = String(inputs.reason || '').trim();\n if (!reason) {\n throw new Error('reason is required when decision is reject');\n }\n await service.rejectBid({\n bidId,\n collectionId,\n did: deedDid,\n reason,\n entityDid: deedDid,\n });\n }\n\n return {\n output: {\n bidId,\n decision,\n status: decision === 'approve' ? 'approved' : 'rejected',\n evaluatedByDid: ctx.actorDid || '',\n evaluatedAt: new Date().toISOString(),\n reason: decision === 'reject' ? String(inputs.reason || '') : '',\n collectionId,\n role,\n deedDid,\n applicantDid,\n applicantAddress,\n },\n };\n },\n});\n","import type { OutputSchemaField } from '../../types';\n\n/**\n * SurveyJS question types mapped to our OutputSchemaField types. Unknown\n * SurveyJS types default to 'string' — these show up as text refs in the\n * downstream reference picker, which is safe but unhelpful; extend the map\n * when new survey question types appear in real templates.\n */\nconst TYPE_MAP: Record<string, OutputSchemaField['type']> = {\n text: 'string',\n comment: 'string',\n html: 'string',\n expression: 'string',\n dropdown: 'string',\n radiogroup: 'string',\n rating: 'number',\n number: 'number',\n boolean: 'boolean',\n checkbox: 'array',\n tagbox: 'array',\n ranking: 'array',\n imagepicker: 'array',\n file: 'array',\n paneldynamic: 'array',\n matrix: 'object',\n matrixdropdown: 'object',\n matrixdynamic: 'object',\n multipletext: 'object',\n panel: 'object',\n};\n\ninterface SurveyElement {\n name?: string;\n title?: string;\n type?: string;\n description?: string;\n elements?: SurveyElement[]; // panels nest\n /** paneldynamic: shape of each iteration row. */\n templateElements?: SurveyElement[];\n}\n\ninterface SurveyJson {\n pages?: Array<{ elements?: SurveyElement[] }>;\n elements?: SurveyElement[];\n}\n\n/**\n * Extract the answer schema from a SurveyJS template.\n *\n * Recurses into `panel` containers so grouped questions surface as flat\n * `surveyAnswers.<name>` fields. Returns [] for an empty / unparseable survey\n * so callers can treat \"no schema yet\" as a normal state.\n *\n * The returned field paths are **relative** — callers typically prefix them\n * with `surveyAnswers.` when composing an event payload schema.\n */\nexport function extractSurveyAnswerSchema(survey: unknown): OutputSchemaField[] {\n if (!survey || typeof survey !== 'object') return [];\n const json = survey as SurveyJson;\n\n const collected: OutputSchemaField[] = [];\n const seen = new Set<string>();\n\n const walk = (elements: SurveyElement[] | undefined) => {\n if (!Array.isArray(elements)) return;\n for (const el of elements) {\n if (!el || typeof el !== 'object') continue;\n // Panels don't hold an answer themselves — descend into their children.\n if (el.type === 'panel' && Array.isArray(el.elements)) {\n walk(el.elements);\n continue;\n }\n const name = typeof el.name === 'string' ? el.name.trim() : '';\n if (!name) continue;\n if (seen.has(name)) continue;\n seen.add(name);\n\n const rawType = typeof el.type === 'string' ? el.type : '';\n const mapped = TYPE_MAP[rawType] ?? 'string';\n\n // For paneldynamic, recurse into `templateElements` to capture the\n // per-item shape. Element-scoped pickers (iterative mappers) read this\n // from `OutputSchemaField.itemSchema`.\n let itemSchema: OutputSchemaField[] | undefined;\n if (rawType === 'paneldynamic' && Array.isArray(el.templateElements) && el.templateElements.length > 0) {\n const nested: OutputSchemaField[] = [];\n const nestedSeen = new Set<string>();\n const walkNested = (inner: SurveyElement[]) => {\n for (const child of inner) {\n if (!child || typeof child !== 'object') continue;\n if (child.type === 'panel' && Array.isArray(child.elements)) {\n walkNested(child.elements);\n continue;\n }\n const childName = typeof child.name === 'string' ? child.name.trim() : '';\n if (!childName || nestedSeen.has(childName)) continue;\n nestedSeen.add(childName);\n const childType = typeof child.type === 'string' ? child.type : '';\n nested.push({\n path: childName,\n displayName: stripHtml(String(child.title || '').trim() || humanize(childName)),\n type: TYPE_MAP[childType] ?? 'string',\n description: typeof child.description === 'string' && child.description.trim() ? stripHtml(child.description.trim()) : undefined,\n });\n }\n };\n walkNested(el.templateElements);\n if (nested.length > 0) itemSchema = nested;\n }\n\n collected.push({\n path: name,\n displayName: stripHtml(String(el.title || '').trim() || humanize(name)),\n type: mapped,\n description: typeof el.description === 'string' && el.description.trim() ? stripHtml(el.description.trim()) : undefined,\n ...(itemSchema ? { itemSchema } : {}),\n });\n }\n };\n\n if (Array.isArray(json.pages) && json.pages.length > 0) {\n for (const page of json.pages) walk(page.elements);\n }\n walk(json.elements);\n\n return collected;\n}\n\n/**\n * Prefix a survey-answer schema with `surveyAnswers.` so the fields slot into\n * an event payloadSchema cleanly.\n */\nexport function prefixSurveyAnswerSchema(fields: OutputSchemaField[], namespace = 'surveyAnswers'): OutputSchemaField[] {\n // Preserve `itemSchema` when prefixing — only the top-level path moves.\n return fields.map((f) => ({\n ...f,\n path: `${namespace}.${f.path}`,\n }));\n}\n\nfunction humanize(name: string): string {\n return name.replace(/[-_]+/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction stripHtml(s: string): string {\n return s\n .replace(/<[^>]*>/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n","import { registerAction, neverDone } from '../../registry';\nimport type { ActionEventDefinition, OutputSchemaField } from '../../types';\nimport { isGroupExecution, proposeGroupExecution, requireGroupExecutionParams } from '../_shared/groupExecution';\nimport { prefixSurveyAnswerSchema } from './surveySchema';\nimport type { ClaimRunInputs } from './types';\n\nconst BASELINE_OUTPUT: OutputSchemaField[] = [\n { path: 'claimId', displayName: 'Claim ID', type: 'string', description: 'The submitted claim identifier' },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'Submission transaction hash' },\n { path: 'collectionId', displayName: 'Collection ID', type: 'string', description: 'Claim collection identifier' },\n { path: 'deedDid', displayName: 'Deed DID', type: 'string', description: 'Deed identifier' },\n { path: 'submittedByDid', displayName: 'Submitted By DID', type: 'string', description: 'Actor DID that submitted the claim' },\n { path: 'submittedAt', displayName: 'Submitted At', type: 'string', description: 'ISO timestamp of submission' },\n];\n\nregisterAction<ClaimRunInputs>({\n type: 'qi/claim.submit',\n can: 'claim/submit',\n sideEffect: true,\n // Dynamic resolvers predate merge-by-default and intentionally control\n // the full vocabulary (e.g. returning [] to hide the static baseline).\n dynamicResolutionMode: 'replace',\n proof: { fields: ['claimId'] },\n done: neverDone,\n // Repeatable: a collection accepts many claims over the flow's life (e.g. a\n // monthly submission). Never latches to a terminal Done. See cardinality.\n cardinality: 'many',\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: true,\n inputSchema: {\n type: 'object',\n required: ['deedDid', 'collectionId', 'adminAddress', 'surveyAnswers'],\n properties: {\n deedDid: { type: 'string', description: 'The entity/deed DID that owns the claim collection.' },\n collectionId: { type: 'string', description: 'The claim collection to submit into.' },\n adminAddress: { type: 'string', description: \"The claim collection admin's chain address.\" },\n surveyAnswers: { type: 'object', description: \"The claim's answer data (the submitted form); may be passed as an object or a JSON string.\" },\n pin: { type: 'string', description: 'Verification PIN; requested at runtime if omitted.' },\n },\n },\n // Static fallback — used until a collection is picked and the survey\n // schema is materialised. `getDynamicOutputSchema` takes over after that.\n outputSchema: BASELINE_OUTPUT,\n /**\n * Per-block output schema — same shape as `run()`'s `output`. Picks up the\n * materialised survey schema so the DataInput reference picker can surface\n * `output.surveyAnswers.<question>` alongside the baseline claim fields.\n */\n getDynamicOutputSchema: (inputs): OutputSchemaField[] => {\n const schema: OutputSchemaField[] = Array.isArray((inputs as any)?.surveyAnswersSchema) ? (inputs as any).surveyAnswersSchema : [];\n if (schema.length === 0) return BASELINE_OUTPUT;\n return [...BASELINE_OUTPUT, ...prefixSurveyAnswerSchema(schema)];\n },\n /**\n * Per-block event resolver. Returns `[]` until a claim collection has been\n * picked in template mode (which is when we can materialise the survey's\n * answer schema into inputs). Once present, emits a `submitted` event with\n * baseline claim fields plus `surveyAnswers.<question>` for every question\n * in the survey template — letting listener blocks consume typed refs like\n * `${sourceBlock.payload.surveyAnswers.email}`.\n */\n getDynamicEvents: (inputs): ActionEventDefinition[] => {\n const schema: OutputSchemaField[] = Array.isArray((inputs as any)?.surveyAnswersSchema) ? (inputs as any).surveyAnswersSchema : [];\n if (schema.length === 0) return [];\n\n const surveyFields = prefixSurveyAnswerSchema(schema);\n return [\n {\n name: 'submitted',\n displayName: 'Claim submitted',\n description: 'Fires when a claim is submitted to this collection. Payload includes the submitted survey answers, fully typed to the collection survey.',\n payloadSchema: [...BASELINE_OUTPUT, ...surveyFields],\n pendingDisplayFields: ['claimId', 'submittedAt'],\n },\n ];\n },\n run: async (inputs, ctx) => {\n const service = ctx.services.claim;\n if (!service) {\n throw new Error('Claim service not configured');\n }\n\n const deedDid = String(inputs.deedDid || '').trim();\n const collectionId = String(inputs.collectionId || '').trim();\n const adminAddress = String(inputs.adminAddress || '').trim();\n\n if (!deedDid) throw new Error('deedDid is required');\n if (!collectionId) throw new Error('collectionId is required');\n if (!adminAddress) throw new Error('adminAddress is required');\n\n let surveyAnswers = inputs.surveyAnswers;\n if (typeof surveyAnswers === 'string') {\n try {\n surveyAnswers = JSON.parse(surveyAnswers);\n } catch {\n throw new Error('surveyAnswers must be valid JSON');\n }\n }\n\n if (!surveyAnswers || typeof surveyAnswers !== 'object' || Array.isArray(surveyAnswers)) {\n throw new Error('surveyAnswers must be an object');\n }\n\n let pin = String(inputs.pin || '').trim();\n if (!pin) {\n pin = await service.requestPin({\n title: 'Verify Identity',\n description: 'Enter your PIN to submit the claim',\n submitText: 'Verify',\n });\n }\n if (!pin) {\n throw new Error('PIN is required to submit claim');\n }\n\n // ---- Act as the DAO group: propose instead of broadcasting directly ----\n // The off-chain prep (credential + Matrix upload) still runs as the user;\n // the on-chain MsgSubmitClaim is built with the GROUP as the agent and\n // wrapped in a governance proposal. claimId (the Matrix CID) is known at\n // prepare time, so downstream references resolve once the proposal\n // executes and the block completes via read-back.\n if (isGroupExecution(inputs)) {\n const { coreAddress, title, description } = requireGroupExecutionParams(inputs);\n const handlers = ctx.handlers as any;\n if (typeof handlers?.prepareGroupClaimSubmission !== 'function') {\n throw new Error('Acting as a POD is not available: the host does not implement prepareGroupClaimSubmission');\n }\n const prepared = await handlers.prepareGroupClaimSubmission({\n surveyData: surveyAnswers,\n deedDid,\n entityDid: deedDid,\n collectionId,\n adminAddress,\n pin,\n groupAddress: coreAddress,\n });\n const claimId = String(prepared?.claimId || '').trim();\n if (!claimId) throw new Error('prepareGroupClaimSubmission returned no claim identifier');\n return proposeGroupExecution(ctx, {\n coreAddress,\n title,\n description,\n msgs: prepared.msgs || [],\n expectedOutput: {\n claimId,\n transactionHash: '',\n collectionId,\n deedDid,\n submittedByDid: coreAddress,\n submittedAt: new Date().toISOString(),\n surveyAnswers: surveyAnswers as Record<string, unknown>,\n },\n completionEvent: 'submitted',\n });\n }\n\n const result = await service.submitClaim({\n surveyData: surveyAnswers,\n deedDid,\n entityDid: deedDid,\n collectionId,\n adminAddress,\n pin,\n });\n\n const claimId = String((result as any)?.claimId || (result as any)?.id || '');\n if (!claimId) {\n throw new Error('submitClaim returned no claim identifier');\n }\n\n const transactionHash = String((result as any)?.transactionHash || '');\n const submittedByDid = ctx.actorDid || '';\n const submittedAt = new Date().toISOString();\n // Include the submitted answers in `output` — that's what downstream\n // blocks reference as `${thisBlock.output.surveyAnswers.<question>}` and\n // is also what the DataInput picker surfaces via `getDynamicOutputSchema`.\n const output = {\n claimId,\n transactionHash,\n collectionId,\n deedDid,\n submittedByDid,\n submittedAt,\n surveyAnswers: surveyAnswers as Record<string, unknown>,\n };\n\n return {\n output,\n events: [\n {\n name: 'submitted',\n payload: output,\n },\n ],\n };\n },\n});\n","import { registerAction, neverDone } from '../../registry';\nimport { isGroupExecution, proposeGroupExecution, requireGroupExecutionParams } from '../_shared/groupExecution';\nimport type { ActionEventDefinition, OutputSchemaField } from '../../types';\nimport { buildXeroInvoiceWorkKey, upsertXeroWorkItemForEditor } from '../../../xeroWorkItems';\nimport { prefixSurveyAnswerSchema } from '../claim/surveySchema';\nimport type { EvaluateClaimRunInputs } from './types';\n\nconst BASELINE_OUTPUT: OutputSchemaField[] = [\n { path: 'claimId', displayName: 'Claim ID', type: 'string', description: 'Evaluated claim identifier' },\n { path: 'decision', displayName: 'Decision', type: 'string', description: 'approve or reject' },\n { path: 'status', displayName: 'Status', type: 'string', description: 'approved or rejected' },\n { path: 'verificationProof', displayName: 'Verification Proof', type: 'string', description: 'UDID URL proof if generated' },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'On-chain evaluation transaction hash' },\n { path: 'collectionId', displayName: 'Collection ID', type: 'string', description: 'Claim collection identifier' },\n { path: 'deedDid', displayName: 'Deed DID', type: 'string', description: 'Deed identifier' },\n { path: 'evaluatedByDid', displayName: 'Evaluated By DID', type: 'string', description: 'Actor DID that evaluated the claim' },\n { path: 'evaluatedAt', displayName: 'Evaluated At', type: 'string', description: 'ISO timestamp of evaluation' },\n];\n\nconst BASELINE_APPROVED_EVENT: OutputSchemaField[] = [\n { path: 'claimId', displayName: 'Claim ID', type: 'string', description: 'Approved claim identifier' },\n { path: 'collectionId', displayName: 'Collection ID', type: 'string' },\n { path: 'deedDid', displayName: 'Deed DID', type: 'string' },\n { path: 'evaluatedByDid', displayName: 'Evaluated By DID', type: 'string', description: 'Actor DID that approved the claim' },\n { path: 'evaluatedAt', displayName: 'Evaluated At', type: 'string' },\n { path: 'verificationProof', displayName: 'Verification Proof', type: 'string' },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'On-chain approval transaction hash — proof of payout' },\n];\n\nconst BASELINE_REJECTED_EVENT: OutputSchemaField[] = [\n { path: 'claimId', displayName: 'Claim ID', type: 'string', description: 'Rejected claim identifier' },\n { path: 'collectionId', displayName: 'Collection ID', type: 'string' },\n { path: 'deedDid', displayName: 'Deed DID', type: 'string' },\n { path: 'evaluatedByDid', displayName: 'Evaluated By DID', type: 'string', description: 'Actor DID that rejected the claim' },\n { path: 'evaluatedAt', displayName: 'Evaluated At', type: 'string' },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'On-chain rejection transaction hash' },\n];\n\ntype Decision = 'approve' | 'reject';\n\nfunction normalizeDecision(value: unknown): Decision {\n const normalized = String(value || '')\n .trim()\n .toLowerCase();\n if (normalized === 'approve' || normalized === 'reject') {\n return normalized;\n }\n throw new Error('decision must be either approve or reject');\n}\n\nfunction toStatus(decision: Decision): number {\n return decision === 'approve' ? 1 : 2;\n}\n\nfunction isEvaluatorRole(role: unknown): boolean {\n const normalized = String(role || '')\n .trim()\n .toLowerCase();\n return normalized === 'ea' || normalized === 'evaluation_agent';\n}\n\n/**\n * Template inputs pass through the reference resolver, so a boolean flag may\n * arrive as a real boolean or a serialised string. Anything else is false.\n */\nfunction isTruthyFlag(value: unknown): boolean {\n if (value === true) return true;\n if (typeof value === 'number') return value === 1;\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n return normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on';\n }\n return false;\n}\n\nconst XERO_INVOICE_DEFAULT_KEYS = ['Type', 'Status', 'CurrencyCode', 'tenant_id', 'ContactID', 'ContactName', 'AccountCode'] as const;\n\n/**\n * §4.2 `invoiceDefaults` — template-level pins for the contracted\n * xero-oracle. Only non-empty pins are carried; `Type` defaults to ACCREC and\n * `Status` to DRAFT (the phase-1 rule — the oracle hard-forces this after\n * extraction, but the payload states it explicitly).\n */\nfunction buildXeroInvoiceDefaults(raw: unknown): Record<string, string> {\n const source = raw && typeof raw === 'object' && !Array.isArray(raw) ? (raw as Record<string, unknown>) : {};\n const defaults: Record<string, string> = {};\n for (const key of XERO_INVOICE_DEFAULT_KEYS) {\n const value = String(source[key] ?? '').trim();\n if (value) defaults[key] = value;\n }\n if (!defaults.Type) defaults.Type = 'ACCREC';\n if (!defaults.Status) defaults.Status = 'DRAFT';\n return defaults;\n}\n\nregisterAction<EvaluateClaimRunInputs>({\n type: 'qi/claim.evaluate',\n can: 'claim/evaluate',\n sideEffect: true,\n // Dynamic resolvers predate merge-by-default and intentionally control\n // the full vocabulary (e.g. returning [] to hide the static baseline).\n dynamicResolutionMode: 'replace',\n proof: { fields: ['claimId'] },\n done: neverDone,\n // Repeatable: an evaluator processes many claims over the flow's life. Never\n // latches to a terminal Done. See cardinality.\n cardinality: 'many',\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n // Static fallback — used until a collection is picked and the survey\n // schema is materialised. `getDynamicOutputSchema` takes over after that.\n outputSchema: BASELINE_OUTPUT,\n /**\n * Per-block output schema. Surfaces `output.surveyAnswers.<question>`\n * alongside the baseline evaluation fields once the template author has\n * picked a collection and the survey schema has been materialised into\n * inputs. Lets DataInput pickers reference typed survey fields downstream.\n */\n getDynamicOutputSchema: (inputs): OutputSchemaField[] => {\n const schema: OutputSchemaField[] = Array.isArray((inputs as any)?.surveyAnswersSchema) ? (inputs as any).surveyAnswersSchema : [];\n if (schema.length === 0) return BASELINE_OUTPUT;\n return [...BASELINE_OUTPUT, ...prefixSurveyAnswerSchema(schema)];\n },\n events: [\n {\n name: 'approved',\n displayName: 'Approved',\n description: 'Fires when an evaluator approves the claim.',\n payloadSchema: BASELINE_APPROVED_EVENT,\n pendingDisplayFields: ['claimId', 'evaluatedAt'],\n },\n {\n name: 'rejected',\n displayName: 'Rejected',\n description: 'Fires when an evaluator rejects the claim.',\n payloadSchema: BASELINE_REJECTED_EVENT,\n pendingDisplayFields: ['claimId', 'evaluatedAt'],\n },\n ],\n /**\n * Per-block event schema — same idea as `getDynamicOutputSchema`. Adds the\n * survey-answer fields to both `approved` and `rejected` event payloads\n * so listener blocks (e.g. `qi/xero.invoice.create`) can reference\n * `${sourceBlock.payload.surveyAnswers.<field>}` with typed paths.\n */\n getDynamicEvents: (inputs): ActionEventDefinition[] => {\n const schema: OutputSchemaField[] = Array.isArray((inputs as any)?.surveyAnswersSchema) ? (inputs as any).surveyAnswersSchema : [];\n const surveyFields = schema.length > 0 ? prefixSurveyAnswerSchema(schema) : [];\n return [\n {\n name: 'approved',\n displayName: 'Approved',\n description: 'Fires when an evaluator approves the claim.',\n payloadSchema: [...BASELINE_APPROVED_EVENT, ...surveyFields],\n pendingDisplayFields: ['claimId', 'evaluatedAt'],\n },\n {\n name: 'rejected',\n displayName: 'Rejected',\n description: 'Fires when an evaluator rejects the claim.',\n payloadSchema: [...BASELINE_REJECTED_EVENT, ...surveyFields],\n pendingDisplayFields: ['claimId', 'evaluatedAt'],\n },\n ];\n },\n inputSchema: {\n type: 'object',\n required: ['decision', 'claimId', 'collectionId', 'deedDid', 'adminAddress'],\n properties: {\n decision: { type: 'string', description: 'Evaluation decision: approve or reject.' },\n claimId: { type: 'string', description: 'Identifier of the claim being evaluated.' },\n collectionId: { type: 'string', description: 'Claim collection identifier.' },\n deedDid: { type: 'string', description: 'Deed (entity) DID.' },\n adminAddress: { type: 'string', description: 'Entity admin account address for the on-chain evaluation.' },\n amount: { type: 'object', description: 'Payout coin (denom + amount); accepts a JSON string, object, or array.' },\n createUdid: { type: 'boolean', description: 'Whether to generate and sign a verification UDID proof.' },\n capabilityCid: { type: 'string', description: 'Capability CID used when creating the UDID; defaults to deedDid.' },\n rubricAuthority: { type: 'string', description: 'Rubric authority used when creating the UDID; defaults to deedDid.' },\n rubricId: { type: 'string', description: 'Rubric identifier used when creating the UDID; defaults to deedDid.' },\n granteeAddress: { type: 'string', description: 'Evaluator address; resolves to the current user when omitted.' },\n verificationProof: { type: 'string', description: 'Pre-existing verification proof URL; skips UDID creation when set.' },\n traceCid: { type: 'string', description: 'Trace CID passed through to the UDID.' },\n items: { type: 'array', description: 'Evaluation items passed through to the UDID.' },\n patch: { type: 'object', description: 'Patch object passed through to the UDID.' },\n xeroOracleInvoiceOnApprove: { type: 'boolean', description: 'Create a Xero draft invoice via the contracted xero-oracle when a claim is approved.' },\n xeroInvoiceDefaults: {\n type: 'object',\n description: 'Optional template-level Xero invoice defaults (Type, Status, CurrencyCode, tenant_id, ContactID, ContactName) pinned into the invoice work payload.',\n },\n claimSnapshot: { type: 'object', description: 'Claim snapshot used to build the Xero invoice work payload.' },\n },\n },\n run: async (inputs, ctx) => {\n const service = ctx.services.claim;\n if (!service) {\n throw new Error('Claim service not configured');\n }\n\n const decision = normalizeDecision(inputs.decision);\n const claimId = String(inputs.claimId || '').trim();\n const collectionId = String(inputs.collectionId || '').trim();\n const deedDid = String(inputs.deedDid || '').trim();\n const adminAddress = String(inputs.adminAddress || '').trim();\n\n if (!claimId) throw new Error('claimId is required');\n if (!collectionId) throw new Error('collectionId is required');\n if (!deedDid) throw new Error('deedDid is required');\n if (!adminAddress) throw new Error('adminAddress is required');\n\n // Action-level authorization guard: evaluator role is required. When\n // acting as the DAO group, the GROUP's account is the evaluating agent —\n // it must hold the evaluator authorization, not the initiating user.\n const handlers = ctx.handlers;\n const groupMode = isGroupExecution(inputs);\n const actorAddress = groupMode ? String(inputs.groupCoreAddress || '').trim() : String(ctx.actorDid || service.getCurrentUser?.()?.address || '').trim();\n if (!actorAddress) {\n throw new Error('Unable to resolve actor address for evaluator authorization');\n }\n\n if (typeof handlers?.getUserRoles !== 'function') {\n throw new Error('Evaluator authorization check unavailable (getUserRoles handler missing)');\n }\n\n const roles = await handlers.getUserRoles({\n userAddress: actorAddress,\n adminAddress,\n deedDid,\n collectionIds: [collectionId],\n });\n\n const roleForCollection = Array.isArray(roles) ? roles.find((r: any) => r?.collectionId === collectionId)?.role : undefined;\n if (!isEvaluatorRole(roleForCollection)) {\n throw new Error('Not authorized: evaluator role required to evaluate claims for this collection');\n }\n\n // Host's evaluateClaim takes a single Coin. Inputs may be supplied as a\n // JSON string, an object, or (legacy) an array — we accept all three but\n // collapse to the first coin for the on-chain call.\n let amount = inputs.amount;\n if (typeof amount === 'string' && amount.trim()) {\n try {\n amount = JSON.parse(amount);\n } catch {\n throw new Error('amount must be valid JSON when provided as string');\n }\n }\n\n const normalizeCoin = (coin: any) => {\n if (!coin || typeof coin !== 'object' || Array.isArray(coin)) return null;\n const denom = String(coin.denom || '').trim();\n const tokenAmount = String(coin.amount || '').trim();\n if (!denom || !tokenAmount) return null;\n return { denom, amount: tokenAmount };\n };\n\n let normalizedCoin: { denom: string; amount: string } | undefined;\n if (Array.isArray(amount)) {\n const coins = amount.map(normalizeCoin).filter((coin): coin is { denom: string; amount: string } => !!coin);\n if (coins.length !== amount.length) {\n throw new Error('amount must contain valid coin objects with denom and amount');\n }\n normalizedCoin = coins[0];\n } else if (amount != null) {\n const coin = normalizeCoin(amount);\n if (!coin) {\n throw new Error('amount must be a coin object with denom and amount');\n }\n normalizedCoin = coin;\n }\n\n let verificationProof = String(inputs.verificationProof || '').trim();\n const shouldCreateUdid = Boolean(inputs.createUdid);\n\n if (!verificationProof && shouldCreateUdid && service.createUdid) {\n const pin = await service.requestPin({\n title: 'Sign Evaluation Result',\n description: 'Enter your PIN to sign the evaluation UDID',\n submitText: 'Sign',\n });\n\n if (!pin) {\n throw new Error('PIN is required to sign evaluation proof');\n }\n\n const udid = await service.createUdid({\n claimCid: claimId,\n deedDid,\n collectionId,\n capabilityCid: String(inputs.capabilityCid || deedDid),\n rubricAuthority: String(inputs.rubricAuthority || deedDid),\n rubricId: String(inputs.rubricId || deedDid),\n outcome: toStatus(decision),\n tag: decision === 'approve' ? 'approved' : 'rejected',\n issuerType: 'user',\n pin,\n traceCid: inputs.traceCid,\n items: inputs.items,\n patch: inputs.patch as Record<string, any> | undefined,\n });\n\n verificationProof = String((udid as any)?.url || (udid as any)?.cid || '');\n }\n\n // ---- Act as the DAO group: propose instead of broadcasting directly ----\n if (groupMode) {\n const { coreAddress, title, description } = requireGroupExecutionParams(inputs);\n const groupHandlers = ctx.handlers as any;\n if (typeof groupHandlers?.prepareGroupClaimEvaluation !== 'function') {\n throw new Error('Acting as a POD is not available: the host does not implement prepareGroupClaimEvaluation');\n }\n const prepared = await groupHandlers.prepareGroupClaimEvaluation({\n groupAddress: coreAddress,\n deedDid,\n claimId,\n collectionId,\n adminAddress,\n status: toStatus(decision),\n verificationProof,\n amount: normalizedCoin,\n });\n\n // Best-effort survey answers for the expected output, same as the\n // direct path does after broadcast.\n let expectedSurveyAnswers: Record<string, unknown> = {};\n try {\n const getClaimData = groupHandlers?.getClaimData;\n if (typeof getClaimData === 'function') {\n const claim = await getClaimData(collectionId, claimId, { entityDid: deedDid });\n const candidate = claim?.credentialSubject ?? claim?.surveyAnswers ?? claim;\n if (candidate && typeof candidate === 'object' && !Array.isArray(candidate)) {\n expectedSurveyAnswers = candidate as Record<string, unknown>;\n }\n }\n } catch {\n // Survey fields are nice-to-have on the evaluation output.\n }\n\n return proposeGroupExecution(ctx, {\n coreAddress,\n title,\n description,\n msgs: prepared.msgs || [],\n expectedOutput: {\n claimId,\n decision,\n status: decision === 'approve' ? 'approved' : 'rejected',\n verificationProof,\n transactionHash: '',\n collectionId,\n deedDid,\n evaluatedByDid: coreAddress,\n evaluatedAt: new Date().toISOString(),\n surveyAnswers: expectedSurveyAnswers,\n },\n completionEvent: 'evaluated',\n });\n }\n\n const currentUser = service.getCurrentUser();\n const granteeAddress = String((inputs.granteeAddress as string) || currentUser?.address || '').trim();\n if (!granteeAddress) {\n throw new Error('granteeAddress could not be resolved');\n }\n\n const broadcastResult = await service.evaluateClaim(granteeAddress, deedDid, {\n claimId,\n collectionId,\n adminAddress,\n status: toStatus(decision),\n verificationProof,\n amount: normalizedCoin,\n });\n const transactionHash = String(broadcastResult?.transactionHash || '');\n\n // Fetch the claim's survey answers so listener blocks (and the action's\n // own output) carry typed `surveyAnswers.<field>` paths matching\n // `getDynamicOutputSchema` / `getDynamicEvents`. Best-effort: if the\n // handler isn't wired or the fetch fails we still emit the evaluation\n // event — listeners just won't see survey fields.\n let claimData: any = null;\n let surveyAnswers: Record<string, unknown> = {};\n try {\n const getClaimData = handlers?.getClaimData;\n if (typeof getClaimData === 'function') {\n claimData = await getClaimData(collectionId, claimId, { entityDid: deedDid });\n const candidate = claimData?.credentialSubject ?? claimData?.surveyAnswers ?? claimData;\n if (candidate && typeof candidate === 'object' && !Array.isArray(candidate)) {\n surveyAnswers = candidate as Record<string, unknown>;\n }\n }\n } catch {\n // Swallow — survey fields are nice-to-have on the evaluation output.\n }\n\n const evaluatedByDid = ctx.actorDid || granteeAddress;\n const evaluatedAt = new Date().toISOString();\n const output = {\n claimId,\n decision,\n status: decision === 'approve' ? 'approved' : 'rejected',\n verificationProof,\n transactionHash,\n collectionId,\n deedDid,\n evaluatedByDid,\n evaluatedAt,\n surveyAnswers,\n };\n\n // ── Xero oracle invoice work (§4.1/§4.2) ──\n // When the template author enabled \"Xero oracle invoice on approval\",\n // an approval upserts a pending invoice work item into the flow doc's\n // `xeroWorkItems` map. Flow-manager's tick scans for these, contracts the\n // xero-oracle, and sends `originalPayload` by value (injecting the\n // top-level `idempotencyKey` at contract time — it is NOT part of the\n // payload written here). One item per approved claim per evaluation\n // block; re-approvals re-upsert the same key and `mergeItem` protects\n // completed items.\n if (decision === 'approve' && isTruthyFlag(inputs.xeroOracleInvoiceOnApprove)) {\n const flowId = String(ctx.flowId || ctx.flowUri || 'flow');\n const claimSnapshot =\n inputs.claimSnapshot && typeof inputs.claimSnapshot === 'object' && !Array.isArray(inputs.claimSnapshot) ? (inputs.claimSnapshot as Record<string, any>) : undefined;\n\n // Materialised survey schema, as available to this action: prefer\n // questions carried on the claim snapshot, falling back to the\n // template's materialised `surveyAnswersSchema`.\n const surveyQuestions: unknown[] = Array.isArray(claimSnapshot?.surveyQuestions)\n ? claimSnapshot.surveyQuestions\n : Array.isArray((inputs as any)?.surveyAnswersSchema)\n ? (inputs as any).surveyAnswersSchema\n : [];\n\n const idempotencyKey = buildXeroInvoiceWorkKey({ flowId, evaluationBlockId: ctx.nodeId, claimId });\n const originalPayload: Record<string, any> = {\n claim: { claimId, collectionId, deedDid },\n surveyQuestions,\n surveyAnswers,\n evaluation: {\n decision,\n amount: normalizedCoin,\n evaluatedByDid,\n evaluatedAt,\n verificationProof,\n transactionHash,\n },\n invoiceDefaults: buildXeroInvoiceDefaults(inputs.xeroInvoiceDefaults),\n };\n\n upsertXeroWorkItemForEditor(ctx.editor, {\n id: idempotencyKey,\n kind: 'invoice.create',\n status: 'pending',\n assignedBlockId: ctx.nodeId,\n idempotencyKey,\n source: {\n claimId,\n evaluationBlockId: ctx.nodeId,\n deedDid,\n collectionId,\n },\n originalPayload,\n reviewPayload: originalPayload,\n provenance: {\n createdAt: Date.now(),\n createdByDid: ctx.actorDid,\n templateBlockId: ctx.nodeId,\n evaluationOutput: output,\n claimSnapshot,\n },\n attempts: [],\n });\n }\n\n // Emit a semantic event so listeners can be wired to approval/rejection\n // outcomes specifically. The runtime persists these as part of the run\n // record and the reconciliation loop turns them into pending invocations\n // on subscribed listener blocks. See docs/flow-engine/events-and-triggers-plan.md.\n const eventName = decision === 'approve' ? 'approved' : 'rejected';\n const eventPayload =\n decision === 'approve'\n ? {\n claimId,\n collectionId,\n deedDid,\n evaluatedByDid,\n evaluatedAt,\n verificationProof,\n transactionHash,\n surveyAnswers,\n }\n : {\n claimId,\n collectionId,\n deedDid,\n evaluatedByDid,\n evaluatedAt,\n transactionHash,\n surveyAnswers,\n };\n\n return {\n output,\n events: [{ name: eventName, payload: eventPayload }],\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/proposal.create',\n can: 'proposal/create',\n sideEffect: true,\n proof: { fields: ['proposalId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n\n inputSchema: {\n type: 'object',\n required: ['coreAddress', 'title', 'description'],\n properties: {\n coreAddress: { type: 'string', description: 'The DAO core contract address.' },\n title: { type: 'string', description: 'The proposal title.' },\n description: { type: 'string', description: 'The proposal description.' },\n actions: { type: 'array', description: 'Optional proposal actions (array or JSON string array).' },\n },\n },\n\n outputSchema: [\n { path: 'proposalId', displayName: 'Proposal ID', type: 'string', description: 'The on-chain proposal identifier' },\n { path: 'status', displayName: 'Proposal Status', type: 'string', description: 'Current proposal status (open, passed, rejected, executed, etc.)' },\n { path: 'proposalContractAddress', displayName: 'Proposal Contract Address', type: 'string', description: 'The proposal module contract address' },\n { path: 'coreAddress', displayName: 'Core Address', type: 'string', description: 'The DAO core contract address' },\n { path: 'createdAt', displayName: 'Created At', type: 'string', description: 'ISO timestamp of proposal creation' },\n ],\n\n run: async (inputs, ctx) => {\n const handlers = ctx.handlers;\n if (!handlers) {\n throw new Error('Handlers not available');\n }\n if (!handlers.getPreProposalContractAddress || !handlers.getGroupContractAddress || !handlers.getProposalContractAddress || !handlers.createProposal) {\n throw new Error('Governance proposal handlers not available');\n }\n\n const coreAddress = String(inputs.coreAddress || '').trim();\n const title = String(inputs.title || '').trim();\n const description = String(inputs.description || '').trim();\n\n if (!coreAddress) throw new Error('coreAddress is required');\n if (!title) throw new Error('title is required');\n if (!description) throw new Error('description is required');\n\n let actions: any[] = [];\n if (inputs.actions) {\n if (typeof inputs.actions === 'string') {\n try {\n actions = JSON.parse(inputs.actions);\n } catch {\n throw new Error('actions must be valid JSON array');\n }\n } else if (Array.isArray(inputs.actions)) {\n actions = inputs.actions;\n }\n }\n\n // Get pre-proposal and group contract addresses\n const { preProposalContractAddress } = await handlers.getPreProposalContractAddress({\n coreAddress,\n });\n\n const { groupContractAddress } = await handlers.getGroupContractAddress({\n coreAddress,\n });\n\n const { proposalContractAddress } = await handlers.getProposalContractAddress({\n coreAddress,\n });\n\n const params = {\n preProposalContractAddress,\n title,\n description,\n actions: actions.length > 0 ? actions : undefined,\n coreAddress,\n groupContractAddress,\n };\n\n const proposalId = await handlers.createProposal(params);\n\n return {\n output: {\n proposalId: String(proposalId),\n status: 'open',\n proposalContractAddress: proposalContractAddress || '',\n coreAddress,\n createdAt: new Date().toISOString(),\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/proposal.vote',\n can: 'proposal/vote',\n sideEffect: true,\n proof: { fields: ['votedAt'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n\n inputSchema: {\n type: 'object',\n required: ['proposalId', 'vote', 'proposalContractAddress'],\n properties: {\n proposalId: { type: 'number', description: 'The proposal number to vote on.' },\n vote: { type: 'string', description: 'The vote to cast: yes, no, or abstain.' },\n proposalContractAddress: { type: 'string', description: 'The proposal module contract address.' },\n rationale: { type: 'string', description: 'Optional rationale provided with the vote.' },\n },\n },\n\n outputSchema: [\n { path: 'vote', displayName: 'Vote', type: 'string', description: 'The vote cast (yes, no, abstain)' },\n { path: 'rationale', displayName: 'Rationale', type: 'string', description: 'Optional rationale provided with the vote' },\n { path: 'proposalId', displayName: 'Proposal ID', type: 'string', description: 'The proposal that was voted on' },\n { path: 'votedAt', displayName: 'Voted At', type: 'string', description: 'ISO timestamp of when the vote was cast' },\n ],\n\n run: async (inputs, ctx) => {\n const handlers = ctx.handlers;\n if (!handlers) {\n throw new Error('Handlers not available');\n }\n if (!handlers.vote) {\n throw new Error('vote handler not available');\n }\n\n const proposalId = Number(inputs.proposalId);\n const vote = String(inputs.vote || '').trim();\n const rationale = String(inputs.rationale || '').trim();\n const proposalContractAddress = String(inputs.proposalContractAddress || '').trim();\n\n if (!proposalId || isNaN(proposalId)) throw new Error('proposalId is required');\n if (!vote) throw new Error('vote is required');\n if (!proposalContractAddress) throw new Error('proposalContractAddress is required');\n\n // dao_proposal_single accepts exactly these three options; anything else\n // (e.g. no_with_veto) is rejected by the contract.\n const validVotes = ['yes', 'no', 'abstain'];\n if (!validVotes.includes(vote)) {\n throw new Error(`vote must be one of: ${validVotes.join(', ')}`);\n }\n\n await handlers.vote({\n proposalId,\n vote,\n rationale: rationale || undefined,\n proposalContractAddress,\n });\n\n return {\n output: {\n vote,\n rationale: rationale || '',\n proposalId: String(proposalId),\n votedAt: new Date().toISOString(),\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/protocol.select',\n can: 'protocol/select',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: ['selectedProtocolDid'],\n properties: {\n selectedProtocolDid: { type: 'string', description: 'DID of the protocol to select.' },\n selectedProtocolName: { type: 'string', description: 'Display name of the selected protocol.' },\n selectedProtocolType: { type: 'string', description: 'Type of the selected protocol.' },\n },\n },\n\n outputSchema: [\n { path: 'selectedProtocolDid', displayName: 'Selected Protocol DID', type: 'string', description: 'DID of the selected protocol' },\n { path: 'selectedProtocolName', displayName: 'Selected Protocol Name', type: 'string', description: 'Display name of the selected protocol' },\n { path: 'selectedProtocolType', displayName: 'Selected Protocol Type', type: 'string', description: 'Type of the selected protocol' },\n ],\n\n run: async (inputs, _ctx) => {\n const selectedProtocolDid = String(inputs.selectedProtocolDid || '').trim();\n const selectedProtocolName = String(inputs.selectedProtocolName || '').trim();\n const selectedProtocolType = String(inputs.selectedProtocolType || '').trim();\n\n if (!selectedProtocolDid) throw new Error('selectedProtocolDid is required');\n\n return {\n output: {\n selectedProtocolDid,\n selectedProtocolName,\n selectedProtocolType,\n },\n };\n },\n});\n","/**\n * Transforms survey data from the Domain Creator survey into a W3C Verifiable Credential\n * credentialSubject structure compatible with ixo:DomainCard schema.\n */\n\nexport interface DomainCardCredentialSubject {\n id: string;\n type: string[];\n additionalType?: string[];\n name: string;\n alternateName?: string[];\n description: string;\n url?: string;\n sameAs?: string[];\n logo?: {\n type: string;\n id: string;\n contentUrl: string;\n };\n image?: Array<{\n type: string;\n id: string;\n contentUrl: string;\n }>;\n keywords?: string[];\n knowsAbout?: string[];\n address?: {\n type: string;\n streetAddress?: string;\n addressLocality?: string;\n addressRegion?: string;\n postalCode?: string;\n addressCountry?: string;\n };\n areaServed?: {\n type: string;\n name: string;\n };\n contactPoint?: Array<{\n type: string;\n contactType: string;\n email?: string;\n telephone?: string;\n availableLanguage?: string[];\n }>;\n composition?: {\n type: string;\n hasPart?: Array<{\n type: string;\n id?: string;\n name?: string;\n description?: string;\n url?: string;\n creator?: {\n type: string;\n name: string;\n };\n }>;\n subjectOf?: Array<{\n type: string;\n name: string;\n url?: string;\n author?: {\n type: string;\n name: string;\n };\n }>;\n };\n makesOffer?: Array<{\n type: string;\n name?: string;\n description?: string;\n itemOffered?: {\n type: string;\n name?: string;\n url?: string;\n };\n }>;\n relationships?: {\n memberOf?: Array<{\n type: string;\n name: string;\n }>;\n 'prov:wasAssociatedWith'?: Array<{\n type: string;\n name: string;\n url?: string;\n }>;\n funding?: Array<{\n type: string;\n funder?: {\n type: string;\n name: string;\n };\n amount?: {\n type: string;\n currency: string;\n value: string;\n };\n }>;\n };\n agents?: Array<{\n type: string;\n id?: string;\n name?: string;\n description?: string;\n }>;\n credentials?: Array<{\n type: string;\n id?: string;\n name?: string;\n description?: string;\n }>;\n attributes?: Array<{\n '@type': string;\n '@id': string;\n name: string;\n value: string;\n }>;\n project?: {\n type?: string;\n name?: string;\n description?: string;\n hadObjective?: string[];\n plannedStart?: string;\n plannedEnd?: string;\n wasFundedThrough?: Array<{\n type: string;\n moneyAmount?: string;\n moneyCurrency?: string;\n agent?: {\n type: string;\n id?: string;\n name?: string;\n };\n }>;\n };\n researchProfile?: {\n type: string;\n 'ixo:seedQueries'?: string[];\n citation?: Array<{\n type: string;\n name: string;\n url?: string;\n publisher?: string;\n datePublished?: string;\n }>;\n 'ixo:embedding'?: {\n type: string;\n id: string;\n model: string;\n contentUrl: string;\n };\n dateModified?: string;\n };\n}\n\n/**\n * Helper to extract array items from paneldynamic survey fields\n */\nfunction extractPanelDynamicItems<T>(surveyData: Record<string, any>, panelName: string, itemMapper: (item: Record<string, any>) => T | null): T[] {\n const items = surveyData[panelName];\n if (!Array.isArray(items)) return [];\n return items.map(itemMapper).filter((item): item is T => item !== null);\n}\n\n/**\n * Parse comma-separated string into array of trimmed strings\n */\nfunction parseCommaSeparated(value: string | undefined): string[] {\n if (!value || typeof value !== 'string') return [];\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/**\n * Parse language codes from comma-separated string\n */\nfunction parseLanguageCodes(value: string | undefined): string[] {\n return parseCommaSeparated(value);\n}\n\n/**\n * Build image object from URL\n */\nfunction buildImageObject(url: string | undefined): { type: string; id: string; contentUrl: string } | null {\n if (!url) return null;\n return {\n type: 'schema:ImageObject',\n id: url,\n contentUrl: url,\n };\n}\n\n/**\n * Main transformation function\n */\nexport function transformSurveyToCredentialSubject(surveyData: Record<string, any>, entityDid: string): DomainCardCredentialSubject {\n // Build type array from survey selections\n const types: string[] = [];\n if (surveyData['type_1']) types.push(`ixo:${surveyData['type_1']}`);\n if (surveyData['type_2']) types.push(surveyData['type_2']);\n\n // Build additionalType from daoType\n const additionalType: string[] = [];\n if (surveyData['daoType']) additionalType.push(surveyData['daoType']);\n\n // Extract alternate names from paneldynamic\n const alternateNames = extractPanelDynamicItems(surveyData, 'pannel_schema:alternateName', (item) => item['schema:alternateName'] || null);\n\n // Extract sameAs URLs from paneldynamic\n const sameAsUrls = extractPanelDynamicItems(surveyData, 'schema:sameAs', (item) => item['schema:sameAs.url'] || null);\n\n // Build logo from URL or uploaded file\n const logoUrl = surveyData['ixo:imageLogo_url'] || surveyData['ixo:imageLogo']?.[0]?.content;\n const logo = buildImageObject(logoUrl);\n\n // Build profile image from URL or uploaded file\n const profileImageUrl = surveyData['ixo:imageProfile_url'] || surveyData['ixo:imageProfile']?.[0]?.content;\n const profileImage = buildImageObject(profileImageUrl);\n\n // Parse keywords from comma-separated string\n const keywords = parseCommaSeparated(surveyData['schema:keywords']);\n\n // Extract knowsAbout from paneldynamic\n const knowsAbout = extractPanelDynamicItems(surveyData, 'pannel_ixo:knowsAbout', (item) => item['ixo:knowsAbout'] || null);\n\n // Build address object\n const hasAddressData =\n surveyData['schema:streetAddress'] ||\n surveyData['schema:addressLocality'] ||\n surveyData['schema:addressRegion'] ||\n surveyData['schema:postalCode'] ||\n surveyData['schema:addressCountry'];\n\n const address = hasAddressData\n ? {\n type: 'schema:PostalAddress',\n streetAddress: surveyData['schema:streetAddress'] || undefined,\n addressLocality: surveyData['schema:addressLocality'] || undefined,\n addressRegion: surveyData['schema:addressRegion'] || undefined,\n postalCode: surveyData['schema:postalCode'] || undefined,\n addressCountry: surveyData['schema:addressCountry'] || undefined,\n }\n : undefined;\n\n // Build areaServed\n const areaServed = surveyData['schema:AdministrativeArea']\n ? {\n type: 'schema:AdministrativeArea',\n name: surveyData['schema:AdministrativeArea'],\n }\n : undefined;\n\n // Extract contact points from paneldynamic\n const contactPoints = extractPanelDynamicItems(surveyData, 'pannel:schema_contactPoint', (item) => {\n if (!item['schema:contactType'] && !item['schema:email'] && !item['schema:telephone']) return null;\n return {\n type: 'schema:ContactPoint',\n contactType: item['schema:contactType'] || 'general',\n email: item['schema:email'] || undefined,\n telephone: item['schema:telephone'] || undefined,\n availableLanguage: parseLanguageCodes(item['schema:availableLanguage']),\n };\n });\n\n // Build composition object\n const hasParts = extractPanelDynamicItems(surveyData, 'schema:hasPart', (item) => {\n if (!item['schema:hasPart.name'] && !item['schema:hasPart.id']) return null;\n return {\n type: 'schema:CreativeWork',\n id: item['schema:hasPart.id'] || undefined,\n name: item['schema:hasPart.name'] || undefined,\n description: item['schema:hasPart.description'] || undefined,\n url: item['schema:hasPart.url'] || undefined,\n creator: item['schema:hasPart.creator.name']\n ? {\n type: 'schema:Organization',\n name: item['schema:hasPart.creator.name'],\n }\n : undefined,\n };\n });\n\n const subjectOf = extractPanelDynamicItems(surveyData, 'schema:subjectOf', (item) => {\n if (!item['schema:subjectOf.name']) return null;\n return {\n type: 'schema:CreativeWork',\n name: item['schema:subjectOf.name'],\n url: item['schema:subjectOf.url'] || undefined,\n author: item['schema:subjectOf.author.name']\n ? {\n type: 'schema:Organisation',\n name: item['schema:subjectOf.author.name'],\n }\n : undefined,\n };\n });\n\n const composition =\n hasParts.length > 0 || subjectOf.length > 0\n ? {\n type: 'schema:Collection',\n hasPart: hasParts.length > 0 ? hasParts : undefined,\n subjectOf: subjectOf.length > 0 ? subjectOf : undefined,\n }\n : undefined;\n\n // Extract makesOffer from paneldynamic\n const makesOffer = extractPanelDynamicItems(surveyData, 'schema:makesOffer', (item) => {\n if (!item['schema:itemOffered.name']) return null;\n return {\n type: 'schema:Offer',\n itemOffered: {\n type: item['schema:itemOffered.type'] === 'service' ? 'schema:Service' : 'schema:Product',\n name: item['schema:itemOffered.name'] || undefined,\n description: item['schema:itemOffered.description'] || undefined,\n url: item['schema:itemOffered.url'] || undefined,\n },\n };\n });\n\n // Build relationships object\n const memberOf = extractPanelDynamicItems(surveyData, 'schema:memberOf', (item) => {\n if (!item['schema:memberOf.name']) return null;\n return {\n type: 'schema:Organization',\n name: item['schema:memberOf.name'],\n };\n });\n\n const wasAssociatedWith = extractPanelDynamicItems(surveyData, 'schema:wasAssociatedWith', (item) => {\n if (!item['schema:wasAssociatedWith.name']) return null;\n return {\n type: 'schema:Organization',\n name: item['schema:wasAssociatedWith.name'],\n url: item['schema:wasAssociatedWith.url'] || undefined,\n };\n });\n\n const funding = extractPanelDynamicItems(surveyData, 'schema:funding', (item) => {\n if (!item['schema:funder.name']) return null;\n return {\n type: 'schema:MonetaryGrant',\n funder: {\n type: 'schema:Organization',\n name: item['schema:funder.name'],\n },\n amount:\n item['schema:amount.value'] || item['schema:amount.currency']\n ? {\n type: 'schema:MonetaryAmount',\n currency: item['schema:amount.currency'] || 'USD',\n value: item['schema:amount.value'] || '0',\n }\n : undefined,\n };\n });\n\n const relationships =\n memberOf.length > 0 || wasAssociatedWith.length > 0 || funding.length > 0\n ? {\n memberOf: memberOf.length > 0 ? memberOf : undefined,\n 'prov:wasAssociatedWith': wasAssociatedWith.length > 0 ? wasAssociatedWith : undefined,\n funding: funding.length > 0 ? funding : undefined,\n }\n : undefined;\n\n // Extract agents from paneldynamic\n const agents = extractPanelDynamicItems(surveyData, 'ixo:agentCard', (item) => {\n if (!item['ixo:agentCard.name'] && !item['ixo:agentCard.id']) return null;\n return {\n type: 'ixo:AgentCard',\n id: item['ixo:agentCard.id'] || undefined,\n name: item['ixo:agentCard.name'] || undefined,\n description: item['ixo:agentCard.description'] || undefined,\n };\n });\n\n // Extract credentials from paneldynamic\n const credentials = extractPanelDynamicItems(surveyData, 'ixo:verifiableCredential', (item) => {\n if (!item['schema:Name'] && !item['schema:ID']) return null;\n return {\n type: 'VerifiableCredential',\n id: item['schema:ID'] || undefined,\n name: item['schema:Name'] || undefined,\n description: item['schema:description'] || undefined,\n };\n });\n\n // Extract attributes from paneldynamic\n const attributes = extractPanelDynamicItems(surveyData, 'ixo:attribute', (item) => {\n if (!item['schema:name_2']) return null;\n return {\n '@type': 'ixo:Attribute',\n '@id': item['schema:ID_2'] || `attribute:${item['schema:name_2'].replace(/\\s+/g, '_').toLowerCase()}`,\n name: item['schema:name_2'],\n value: item['schema:description_2'] || '',\n };\n });\n\n // Build project object from paneldynamic\n const projects = extractPanelDynamicItems(surveyData, 'pannel_proj:project', (item) => {\n if (!item['proj:project.name']) return null;\n\n // Extract objectives\n const objectives = extractPanelDynamicItems(item, 'proj:project.hadObjective', (objItem) => objItem['proj:hadObjective'] || null);\n\n // Extract funding\n const projectFunding = extractPanelDynamicItems(item, 'proj:wasFundedThrough', (fundItem) => ({\n type: 'proj:FundingAssociation',\n moneyAmount: fundItem['proj:moneyAmount'] || undefined,\n moneyCurrency: fundItem['proj:moneyCurrency'] || undefined,\n agent:\n fundItem['prov.agent.name'] || fundItem['prov:agent.id']\n ? {\n type: 'prov:Agent',\n id: fundItem['prov:agent.id'] || undefined,\n name: fundItem['prov.agent.name'] || undefined,\n }\n : undefined,\n }));\n\n return {\n type: 'proj:Project',\n name: item['proj:project.name'],\n description: item['proj:project.description'] || undefined,\n hadObjective: objectives.length > 0 ? objectives : undefined,\n plannedStart: item['proj:plannedStart'] || undefined,\n plannedEnd: item['proj:plannedEnd'] || undefined,\n wasFundedThrough: projectFunding.length > 0 ? projectFunding : undefined,\n };\n });\n\n // Use first project if multiple (or combine as needed)\n const project = projects.length > 0 ? projects[0] : undefined;\n\n // Build research profile\n const seedQueries = extractPanelDynamicItems(surveyData, 'ixo:ResearchProfile', (item) => item['ixo:seedQueries'] || null);\n\n const citations = extractPanelDynamicItems(surveyData, 'schema:creativeWork', (item) => {\n if (!item['schema:creativeWork.name']) return null;\n return {\n type: 'schema:CreativeWork',\n name: item['schema:creativeWork.name'],\n url: item['schema:creativeWork.url'] || undefined,\n publisher: item['schema:creativeWork.publisher'] || undefined,\n datePublished: item['schema:creativeWork.datePublished'] || undefined,\n };\n });\n\n const researchProfile =\n seedQueries.length > 0 || citations.length > 0\n ? {\n type: 'ixo:ResearchProfile',\n 'ixo:seedQueries': seedQueries.length > 0 ? seedQueries : undefined,\n citation: citations.length > 0 ? citations : undefined,\n dateModified: new Date().toISOString(),\n }\n : undefined;\n\n // Build the final credentialSubject\n const credentialSubject: DomainCardCredentialSubject = {\n id: entityDid,\n type: types.length > 0 ? types : ['ixo:dao'],\n name: surveyData['schema:name'] || '',\n description: surveyData['schema.description'] || '',\n };\n\n // Add optional fields only if they have values\n if (additionalType.length > 0) credentialSubject.additionalType = additionalType;\n if (alternateNames.length > 0) credentialSubject.alternateName = alternateNames;\n if (surveyData['schema:url']) credentialSubject.url = surveyData['schema:url'];\n if (sameAsUrls.length > 0) credentialSubject.sameAs = sameAsUrls;\n if (logo) credentialSubject.logo = logo;\n if (profileImage) credentialSubject.image = [profileImage];\n if (keywords.length > 0) credentialSubject.keywords = keywords;\n if (knowsAbout.length > 0) credentialSubject.knowsAbout = knowsAbout;\n if (address) credentialSubject.address = address;\n if (areaServed) credentialSubject.areaServed = areaServed;\n if (contactPoints.length > 0) credentialSubject.contactPoint = contactPoints;\n if (composition) credentialSubject.composition = composition;\n if (makesOffer.length > 0) credentialSubject.makesOffer = makesOffer;\n if (relationships) credentialSubject.relationships = relationships;\n if (agents.length > 0) credentialSubject.agents = agents;\n if (credentials.length > 0) credentialSubject.credentials = credentials;\n if (attributes.length > 0) credentialSubject.attributes = attributes;\n if (project) credentialSubject.project = project;\n if (researchProfile) credentialSubject.researchProfile = researchProfile;\n\n return credentialSubject;\n}\n","/**\n * Builds an unsigned W3C Verifiable Credential envelope for a Domain Card.\n * The credential follows the ixo:DomainCard schema.\n */\n\nimport type { DomainCardCredentialSubject } from './transformSurveyToCredentialSubject';\n\n/**\n * JSON-LD context for Domain Card credentials\n */\nexport const DOMAIN_CARD_CONTEXT = [\n 'https://w3id.org/ixo/context/v1',\n {\n schema: 'https://schema.org/',\n ixo: 'https://w3id.org/ixo/vocab/v1',\n prov: 'http://www.w3.org/ns/prov#',\n proj: 'http://www.w3.org/ns/project#',\n id: '@id',\n type: '@type',\n '@protected': true,\n },\n] as const;\n\n/**\n * Domain Card credential schema reference\n */\nexport const DOMAIN_CARD_SCHEMA = {\n id: 'https://w3id.org/ixo/protocol/schema/v1#domainCard',\n type: 'JsonSchema',\n} as const;\n\n/**\n * DataIntegrityProof structure for signed credentials\n */\nexport interface DataIntegrityProof {\n type: 'DataIntegrityProof';\n created: string;\n verificationMethod: string;\n cryptosuite: 'eddsa-rdfc-2022';\n proofPurpose: 'assertionMethod';\n proofValue: string;\n}\n\n/**\n * Unsigned Verifiable Credential structure\n */\nexport interface UnsignedVerifiableCredential {\n '@context': typeof DOMAIN_CARD_CONTEXT;\n id: string;\n type: ['VerifiableCredential', 'ixo:DomainCard'];\n issuer: {\n id: string;\n };\n validFrom: string;\n validUntil: string;\n credentialSchema: typeof DOMAIN_CARD_SCHEMA;\n credentialSubject: DomainCardCredentialSubject;\n}\n\n/**\n * Signed Verifiable Credential with proof\n */\nexport interface SignedVerifiableCredential extends UnsignedVerifiableCredential {\n proof: DataIntegrityProof;\n}\n\n/**\n * Base credential subject with required fields.\n * Used for flexible input that may come from different sources (survey, existing credential, etc.)\n */\nexport interface BaseCredentialSubject {\n id: string;\n type: string[];\n name: string;\n description: string;\n [key: string]: unknown; // Allow additional properties\n}\n\n/**\n * Parameters for building an unsigned verifiable credential\n */\nexport interface BuildCredentialParams {\n /** DID of the entity this domain card describes */\n entityDid: string;\n /** DID of the issuer signing this credential */\n issuerDid: string;\n /** The credential subject containing domain card data (flexible input) */\n credentialSubject: BaseCredentialSubject | DomainCardCredentialSubject;\n /** ISO 8601 date string for when credential becomes valid */\n validFrom: string;\n /** ISO 8601 date string for when credential expires */\n validUntil: string;\n}\n\n/**\n * Converts a date input to ISO 8601 string format.\n * Handles various input formats from survey fields.\n */\nfunction toISOString(dateInput: string | Date | undefined, fallback: Date = new Date()): string {\n if (!dateInput) {\n return fallback.toISOString();\n }\n\n if (dateInput instanceof Date) {\n return dateInput.toISOString();\n }\n\n // Handle date-only strings (YYYY-MM-DD) from date inputs\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(dateInput)) {\n return new Date(dateInput + 'T00:00:00.000Z').toISOString();\n }\n\n // Handle datetime-local strings (YYYY-MM-DDTHH:MM)\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(dateInput)) {\n return new Date(dateInput + ':00.000Z').toISOString();\n }\n\n // Try parsing as-is\n const parsed = new Date(dateInput);\n if (!isNaN(parsed.getTime())) {\n return parsed.toISOString();\n }\n\n return fallback.toISOString();\n}\n\n/**\n * Calculates a default expiration date (5 years from validFrom).\n */\nfunction getDefaultValidUntil(validFrom: string): string {\n const fromDate = new Date(validFrom);\n const untilDate = new Date(fromDate);\n untilDate.setFullYear(untilDate.getFullYear() + 5);\n return untilDate.toISOString();\n}\n\n/**\n * Builds an unsigned verifiable credential for a Domain Card.\n *\n * @param params - Parameters for building the credential\n * @returns An unsigned verifiable credential ready for signing\n *\n * @example\n * ```typescript\n * const credential = buildVerifiableCredential({\n * entityDid: 'did:ixo:entity:abc123',\n * issuerDid: 'did:ixo:ixo1xyz...',\n * credentialSubject: transformedSubject,\n * validFrom: '2025-01-01',\n * validUntil: '2030-01-01',\n * });\n * ```\n */\nexport function buildVerifiableCredential(params: BuildCredentialParams): UnsignedVerifiableCredential {\n const { entityDid, issuerDid, credentialSubject, validFrom, validUntil } = params;\n\n const validFromISO = toISOString(validFrom);\n const validUntilISO = validUntil ? toISOString(validUntil) : getDefaultValidUntil(validFromISO);\n\n return {\n '@context': DOMAIN_CARD_CONTEXT,\n id: `${entityDid}#dmn`,\n type: ['VerifiableCredential', 'ixo:DomainCard'],\n issuer: {\n id: issuerDid,\n },\n validFrom: validFromISO,\n validUntil: validUntilISO,\n credentialSchema: DOMAIN_CARD_SCHEMA,\n credentialSubject: {\n ...credentialSubject,\n // Ensure the subject ID matches the entity DID\n id: entityDid,\n },\n };\n}\n\n/**\n * LinkedResource structure for storing the credential on-chain\n */\nexport interface DomainCardLinkedResource {\n id: string;\n type: 'domainCard';\n proof: string;\n right: string;\n encrypted: string;\n mediaType: 'application/json';\n description: string;\n serviceEndpoint: string;\n}\n\n/**\n * Builds a LinkedResource object for a Domain Card credential.\n *\n * @param params - Parameters for building the linked resource\n * @returns A LinkedResource object ready to be added to an entity\n *\n * @example\n * ```typescript\n * const linkedResource = buildDomainCardLinkedResource({\n * entityDid: 'did:ixo:entity:abc123',\n * cid: 'bafkreid2t3hp7qi6ynyvaz4o3bphyjtqcz2qwlhm4odvuvesnh6dtv3hvu',\n * serviceEndpoint: 'https://mx.ixo.earth/_matrix/media/v3/download/...',\n * });\n * ```\n */\nexport function buildDomainCardLinkedResource(params: { entityDid: string; cid: string; serviceEndpoint: string; description?: string }): DomainCardLinkedResource {\n return {\n id: `${params.entityDid}#dmn`,\n type: 'domainCard',\n proof: params.cid,\n right: '',\n encrypted: 'false',\n mediaType: 'application/json',\n description: params.description || 'Domain Card',\n serviceEndpoint: params.serviceEndpoint,\n };\n}\n","interface SurveyElement {\n type: string;\n name?: string;\n elements?: SurveyElement[];\n templateElements?: SurveyElement[];\n}\n\ninterface SurveyPage {\n name: string;\n elements: SurveyElement[];\n}\n\ninterface SurveyDefinition {\n pages: SurveyPage[];\n}\n\n/**\n * Recursively extracts field names from survey elements.\n * Handles nested panels and paneldynamic template elements.\n */\nfunction extractFieldsFromElements(elements: SurveyElement[], fields: Record<string, unknown>): void {\n for (const element of elements) {\n // Skip panel containers but process their children\n if (element.type === 'panel' && element.elements) {\n extractFieldsFromElements(element.elements, fields);\n continue;\n }\n\n // Handle paneldynamic - these create arrays of objects\n if (element.type === 'paneldynamic' && element.name) {\n // Initialize as empty array for dynamic panels\n fields[element.name] = [];\n\n // Also extract template element names for reference\n if (element.templateElements) {\n extractFieldsFromElements(element.templateElements, fields);\n }\n continue;\n }\n\n // Regular input elements with a name\n if (element.name && element.type !== 'panel') {\n // Set appropriate default based on type\n switch (element.type) {\n case 'boolean':\n fields[element.name] = false;\n break;\n case 'checkbox':\n fields[element.name] = [];\n break;\n case 'file':\n fields[element.name] = [];\n break;\n default:\n fields[element.name] = '';\n }\n }\n\n // Handle nested elements in regular panels\n if (element.elements) {\n extractFieldsFromElements(element.elements, fields);\n }\n }\n}\n\n/**\n * Extracts all field names from a SurveyJS survey definition\n * and creates an empty answers template object.\n *\n * This template can be used to:\n * 1. Initialize the answers prop with all possible fields\n * 2. Provide AI agents with the structure they can fill in\n *\n * @param surveyDef - The SurveyJS survey definition object\n * @returns An object with all field names as keys and empty/default values\n */\nexport function extractSurveyAnswersTemplate(surveyDef: SurveyDefinition): Record<string, unknown> {\n const fields: Record<string, unknown> = {};\n\n for (const page of surveyDef.pages) {\n extractFieldsFromElements(page.elements, fields);\n }\n\n return fields;\n}\n\n/**\n * Creates a stringified empty answers template from a survey definition.\n * Useful for initializing the block prop.\n */\nexport function createEmptyAnswersJson(surveyDef: SurveyDefinition): string {\n return JSON.stringify(extractSurveyAnswersTemplate(surveyDef));\n}\n","import type { LinkedEntityData } from '@/mantine/blocks/governanceGroup/types';\n\n/**\n * LinkedEntity structure for createDomain call\n */\nexport interface LinkedEntity {\n id: string;\n type: string;\n relationship: string;\n service: string;\n}\n\n/**\n * Parse linked entities from block props\n */\nexport function parseLinkedEntities(entitiesString: string): LinkedEntityData[] {\n if (!entitiesString || entitiesString === '[]') return [];\n try {\n return JSON.parse(entitiesString) as LinkedEntityData[];\n } catch {\n return [];\n }\n}\n\n/**\n * Build LinkedEntity array for governance groups\n * These will be passed to createDomain as linkedEntity parameter\n */\nexport function buildGovernanceGroupLinkedEntities(linkedEntities: LinkedEntityData[]): LinkedEntity[] {\n return linkedEntities\n .filter((entity) => entity.type === 'governanceGroup' && entity.coreAddress)\n .map((entity) => ({\n id: `{id}#${entity.coreAddress}`,\n type: 'group',\n relationship: 'governs',\n service: '',\n }));\n}\n","export const tempDomainCreatorSurvey = {\n title: 'Domain Card Creation',\n description: 'This survey collects structured information required to create a Domain Card Verifiable Credential in compliance with W3C standards.',\n pages: [\n {\n name: 'domainDetails',\n title: 'Domain Information',\n description: 'Provide identifying and descriptive information about the domain entity represented by this credential.',\n elements: [\n {\n type: 'boolean',\n name: 'ixo:advancedDomainSettings',\n title: 'Show Advanced Options',\n defaultValue: 'false',\n },\n {\n type: 'dropdown',\n name: 'type_1',\n visible: false,\n title: 'Domain Type (Primary)',\n defaultValue: 'dao',\n choices: [\n {\n value: 'dao',\n text: 'DAO',\n },\n {\n value: 'protocol',\n text: 'Protocol',\n },\n ],\n },\n {\n type: 'dropdown',\n name: 'type_2',\n title: 'Domain Type ',\n isRequired: true,\n choicesByUrl: {\n url: 'https://test.studio.ixo.earth/api/survey-choices?url=https://raw.githubusercontent.com/ixofoundation/ns/refs/heads/GraemeLeightonIXO-patch-4/protocol/entities/v1/index.json&path=entities.dao.types',\n valueName: 'Value',\n titleName: 'Text',\n },\n },\n {\n type: 'dropdown',\n name: 'daoType',\n title: 'DAO Type',\n isRequired: true,\n choicesByUrl: {\n url: 'https://test.studio.ixo.earth/api/survey-choices?url=https://raw.githubusercontent.com/ixofoundation/ns/refs/heads/GraemeLeightonIXO-patch-4/protocol/tags/v1/index.json&path=daoType',\n valueName: 'Value',\n titleName: 'Text',\n },\n },\n {\n type: 'text',\n name: 'schema:validFrom',\n title: 'Valid From',\n defaultValueExpression: 'today()',\n isRequired: true,\n inputType: 'date',\n },\n {\n type: 'text',\n name: 'schema:validUntil',\n title: 'Vaid Untill',\n defaultValueExpression: 'today()',\n isRequired: true,\n inputType: 'date',\n },\n {\n type: 'text',\n name: 'schema:name',\n title: 'Domain Name',\n description: 'The official name of the domain.',\n isRequired: true,\n },\n {\n type: 'paneldynamic',\n name: 'pannel_schema:alternateName',\n title: 'Alternate Names',\n templateElements: [\n {\n type: 'text',\n name: 'schema:alternateName',\n title: 'Alternate Name',\n },\n ],\n },\n {\n type: 'text',\n name: 'schema:url',\n title: 'URL',\n description: 'Primary URL for the domain',\n inputType: 'url',\n },\n {\n type: 'paneldynamic',\n name: 'schema:sameAs',\n title: 'Additional URLs',\n description: 'Additional URLs associated with the domain (Twitter, Github, Medium)',\n templateElements: [\n {\n type: 'text',\n name: 'schema:sameAs.url',\n title: 'URL',\n inputType: 'url',\n },\n ],\n },\n {\n type: 'comment',\n name: 'schema.description',\n title: 'Canonical Description',\n description: 'A concise, one-paragraph description of the domain.',\n isRequired: true,\n },\n {\n type: 'panel',\n name: 'pannel_schema:media',\n title: 'Domain Images',\n elements: [\n {\n type: 'text',\n name: 'ixo:imageProfile_url',\n title: 'Profile Image URL',\n inputType: 'url',\n },\n {\n type: 'file',\n name: 'ixo:imageProfile',\n title: 'Profile Image',\n },\n {\n type: 'text',\n name: 'ixo:imageLogo_url',\n title: 'Logo URL',\n inputType: 'url',\n },\n {\n type: 'file',\n name: 'ixo:imageLogo',\n title: 'Logo',\n },\n ],\n },\n {\n type: 'comment',\n name: 'schema:keywords',\n title: 'Keywords',\n description: 'List of comma separated keywords describing the domain’s focus areas.',\n },\n {\n type: 'paneldynamic',\n name: 'pannel_ixo:knowsAbout',\n title: 'Topics /Primary Knowledge Areas',\n description: 'Subjects or fields the domain is knowledgeable in.',\n templateElements: [\n {\n type: 'text',\n name: 'ixo:knowsAbout',\n title: 'Knows About',\n },\n ],\n },\n ],\n },\n {\n name: 'contactAndLocation',\n visibleIf: '{ixo:advancedDomainSettings} = true',\n title: 'Contact & Location',\n description: 'Provide address and contact information for the domain.',\n elements: [\n {\n type: 'panel',\n name: 'schema:address',\n title: 'Postal Address',\n elements: [\n {\n type: 'text',\n name: 'schema:streetAddress',\n title: 'Street Address',\n },\n {\n type: 'text',\n name: 'schema:addressLocality',\n title: 'City',\n },\n {\n type: 'text',\n name: 'schema:addressRegion',\n title: 'Region/State',\n },\n {\n type: 'text',\n name: 'schema:postalCode',\n title: 'Postal Code',\n },\n {\n type: 'text',\n name: 'schema:addressCountry',\n title: 'Country',\n },\n ],\n },\n {\n type: 'text',\n name: 'schema:AdministrativeArea',\n title: 'Area Served',\n },\n {\n type: 'paneldynamic',\n name: 'pannel:schema_contactPoint',\n title: 'Contact Points',\n description: 'List available contact methods for support, business, or technical inquiries.',\n templateElements: [\n {\n type: 'text',\n name: 'schema:contactType',\n title: 'Contact Type',\n description: 'Example: General, Support, Sales',\n },\n {\n type: 'text',\n name: 'schema:email',\n title: 'Email Address',\n inputType: 'email',\n },\n {\n type: 'text',\n name: 'schema:telephone',\n title: 'Telephone ',\n inputType: 'tel',\n },\n {\n type: 'text',\n name: 'schema:availableLanguage',\n title: 'Languages Supported',\n description: 'Comma separated two letter language code (English = en)',\n },\n ],\n },\n ],\n },\n {\n name: 'composition',\n visibleIf: '{ixo:advancedDomainSettings} = true',\n title: 'Composition',\n elements: [\n {\n type: 'paneldynamic',\n name: 'schema:hasPart',\n title: 'Domain Components',\n description: 'Describes the specific items, documents, linked domains, or components that belong to this domain.',\n templateElements: [\n {\n type: 'text',\n name: 'schema:hasPart.id',\n title: 'Identifier',\n description: 'URI or URL ',\n },\n {\n type: 'text',\n name: 'schema:hasPart.name',\n title: 'Name',\n },\n {\n type: 'text',\n name: 'schema:hasPart.description',\n title: 'Description',\n },\n {\n type: 'text',\n name: 'schema:hasPart.url',\n title: 'URL',\n description: 'If different to the identifier',\n inputType: 'url',\n },\n {\n type: 'text',\n name: 'schema:hasPart.creator.name',\n title: 'Creator',\n description: 'Component creator (Organisation Name)',\n },\n ],\n },\n {\n type: 'paneldynamic',\n name: 'schema:subjectOf',\n title: 'Publications',\n description: 'Publications produced by the domain or where the domain is the subject.',\n templateElements: [\n {\n type: 'text',\n name: 'schema:subjectOf.name',\n title: 'Publication Title',\n },\n {\n type: 'text',\n name: 'schema:subjectOf.url',\n title: 'URL',\n },\n {\n type: 'text',\n name: 'schema:subjectOf.author.name',\n title: 'Author',\n },\n ],\n },\n {\n type: 'paneldynamic',\n name: 'schema:makesOffer',\n title: 'Offers (Product and/or Services)',\n templateElements: [\n {\n type: 'dropdown',\n name: 'schema:itemOffered.type',\n title: 'Catagory',\n choices: [\n {\n value: 'product',\n text: 'Product',\n },\n {\n value: 'service',\n text: 'Service',\n },\n ],\n },\n {\n type: 'text',\n name: 'schema:itemOffered.name',\n title: 'Name',\n },\n {\n type: 'text',\n name: 'schema:itemOffered.description',\n title: 'Description',\n },\n {\n type: 'text',\n name: 'schema:itemOffered.url',\n title: 'URL',\n inputType: 'url',\n },\n ],\n },\n ],\n },\n {\n name: 'relationshipsAndOffers',\n visibleIf: '{ixo:advancedDomainSettings} = true',\n title: 'Relationships & Funding',\n description: 'Describe the domain’s relationships with other organizations and its software or service offerings.',\n elements: [\n {\n type: 'paneldynamic',\n name: 'schema:memberOf',\n title: 'Memberships',\n templateElements: [\n {\n type: 'text',\n name: 'schema:memberOf.name',\n title: 'Organization Name',\n },\n ],\n },\n {\n type: 'paneldynamic',\n name: 'schema:wasAssociatedWith',\n title: 'Partner/Associated Organizations',\n templateElements: [\n {\n type: 'text',\n name: 'schema:wasAssociatedWith.name',\n title: 'Organization Name',\n },\n {\n type: 'text',\n name: 'schema:wasAssociatedWith.url',\n title: 'URL',\n },\n ],\n },\n {\n type: 'paneldynamic',\n name: 'schema:funding',\n title: 'Funding Sources',\n templateElements: [\n {\n type: 'text',\n name: 'schema:funder.name',\n title: 'Funder Organization',\n },\n {\n type: 'text',\n name: 'schema:amount.currency',\n title: 'Currency Code',\n },\n {\n type: 'text',\n name: 'schema:amount.value',\n title: 'Funding Amount',\n },\n ],\n },\n ],\n },\n {\n name: 'events',\n visibleIf: '{ixo:advancedDomainSettings} = true',\n title: 'Events',\n elements: [\n {\n type: 'paneldynamic',\n name: 'schema:event',\n title: 'Event',\n templateElements: [\n {\n type: 'text',\n name: 'schema:event.name',\n title: 'Name',\n },\n {\n type: 'text',\n name: 'schema:startDate',\n title: 'Start Date',\n },\n {\n type: 'text',\n name: 'schema:endDate',\n title: 'End Date',\n },\n {\n type: 'text',\n name: 'schema:event.location',\n title: 'Location Name',\n },\n {\n type: 'panel',\n name: 'schema:event.address',\n title: 'Postal Address',\n elements: [\n {\n type: 'text',\n name: 'schema:event.streetAddress',\n title: 'Street Address',\n },\n {\n type: 'text',\n name: 'schema:event.addressLocality',\n title: 'City',\n },\n {\n type: 'text',\n name: 'schema:event.addressRegion',\n title: 'Region/State',\n },\n {\n type: 'text',\n name: 'schema:event.postalCode',\n title: 'Postal Code',\n },\n {\n type: 'text',\n name: 'schema:event.addressCountry',\n title: 'Country',\n },\n ],\n },\n ],\n },\n ],\n },\n {\n name: 'agentsCredentialsAndAttributes',\n visibleIf: '{ixo:advancedDomainSettings} = true',\n title: 'Agents, Credentials, and Attributes',\n elements: [\n {\n type: 'paneldynamic',\n name: 'ixo:agentCard',\n title: 'Agents',\n templateElements: [\n {\n type: 'text',\n name: 'ixo:agentCard.id',\n title: 'Agent ID',\n },\n {\n type: 'text',\n name: 'ixo:agentCard.name',\n title: 'Name',\n },\n {\n type: 'text',\n name: 'ixo:agentCard.description',\n title: 'Description',\n },\n ],\n },\n {\n type: 'paneldynamic',\n name: 'ixo:verifiableCredential',\n title: 'Credentials',\n templateElements: [\n {\n type: 'text',\n name: 'schema:ID',\n title: 'Credential ID',\n },\n {\n type: 'text',\n name: 'schema:Name',\n title: 'Name',\n },\n {\n type: 'text',\n name: 'schema:description',\n title: 'Description',\n },\n ],\n },\n {\n type: 'paneldynamic',\n name: 'ixo:attribute',\n title: 'Attributes',\n templateElements: [\n {\n type: 'text',\n name: 'schema:ID_2',\n title: 'Attribute ID',\n },\n {\n type: 'text',\n name: 'schema:name_2',\n title: 'Name',\n },\n {\n type: 'text',\n name: 'schema:description_2',\n title: 'Description',\n },\n ],\n },\n ],\n },\n {\n name: 'project',\n visibleIf: '{ixo:advancedDomainSettings} = true',\n title: 'Project Information',\n description: 'Provide details about the related project(s), including objectives, sponsors, and deliverables.',\n elements: [\n {\n type: 'paneldynamic',\n name: 'pannel_proj:project',\n title: 'Projects',\n templateElements: [\n {\n type: 'text',\n name: 'proj:project.name',\n title: 'Project Title',\n },\n {\n type: 'comment',\n name: 'proj:project.description',\n title: 'Project Mission',\n description: 'High-level purpose or mission statement of the project.',\n },\n {\n type: 'paneldynamic',\n name: 'proj:project.hadObjective',\n title: 'Project Objectives',\n templateElements: [\n {\n type: 'comment',\n name: 'proj:hadObjective',\n title: 'Project Objective',\n },\n ],\n },\n {\n type: 'text',\n name: 'proj:plannedStart',\n title: 'Planned Start Date',\n inputType: 'datetime-local',\n },\n {\n type: 'text',\n name: 'proj:plannedEnd',\n title: 'Planned End Date',\n inputType: 'datetime-local',\n },\n {\n type: 'paneldynamic',\n name: 'proj:wasFundedThrough',\n title: 'Project Funding',\n templateElements: [\n {\n type: 'text',\n name: 'proj:moneyAmount',\n title: 'Funding Amount',\n },\n {\n type: 'text',\n name: 'proj:moneyCurrency',\n title: 'Funding Currency',\n },\n {\n type: 'text',\n name: 'prov.agent.name',\n title: 'Funder Name',\n },\n {\n type: 'text',\n name: 'prov:agent.id',\n title: 'Funder URL',\n inputType: 'url',\n },\n ],\n },\n ],\n },\n ],\n },\n {\n name: 'researchProfile',\n title: 'Research Profile',\n description: 'Provide information about the research profile associated with the domain.',\n elements: [\n {\n type: 'paneldynamic',\n name: 'ixo:ResearchProfile',\n title: 'Seed Queries',\n templateElements: [\n {\n type: 'comment',\n name: 'ixo:seedQueries',\n title: 'Seed Query',\n description: 'Seed keywords or queries that define the research scope.',\n },\n ],\n },\n {\n type: 'paneldynamic',\n name: 'schema:creativeWork',\n title: 'Citations',\n templateElements: [\n {\n type: 'text',\n name: 'schema:creativeWork.name',\n title: 'Citation Title',\n },\n {\n type: 'text',\n name: 'schema:creativeWork.url',\n title: 'Citation URL',\n },\n {\n type: 'text',\n name: 'schema:creativeWork.publisher',\n title: 'Publisher',\n },\n {\n type: 'text',\n name: 'schema:creativeWork.datePublished',\n title: 'Date Published',\n inputType: 'datetime-local',\n },\n ],\n },\n ],\n },\n ],\n showPageTitles: false,\n showQuestionNumbers: 'on',\n showProgressBar: true,\n progressBarLocation: 'top',\n};\n","import { registerAction, doneWhenCompleted } from '../registry';\nimport { parseMaybeJsonObject } from '../inputRequirements';\nimport { buildVerifiableCredential, buildDomainCardLinkedResource } from '@/core/lib/domainCard';\n\n/**\n * Map a schema.org-style credential type (e.g. `schema:Organization`) to the\n * on-chain entity type accepted by `createDomain`. Valid on-chain types are\n * `dao/pod`, `protocol`, `oracle`, `investment`, `project`, `asset`. Schema types\n * without a direct match fall back to `dao/pod`.\n */\nexport function resolveEntityTypeFromSchema(schemaType: string): string {\n const normalized = schemaType.replace(/^schema:/i, '').toLowerCase();\n const schemaToEntity: Record<string, string> = {\n organization: 'dao/pod',\n nonprofit: 'dao/pod',\n corporation: 'dao/pod',\n governmentorganization: 'dao/pod',\n };\n if (schemaToEntity[normalized]) return schemaToEntity[normalized];\n const allowed = new Set(['dao/pod', 'protocol', 'oracle', 'investment', 'project', 'asset']);\n return allowed.has(normalized) ? normalized : 'dao/pod';\n}\n\n/** Parse a JSON input that may be a string, object, or empty. */\nfunction parseJsonInput(value: unknown): Record<string, any> | null {\n if (!value) return null;\n if (typeof value === 'object' && !Array.isArray(value)) return value as Record<string, any>;\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' ? parsed : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction parseContextInput(value: unknown): Array<{ key: string; val: string }> {\n let raw = value;\n if (typeof value === 'string') {\n try {\n raw = JSON.parse(value);\n } catch {\n raw = [];\n }\n }\n if (!Array.isArray(raw)) return [];\n\n return raw\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null;\n const key = String((entry as Record<string, unknown>).key || '').trim();\n const val = String((entry as Record<string, unknown>).val || '').trim();\n return key && val ? { key, val } : null;\n })\n .filter((entry): entry is { key: string; val: string } => entry !== null);\n}\n\ntype SelectedProtocolTemplate = {\n protocolDid: string;\n sourceRoomId: string;\n sourceLabel?: string;\n};\n\nfunction getSelectedProtocolTemplates(flowTemplateConfig: Record<string, any> | null): SelectedProtocolTemplate[] {\n const raw = flowTemplateConfig?.selectedTemplates;\n if (!Array.isArray(raw)) return [];\n\n return raw\n .map((item) => {\n if (!item || typeof item !== 'object') return null;\n const record = item as Record<string, unknown>;\n const protocolDid = String(record.protocolDid || '').trim();\n const sourceRoomId = String(record.sourceRoomId || '').trim();\n if (!protocolDid || !sourceRoomId) return null;\n const sourceLabel = String(record.sourceLabel || record.label || '').trim();\n return {\n protocolDid,\n sourceRoomId,\n ...(sourceLabel ? { sourceLabel } : {}),\n };\n })\n .filter((item): item is SelectedProtocolTemplate => item !== null);\n}\n\nfunction groupTemplatesByProtocol(templates: SelectedProtocolTemplate[]): Map<string, Array<{ sourceRoomId: string; sourceLabel?: string }>> {\n const grouped = new Map<string, Array<{ sourceRoomId: string; sourceLabel?: string }>>();\n for (const template of templates) {\n const existing = grouped.get(template.protocolDid) || [];\n existing.push({\n sourceRoomId: template.sourceRoomId,\n ...(template.sourceLabel ? { sourceLabel: template.sourceLabel } : {}),\n });\n grouped.set(template.protocolDid, existing);\n }\n return grouped;\n}\n\ntype DomainSignCheckpointStep =\n | 'createGovernanceGroup'\n | 'createDomain'\n | 'signAndUploadDomainCard'\n | 'addLinkedResource'\n | 'addParentLinkedEntity'\n | 'sourceDomainSpaces'\n | 'importTemplates';\n\ntype DomainSignCheckpoint = {\n invocationId: string;\n status: 'running' | 'completed' | 'failed';\n updatedAt: string;\n entityDid?: string;\n governanceGroupCoreAddress?: string;\n governanceGroupLinkedEntities?: any[];\n transactionHash?: string;\n linkedResourceTransactionHash?: string;\n parentEntityDid?: string;\n parentLinkedEntity?: { id: string; type: string; relationship: string; service: string };\n parentLinkedEntityTransactionHash?: string;\n domainCardLinkedResource?: ReturnType<typeof buildDomainCardLinkedResource>;\n flowTemplateConfig?: Record<string, any> | null;\n domainSpaces?: any;\n protocolTemplateImports?: Array<{ protocolDid: string; imported: any[] }>;\n output?: Record<string, any>;\n error?: string;\n completedSteps?: Partial<Record<DomainSignCheckpointStep, boolean>>;\n};\n\nconst DOMAIN_SIGN_CACHE_KEY = 'domainSign';\n\nfunction getDomainSignCheckpointKey(inputs: Record<string, unknown>, ctx: any): string {\n return String(ctx.pendingInvocation?.id || inputs.pendingInvocationId || inputs.invocationId || 'manual');\n}\n\nfunction readDomainSignCheckpoint(ctx: any, key: string): DomainSignCheckpoint | undefined {\n const cache = ctx.runtime?.get?.(ctx.nodeId)?.cache;\n const bucket = cache?.[DOMAIN_SIGN_CACHE_KEY];\n if (!bucket || typeof bucket !== 'object') return undefined;\n const checkpoint = (bucket as Record<string, unknown>)[key];\n return checkpoint && typeof checkpoint === 'object' ? (checkpoint as DomainSignCheckpoint) : undefined;\n}\n\nfunction writeDomainSignCheckpoint(ctx: any, key: string, checkpoint: DomainSignCheckpoint): void {\n if (!ctx.runtime?.get || !ctx.runtime?.update || !ctx.nodeId) return;\n const current = ctx.runtime.get(ctx.nodeId) || {};\n const cache = current.cache && typeof current.cache === 'object' ? current.cache : {};\n const bucket = cache[DOMAIN_SIGN_CACHE_KEY] && typeof cache[DOMAIN_SIGN_CACHE_KEY] === 'object' ? (cache[DOMAIN_SIGN_CACHE_KEY] as Record<string, unknown>) : {};\n ctx.runtime.update(ctx.nodeId, {\n cache: {\n ...cache,\n [DOMAIN_SIGN_CACHE_KEY]: {\n ...bucket,\n [key]: checkpoint,\n },\n },\n });\n}\n\nfunction buildCompletedDomainSignResult(output: Record<string, any>) {\n const payload = {\n entityDid: output.entityDid,\n governanceGroupCoreAddress: output.governanceGroupCoreAddress || '',\n transactionHash: output.transactionHash || '',\n linkedResourceTransactionHash: output.linkedResourceTransactionHash || '',\n ...(output.parentLinkedEntityTransactionHash ? { parentLinkedEntityTransactionHash: output.parentLinkedEntityTransactionHash } : {}),\n };\n\n return {\n output,\n events: [\n {\n name: 'created',\n payload,\n },\n ],\n };\n}\n\nfunction readDidInput(value: unknown): string {\n if (typeof value !== 'string') return '';\n const did = value.trim();\n if (!did || did === 'null' || did === 'undefined') return '';\n return did.startsWith('did:') ? did : '';\n}\n\nfunction getSelectedParentEntityDid(inputs: Record<string, unknown>): string {\n if (inputs.skipped === true || inputs.parentSkipped === true) return '';\n return readDidInput(inputs.selectedEntityDid) || readDidInput(inputs.parentDid) || readDidInput(inputs.parentDID);\n}\n\n/** Max times we re-prompt for the PIN before giving up and surfacing the error. */\nconst MAX_PIN_ATTEMPTS = 3;\n\n/**\n * A wrong PIN throws \"Invalid PIN - could not decrypt mnemonic\" (the mnemonic\n * is encrypted with the PIN, so a bad PIN fails decryption). This is a\n * recoverable, user-correctable error — re-prompt rather than failing the run.\n */\nfunction isInvalidPinError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return /invalid pin|could not decrypt mnemonic/i.test(msg);\n}\n\n/**\n * Parse a duration string like '604800s' into amount + unit suitable for\n * the daodao group config (proposalDurationAmount / proposalDurationUnit).\n */\nfunction parseDuration(raw: string): { amount: number; unit: string } {\n const seconds = parseInt(raw, 10) || 0;\n if (seconds % (7 * 86400) === 0) return { amount: seconds / (7 * 86400), unit: 'weeks' };\n if (seconds % 86400 === 0) return { amount: seconds / 86400, unit: 'days' };\n if (seconds % 3600 === 0) return { amount: seconds / 3600, unit: 'hours' };\n if (seconds % 60 === 0) return { amount: seconds / 60, unit: 'minutes' };\n return { amount: seconds, unit: 'seconds' };\n}\n\n/**\n * Build the config object for `handlers.createGovernanceGroup` by transforming\n * the PODGovernance + member data from the barrier payload into the shape the\n * daodao message builders expect (CategoricalGroupConfig, MultisigGroupConfig,\n * NftStakingGroupConfig, or TokenStakingGroupConfig).\n *\n * Member identifiers are forwarded as DIDs in the address fields — the\n * consumer's message builders resolve them to bech32 account addresses\n * (`did:ixo:<address>` embeds the address) before anything reaches the chain.\n */\nfunction buildGroupConfig(groupType: string, governance: Record<string, any>, memberConfig: Record<string, any> | null): Record<string, unknown> {\n const duration = parseDuration(governance.votingPeriod || '604800s');\n const thresholdNum = parseFloat(governance.threshold || '0.51');\n const quorumNum = parseFloat(governance.quorum);\n const unstakingDuration = governance.unstakingDuration ? parseDuration(governance.unstakingDuration) : null;\n\n const baseConfig: Record<string, unknown> = {\n proposalDurationAmount: duration.amount,\n proposalDurationUnit: duration.unit,\n proposalSubmissionPolicy: 'members',\n voteSwitching: false,\n };\n\n // Pod governance thresholds are decimals of votes cast (0–1]; the builders\n // take percentages, paired with the quorum via threshold_quorum on-chain.\n const decisionPolicy: Record<string, unknown> = {\n passingThreshold: 'percentage',\n passingThresholdPercentage: Math.round(thresholdNum * 100),\n ...(Number.isFinite(quorumNum) && quorumNum > 0 ? { quorum: 'percentage', quorumPercentage: Math.round(quorumNum * 100) } : {}),\n };\n\n if (groupType === 'multisig') {\n const members = (memberConfig?.members || []) as Array<{ did: string }>;\n return {\n ...baseConfig,\n threshold: memberConfig?.multisigThreshold || 1,\n membershipCategory: [{ members: members.map((m) => m.did) }],\n };\n }\n\n if (groupType === 'nftStaking') {\n return {\n ...baseConfig,\n ...decisionPolicy,\n nftContractAddress: memberConfig?.nftContractAddress || '',\n ...(unstakingDuration ? { unstakingDurationAmount: unstakingDuration.amount, unstakingDurationUnit: unstakingDuration.unit } : {}),\n };\n }\n\n if (groupType === 'tokenStaking') {\n const tokenConfig = memberConfig?.tokenConfig || {};\n return {\n ...baseConfig,\n ...decisionPolicy,\n isExistingToken: Boolean(tokenConfig.isExistingToken),\n tokenAddress: tokenConfig.tokenAddress || '',\n tokenName: tokenConfig.tokenName || '',\n tokenSymbol: tokenConfig.tokenSymbol || '',\n tokenSupply: tokenConfig.tokenSupply || 0,\n distributionCategory: tokenConfig.distributionCategory || [],\n ...(unstakingDuration ? { unstakingDurationAmount: unstakingDuration.amount, unstakingDurationUnit: unstakingDuration.unit } : {}),\n };\n }\n\n // categorical (default)\n const members = (memberConfig?.members || []) as Array<{ did: string; role: string; votingPower: number }>;\n const byRole = new Map<string, { dids: string[]; weight: number }>();\n for (const m of members) {\n const role = m.role || 'member';\n const existing = byRole.get(role);\n if (existing) {\n existing.dids.push(m.did);\n } else {\n byRole.set(role, { dids: [m.did], weight: m.votingPower || 1 });\n }\n }\n\n return {\n ...baseConfig,\n ...decisionPolicy,\n membershipCategory: Array.from(byRole.entries()).map(([role, { dids, weight }]) => ({\n categoryName: role,\n members: dids.map((did) => ({ memberAddress: did })),\n weightPerMember: weight,\n })),\n };\n}\n\nregisterAction({\n type: 'qi/domain.sign',\n can: 'domain/sign',\n sideEffect: true,\n proof: { fields: ['entityDid'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: true,\n\n inputSchema: {\n type: 'object',\n required: ['domainCardData'],\n properties: {\n domainCardData: {\n type: 'object',\n description: 'Domain card envelope (object or JSON string) with credentialSubject.name; signed and used to create the domain.',\n },\n entityType: { type: 'string', description: 'Optional on-chain entity type; defaults from the credential type or dao/pod.' },\n governanceConfig: { type: 'object', description: 'Optional governance group config (object or JSON string) used to create a governance group.' },\n memberConfig: { type: 'object', description: 'Optional member config (object or JSON string) for the governance group.' },\n flowTemplateConfig: { type: 'object', description: 'Optional flow template config (object or JSON string) with selected protocol templates.' },\n context: { type: 'array', description: 'Optional context entries (array of { key, val } or JSON string) attached to the domain.' },\n selectedEntityDid: { type: 'string', description: 'Optional parent entity DID to link the new POD to.' },\n parentDid: { type: 'string', description: 'Optional parent entity DID (alternate field).' },\n parentDID: { type: 'string', description: 'Optional parent entity DID (alternate field).' },\n skipped: { type: 'boolean', description: 'Optional flag that skips parent entity linking.' },\n parentSkipped: { type: 'boolean', description: 'Optional flag that skips parent entity linking.' },\n pendingInvocationId: { type: 'string', description: 'Optional invocation ID used as the checkpoint key for resumable runs.' },\n invocationId: { type: 'string', description: 'Optional invocation ID used as the checkpoint key for resumable runs.' },\n },\n },\n\n outputSchema: [\n { path: 'entityDid', displayName: 'Entity DID', type: 'string', description: 'The DID of the newly created domain entity' },\n {\n path: 'governanceGroupCoreAddress',\n displayName: 'Governance Group Core Address',\n type: 'string',\n description: 'The core address of the created governance group, when one was created',\n },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The on-chain transaction hash for domain creation' },\n {\n path: 'linkedResourceTransactionHash',\n displayName: 'Linked Resource Transaction Hash',\n type: 'string',\n description: 'The on-chain transaction hash for adding the domain card linked resource',\n },\n {\n path: 'parentEntityDid',\n displayName: 'Parent Entity DID',\n type: 'string',\n description: 'The selected parent entity DID that was updated with the new POD linked entity',\n },\n {\n path: 'parentLinkedEntityTransactionHash',\n displayName: 'Parent Linked Entity Transaction Hash',\n type: 'string',\n description: 'The on-chain transaction hash for linking the new POD to the selected parent entity',\n },\n {\n path: 'flowTemplateConfig',\n displayName: 'Flow Template Config',\n type: 'object',\n description: 'Selected protocol templates captured before POD creation',\n },\n {\n path: 'domainSpaces',\n displayName: 'Domain Spaces',\n type: 'object',\n description: 'Matrix space structure sourced for the new domain',\n },\n {\n path: 'protocolTemplateImports',\n displayName: 'Protocol Template Imports',\n type: 'array',\n description: 'Import results for selected protocol templates',\n },\n ],\n\n events: [\n {\n name: 'created',\n displayName: 'Domain Created',\n description: 'Fires after the domain entity is successfully created on-chain.',\n payloadSchema: [\n { path: 'entityDid', displayName: 'Entity DID', type: 'string', description: 'DID of the newly created domain' },\n {\n path: 'governanceGroupCoreAddress',\n displayName: 'Governance Group Core Address',\n type: 'string',\n description: 'Core address of the created governance group, when present',\n },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'On-chain transaction hash' },\n {\n path: 'linkedResourceTransactionHash',\n displayName: 'Linked Resource Transaction Hash',\n type: 'string',\n description: 'On-chain transaction hash for adding the domain card linked resource',\n },\n {\n path: 'parentLinkedEntityTransactionHash',\n displayName: 'Parent Linked Entity Transaction Hash',\n type: 'string',\n description: 'On-chain transaction hash for linking the new POD to the selected parent entity',\n },\n ],\n pendingDisplayFields: ['entityDid', 'governanceGroupCoreAddress'],\n },\n ],\n\n // Mirrors run(): the card envelope (object or JSON string) must carry\n // credentialSubject.name before signing can start.\n getMissingInputs: (inputs) => {\n const card = parseMaybeJsonObject(inputs.domainCardData);\n if (!card) return ['domainCardData'];\n const subject = card.credentialSubject as Record<string, unknown> | undefined;\n return subject && String(subject.name || '').trim() ? [] : ['domainCardData.credentialSubject.name'];\n },\n\n run: async (inputs, ctx) => {\n const handlers = ctx.handlers || {};\n\n // Parse domainCardData input\n let domainCardData: any;\n if (typeof inputs.domainCardData === 'string') {\n try {\n domainCardData = JSON.parse(inputs.domainCardData);\n } catch {\n throw new Error('domainCardData must be valid JSON');\n }\n } else if (inputs.domainCardData && typeof inputs.domainCardData === 'object') {\n domainCardData = inputs.domainCardData;\n } else {\n throw new Error('domainCardData is required');\n }\n\n if (!domainCardData?.credentialSubject?.name) {\n throw new Error('domainCardData is missing or invalid (credentialSubject.name required)');\n }\n\n // Determine entity type\n const entityType =\n String(inputs.entityType || '').trim() || (domainCardData.credentialSubject?.type?.[0] ? resolveEntityTypeFromSchema(domainCardData.credentialSubject.type[0]) : 'dao/pod');\n\n const validFrom = domainCardData.validFrom || new Date().toISOString();\n const validUntil =\n domainCardData.validUntil ||\n (() => {\n const d = new Date();\n d.setFullYear(d.getFullYear() + 100);\n return d.toISOString();\n })();\n\n const govConfig = parseJsonInput(inputs.governanceConfig);\n const memberConfig = parseJsonInput(inputs.memberConfig);\n const flowTemplateConfig = parseJsonInput(inputs.flowTemplateConfig);\n const context = parseContextInput(inputs.context);\n const selectedParentEntityDid = getSelectedParentEntityDid(inputs);\n const selectedProtocolTemplates = getSelectedProtocolTemplates(flowTemplateConfig);\n const checkpointKey = getDomainSignCheckpointKey(inputs, ctx);\n let checkpoint: DomainSignCheckpoint = readDomainSignCheckpoint(ctx, checkpointKey) || {\n invocationId: checkpointKey,\n status: 'running',\n updatedAt: new Date().toISOString(),\n completedSteps: {},\n };\n\n if (checkpoint.status === 'completed' && checkpoint.output) {\n return buildCompletedDomainSignResult(checkpoint.output);\n }\n\n if (!ctx.handlers) {\n throw new Error('Handlers not available');\n }\n\n if (typeof handlers.requestPin !== 'function') throw new Error('requestPin handler not available');\n if (typeof handlers.signCredential !== 'function') throw new Error('signCredential handler not implemented');\n if (typeof handlers.publicFileUpload !== 'function') throw new Error('publicFileUpload handler not available');\n if (typeof handlers.createDomain !== 'function') throw new Error('createDomain handler not implemented');\n if (typeof handlers.createAddLinkedResourceMessage !== 'function') throw new Error('createAddLinkedResourceMessage handler not implemented');\n if (typeof handlers.executeTransaction !== 'function') throw new Error('executeTransaction handler not implemented');\n // Captured after the guards above so the narrowed (non-undefined) types\n // survive into the step closures below.\n const { requestPin, signCredential, publicFileUpload } = handlers;\n\n const saveCheckpoint = (updates: Partial<DomainSignCheckpoint>): DomainSignCheckpoint => {\n checkpoint = {\n ...checkpoint,\n ...updates,\n invocationId: checkpointKey,\n updatedAt: new Date().toISOString(),\n completedSteps: {\n ...(checkpoint.completedSteps || {}),\n ...(updates.completedSteps || {}),\n },\n };\n writeDomainSignCheckpoint(ctx, checkpointKey, checkpoint);\n return checkpoint;\n };\n\n saveCheckpoint({\n status: 'running',\n error: undefined,\n flowTemplateConfig,\n });\n\n try {\n // Step 1: Create governance group if config arrived from barrier payload.\n let governanceGroupLinkedEntities: any[] = checkpoint.governanceGroupLinkedEntities || [];\n let governanceGroupCoreAddress = checkpoint.governanceGroupCoreAddress || '';\n\n if (govConfig && handlers.createGovernanceGroup && !checkpoint.completedSteps?.createGovernanceGroup) {\n const groupType = govConfig.groupType as string;\n const governance = (govConfig.governance || {}) as Record<string, any>;\n const config = buildGroupConfig(groupType, governance, memberConfig);\n\n const groupResult = await handlers.createGovernanceGroup({\n groupType: groupType as 'categorical' | 'multisig' | 'nftStaking' | 'tokenStaking',\n name: govConfig.groupName || domainCardData.credentialSubject?.name || 'Governance Group',\n config,\n });\n governanceGroupCoreAddress = groupResult.coreAddress;\n\n governanceGroupLinkedEntities = [\n {\n id: `{id}#${governanceGroupCoreAddress}`,\n type: 'group',\n relationship: 'governs',\n service: '',\n },\n ];\n\n saveCheckpoint({\n governanceGroupCoreAddress,\n governanceGroupLinkedEntities,\n completedSteps: { createGovernanceGroup: true },\n });\n } else if (!govConfig) {\n saveCheckpoint({ completedSteps: { createGovernanceGroup: true } });\n }\n\n // Get issuer DID\n const issuerDid = handlers.getEntityDid?.() || handlers.getCurrentUser?.()?.address;\n if (!issuerDid) throw new Error('Unable to determine issuer DID');\n\n const signAndUploadDomainCard = async (entityDid: string) => {\n const credentialSubject = {\n ...domainCardData.credentialSubject,\n id: entityDid,\n };\n\n const unsignedCredential = buildVerifiableCredential({\n entityDid,\n issuerDid,\n credentialSubject,\n validFrom,\n validUntil,\n });\n\n // Re-prompt for the PIN on an invalid-PIN failure instead of unwinding\n // the run. createDomain has already happened by this point, so failing\n // here would leave the user with a half-created POD and a \"Try Again\"\n // button; an inline re-prompt lets them recover without that.\n let signedCredential: Awaited<ReturnType<NonNullable<typeof handlers.signCredential>>>['signedCredential'] | undefined;\n for (let attempt = 1; attempt <= MAX_PIN_ATTEMPTS; attempt++) {\n const pin = await requestPin({\n title: 'Sign Domain Card',\n description: attempt === 1 ? 'Enter your PIN to sign the Domain Card credential' : 'Incorrect PIN. Re-enter your PIN to sign the Domain Card credential.',\n submitText: 'Sign',\n });\n // A cancelled prompt (falsy PIN) ends the loop cleanly rather than\n // re-prompting forever.\n if (!pin) throw new Error('PIN entry cancelled');\n\n try {\n ({ signedCredential } = await signCredential({\n issuerDid,\n issuerType: 'user',\n credential: unsignedCredential,\n pin,\n }));\n break;\n } catch (signError) {\n // Only an invalid PIN is retryable, and only while attempts remain;\n // anything else (or the final attempt) propagates to fail the run.\n if (isInvalidPinError(signError) && attempt < MAX_PIN_ATTEMPTS) continue;\n throw signError;\n }\n }\n\n // The loop only exits via `break` (success) or `throw`, so this is an\n // invariant — it also narrows the type away from `undefined`.\n if (!signedCredential) throw new Error('Failed to sign credential');\n\n const credentialBlob = new Blob([JSON.stringify(signedCredential, null, 2)], {\n type: 'application/json',\n });\n const credentialFile = new File([credentialBlob], 'domainCard.json', {\n type: 'application/json',\n });\n\n const uploadResult = await publicFileUpload(credentialFile);\n\n return {\n ...buildDomainCardLinkedResource({\n entityDid,\n cid: uploadResult.cid,\n serviceEndpoint: uploadResult.url,\n description: `Domain Card for ${domainCardData.credentialSubject?.name || 'Domain'}`,\n }),\n id: '{id}#dmn',\n };\n };\n\n const endDate = domainCardData.endDate || validUntil;\n let newEntityDid = checkpoint.entityDid || '';\n let transactionHash = checkpoint.transactionHash || '';\n let linkedResourceTransactionHash = checkpoint.linkedResourceTransactionHash || '';\n const parentEntityDid = checkpoint.parentEntityDid || selectedParentEntityDid;\n let parentLinkedEntity = checkpoint.parentLinkedEntity;\n let parentLinkedEntityTransactionHash = checkpoint.parentLinkedEntityTransactionHash || '';\n let domainCardLinkedResource = checkpoint.domainCardLinkedResource;\n\n // Unified path: create the entity first so the signed domain card and\n // linked resource use the real entity DID, then add the domain card as a\n // second transaction.\n if (!checkpoint.completedSteps?.createDomain || !newEntityDid || !transactionHash) {\n const createResult = await handlers.createDomain({\n entityType,\n context: context.length > 0 ? context : undefined,\n linkedResource: [],\n linkedEntity: governanceGroupLinkedEntities.length > 0 ? governanceGroupLinkedEntities : undefined,\n startDate: validFrom,\n endDate,\n });\n newEntityDid = createResult.entityDid;\n transactionHash = createResult.transactionHash;\n saveCheckpoint({\n entityDid: newEntityDid,\n transactionHash,\n completedSteps: { createDomain: true },\n });\n }\n\n if (!checkpoint.completedSteps?.signAndUploadDomainCard || !domainCardLinkedResource) {\n domainCardLinkedResource = await signAndUploadDomainCard(newEntityDid);\n saveCheckpoint({\n domainCardLinkedResource,\n completedSteps: { signAndUploadDomainCard: true },\n });\n }\n\n if (!checkpoint.completedSteps?.addLinkedResource || !linkedResourceTransactionHash) {\n const addLinkedResourceMessage = await handlers.createAddLinkedResourceMessage({\n entityDid: newEntityDid,\n linkedResource: domainCardLinkedResource,\n });\n const addLinkedResourceResult = await handlers.executeTransaction({\n messages: [addLinkedResourceMessage],\n memo: '',\n });\n linkedResourceTransactionHash = String(addLinkedResourceResult?.transactionHash || '');\n if (!linkedResourceTransactionHash) {\n throw new Error('Linked resource transaction completed but no transaction hash received');\n }\n saveCheckpoint({\n linkedResourceTransactionHash,\n completedSteps: { addLinkedResource: true },\n });\n }\n\n if (parentEntityDid && (!checkpoint.completedSteps?.addParentLinkedEntity || !parentLinkedEntityTransactionHash)) {\n if (typeof handlers.createAddLinkedEntityMessage !== 'function') {\n throw new Error('createAddLinkedEntityMessage handler not implemented');\n }\n\n parentLinkedEntity = parentLinkedEntity || {\n id: newEntityDid,\n type: entityType,\n relationship: 'manages',\n service: '',\n };\n\n const addParentLinkedEntityMessage = await handlers.createAddLinkedEntityMessage({\n entityDid: parentEntityDid,\n linkedEntity: parentLinkedEntity,\n });\n const addParentLinkedEntityResult = await handlers.executeTransaction({\n messages: [addParentLinkedEntityMessage],\n memo: '',\n });\n parentLinkedEntityTransactionHash = String(addParentLinkedEntityResult?.transactionHash || '');\n if (!parentLinkedEntityTransactionHash) {\n throw new Error('Parent linked entity transaction completed but no transaction hash received');\n }\n saveCheckpoint({\n parentEntityDid,\n parentLinkedEntity,\n parentLinkedEntityTransactionHash,\n completedSteps: { addParentLinkedEntity: true },\n });\n } else if (!parentEntityDid) {\n saveCheckpoint({ completedSteps: { addParentLinkedEntity: true } });\n }\n\n let domainSpaces: Awaited<ReturnType<NonNullable<typeof handlers.sourceDomainSpaces>>> | undefined = checkpoint.domainSpaces;\n let protocolTemplateImports: Array<{ protocolDid: string; imported: any[] }> = checkpoint.protocolTemplateImports || [];\n\n if (handlers.sourceDomainSpaces && (!checkpoint.completedSteps?.sourceDomainSpaces || !domainSpaces)) {\n domainSpaces = await handlers.sourceDomainSpaces({ entityDid: newEntityDid });\n if (!domainSpaces?.success) {\n throw new Error('Domain spaces could not be sourced for the newly created domain');\n }\n saveCheckpoint({\n domainSpaces,\n completedSteps: { sourceDomainSpaces: true },\n });\n } else if (!handlers.sourceDomainSpaces) {\n saveCheckpoint({ completedSteps: { sourceDomainSpaces: true } });\n }\n\n if (selectedProtocolTemplates.length > 0 && !checkpoint.completedSteps?.importTemplates) {\n if (!handlers.sourceDomainSpaces) {\n throw new Error('sourceDomainSpaces handler is required to import selected protocol templates');\n }\n if (!handlers.importProtocolTemplatesToSpace) {\n throw new Error('importProtocolTemplatesToSpace handler is required to import selected protocol templates');\n }\n\n const targetFlowsSubspaceId = domainSpaces?.subspaces?.['domain flows']?.space_id;\n if (!targetFlowsSubspaceId) {\n throw new Error('Domain flows subspace was not returned by sourceDomainSpaces');\n }\n\n const groupedTemplates = groupTemplatesByProtocol(selectedProtocolTemplates);\n protocolTemplateImports = await Promise.all(\n Array.from(groupedTemplates.entries()).map(async ([protocolDid, templates]) => {\n const result = await handlers.importProtocolTemplatesToSpace!({\n protocolDid,\n entityDid: newEntityDid,\n targetFlowsSubspaceId,\n templates,\n });\n return { protocolDid, imported: result.imported };\n })\n );\n saveCheckpoint({\n protocolTemplateImports,\n completedSteps: { importTemplates: true },\n });\n } else if (selectedProtocolTemplates.length === 0) {\n saveCheckpoint({\n protocolTemplateImports,\n completedSteps: { importTemplates: true },\n });\n }\n\n const output = {\n entityDid: newEntityDid,\n governanceGroupCoreAddress,\n linkedEntities: governanceGroupLinkedEntities,\n linkedResources: [domainCardLinkedResource],\n parentEntityDid,\n parentLinkedEntity,\n flowTemplateConfig,\n domainSpaces,\n protocolTemplateImports,\n transactionHash,\n linkedResourceTransactionHash,\n parentLinkedEntityTransactionHash,\n };\n\n saveCheckpoint({\n status: 'completed',\n output,\n });\n\n return buildCompletedDomainSignResult(output);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Domain sign failed';\n saveCheckpoint({\n status: 'failed',\n error: message,\n });\n throw error;\n }\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\nimport { parseMaybeJsonObject } from '../inputRequirements';\n\n/**\n * @description Oracle-enriched preview and human approval gate for a Domain Card.\n *\n * This is the middle stage of the three-step pipeline:\n * card-build → card-preview → sign\n *\n * The action itself is a thin validator: it trusts that the UI has already\n * collected oracle-enriched preview data and a human approval, and echoes\n * the approved `domainCardData` forward so `qi/domain.sign` can consume it.\n *\n * Oracle integration contract — the oracle agent writes its enrichment into\n * the flow node's `runtime.output` under:\n * - `runtime.output.domainPreviewData` (DomainCardResponse UI preview shape)\n * - `runtime.output.domainCardData` (W3C credentialSubject envelope)\n * - `runtime.output.status` ('pending' | 'loading' | 'ready' | 'approved' | 'error')\n * - `runtime.output.loadingMessage` (optional)\n * - `runtime.output.errorMessage` (optional)\n *\n * The FlowDetail component reads these from `runtime.output`, renders the\n * preview, and on user approval calls `updateRuntime` with status='approved'\n * and re-emits `domainCardData` so downstream steps resolve it via the\n * reference resolver.\n */\nregisterAction({\n type: 'qi/domain.card-preview',\n can: 'domain/card-preview',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: ['domainCardData'],\n properties: {\n domainCardData: {\n type: 'object',\n description: 'Domain card envelope (object or JSON string) with credentialSubject.name; echoed forward for signing.',\n },\n domainPreviewData: {\n type: 'object',\n description: 'Oracle-enriched human-facing preview of the domain card (object or JSON string).',\n },\n },\n },\n\n outputSchema: [\n {\n path: 'domainCardData',\n displayName: 'Domain Card Data',\n type: 'object',\n description: 'Approved domain card envelope { credentialSubject, validFrom, validUntil } ready to sign',\n },\n { path: 'domainPreviewData', displayName: 'Preview Data', type: 'object', description: 'Oracle-enriched human-facing preview of the domain card' },\n { path: 'status', displayName: 'Status', type: 'string', description: 'pending | loading | ready | approved | error' },\n { path: 'approvedAt', displayName: 'Approved At', type: 'number', description: 'Timestamp when the user approved the preview' },\n ],\n\n events: [\n {\n name: 'approved',\n displayName: 'Preview Approved',\n description: 'Fires when the user approves the oracle-enriched domain card preview.',\n payloadSchema: [\n { path: 'domainCardData', displayName: 'Domain Card Data', type: 'object', description: 'Approved domain card envelope ready for signing' },\n { path: 'approvedAt', displayName: 'Approved At', type: 'number', description: 'Timestamp of approval' },\n ],\n pendingDisplayFields: ['approvedAt'],\n },\n ],\n\n // Mirrors run(): the card envelope (object or JSON string) must carry\n // credentialSubject.name before a preview can render.\n getMissingInputs: (inputs) => {\n const card = parseMaybeJsonObject(inputs.domainCardData);\n if (!card) return ['domainCardData'];\n const subject = card.credentialSubject as Record<string, unknown> | undefined;\n return subject && String(subject.name || '').trim() ? [] : ['domainCardData.credentialSubject.name'];\n },\n\n run: async (inputs) => {\n let domainCardData: any = inputs.domainCardData;\n if (typeof domainCardData === 'string') {\n try {\n domainCardData = JSON.parse(domainCardData);\n } catch {\n throw new Error('domainCardData must be valid JSON');\n }\n }\n if (!domainCardData || typeof domainCardData !== 'object') {\n throw new Error('domainCardData is required to preview a domain card');\n }\n if (!domainCardData.credentialSubject?.name) {\n throw new Error('domainCardData.credentialSubject.name is required');\n }\n\n let domainPreviewData: any = inputs.domainPreviewData;\n if (typeof domainPreviewData === 'string') {\n try {\n domainPreviewData = JSON.parse(domainPreviewData);\n } catch {\n domainPreviewData = undefined;\n }\n }\n\n const now = Date.now();\n\n return {\n output: {\n domainCardData,\n domainPreviewData,\n status: 'approved',\n approvedAt: now,\n },\n events: [{ name: 'approved', payload: { domainCardData, approvedAt: now } }],\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'oracle',\n can: 'oracle/query',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: ['prompt'],\n properties: {\n prompt: { type: 'string', description: 'The prompt text sent to the companion.' },\n },\n },\n\n outputSchema: [{ path: 'prompt', displayName: 'Prompt', type: 'string', description: 'The prompt sent to the companion' }],\n\n run: async (inputs, ctx) => {\n const prompt = String(inputs.prompt || '').trim();\n if (!prompt) throw new Error('prompt is required');\n\n if (!ctx.handlers?.askCompanion) {\n throw new Error('askCompanion handler is not available');\n }\n\n await ctx.handlers.askCompanion(prompt);\n\n return {\n output: { prompt },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/credential.store',\n can: 'credential/store',\n sideEffect: true,\n proof: { fields: ['storedAt'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/execute',\n\n inputSchema: {\n type: 'object',\n required: ['credentialKey', 'credential'],\n properties: {\n credentialKey: { type: 'string', description: 'Key under which to store the credential (e.g. kycamllevel1).' },\n credential: { type: 'object', description: 'The credential to store as a JSON object (also accepts a JSON string).' },\n roomId: { type: 'string', description: 'Matrix room ID to store the credential in; defaults to empty.' },\n },\n },\n\n outputSchema: [\n { path: 'credentialKey', displayName: 'Credential Key', type: 'string', description: 'Key under which credential was stored (e.g. kycamllevel1)' },\n { path: 'cid', displayName: 'Content ID', type: 'string', description: 'IPFS-compatible CID of the credential (used for deduplication)' },\n { path: 'storedAt', displayName: 'Stored At', type: 'string', description: 'ISO timestamp of when the credential was stored' },\n { path: 'duplicate', displayName: 'Duplicate', type: 'boolean', description: 'Whether this credential was already stored (matched by CID)' },\n ],\n\n run: async (inputs, ctx) => {\n const { credential, credentialKey, roomId } = inputs;\n\n if (!credentialKey) throw new Error('credentialKey is required');\n if (!credential) throw new Error('credential is required');\n\n // Normalize credential from any AI-provided format to a plain object.\n // AI may provide: object, JSON string, or double/triple-stringified JSON.\n let parsedCredential: any = credential;\n\n if (typeof parsedCredential === 'string') {\n // Unwrap up to 3 layers of stringification\n for (let i = 0; i < 3 && typeof parsedCredential === 'string'; i++) {\n try {\n parsedCredential = JSON.parse(parsedCredential);\n } catch {\n throw new Error('credential must be a valid JSON object or JSON string');\n }\n }\n }\n\n if (typeof parsedCredential !== 'object' || parsedCredential === null || Array.isArray(parsedCredential)) {\n throw new Error('credential must be a JSON object');\n }\n\n if (!ctx.services.matrix?.storeCredential) {\n throw new Error('Matrix credential storage service not configured');\n }\n\n // Compute IPFS-compatible CID (lazy-loaded)\n const { computeJsonCID } = await import('../../../lib/cid');\n const cid = await computeJsonCID(parsedCredential);\n\n const result = await ctx.services.matrix.storeCredential({\n roomId: roomId || '',\n credentialKey: String(credentialKey),\n credential: parsedCredential,\n cid,\n });\n\n return {\n output: {\n credentialKey: String(credentialKey),\n cid,\n storedAt: result.storedAt,\n duplicate: result.duplicate,\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\nimport { sendDirectMessage } from '../../matrixDm';\n\nregisterAction({\n type: 'qi/matrix.dm',\n can: 'matrix/dm',\n sideEffect: true,\n proof: { fields: ['roomId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n\n inputSchema: {\n type: 'object',\n required: ['targetDid', 'message'],\n properties: {\n targetDid: { type: 'string', description: 'The recipient DID to direct-message.' },\n message: { type: 'string', description: 'The message text to send.' },\n },\n },\n\n outputSchema: [\n { path: 'roomId', displayName: 'Room ID', type: 'string', description: 'The Matrix room ID used for the DM' },\n { path: 'sentAt', displayName: 'Sent At', type: 'string', description: 'Timestamp when the message was sent' },\n ],\n\n run: async (inputs, ctx) => {\n const matrixClient = ctx.editor?.getMatrixClient?.();\n if (!matrixClient) {\n throw new Error('Matrix client not available');\n }\n\n const targetDid = String(inputs.targetDid || '').trim();\n const message = String(inputs.message || '').trim();\n\n if (!targetDid) throw new Error('Recipient DID is required');\n if (!message) throw new Error('Message is required');\n\n const result = await sendDirectMessage(matrixClient, targetDid, message);\n\n return {\n output: {\n roomId: result.roomId,\n sentAt: new Date().toISOString(),\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/wallet.generate',\n can: 'wallet/generate',\n sideEffect: false,\n proof: { fields: ['address'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n properties: {},\n required: [],\n },\n outputSchema: [\n { path: 'address', displayName: 'Wallet Address', type: 'string', description: 'The generated IXO wallet address' },\n { path: 'did', displayName: 'DID', type: 'string', description: 'The DID derived from the wallet address' },\n { path: 'pubKey', displayName: 'Public Key', type: 'string', description: 'The secp256k1 public key (hex)' },\n { path: 'mnemonic', displayName: 'Mnemonic', type: 'string', description: 'The BIP39 mnemonic seed phrase' },\n ],\n run: async (_inputs, ctx) => {\n if (!ctx.services.oracle?.generateWallet) {\n throw new Error('oracle.generateWallet handler not available');\n }\n const result = await ctx.services.oracle.generateWallet();\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/wallet.fund',\n can: 'wallet/fund',\n sideEffect: true,\n proof: { fields: ['transactionHash'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n\n inputSchema: {\n type: 'object',\n required: ['address'],\n properties: {\n address: { type: 'string', description: 'The IXO wallet address to fund.' },\n amount: { type: 'number', description: 'Funding amount in base units (defaults to 250000).' },\n },\n },\n\n outputSchema: [{ path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The funding transaction hash' }],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.fundWallet) {\n throw new Error('oracle.fundWallet handler not available');\n }\n if (!inputs.address) throw new Error('address is required');\n const result = await ctx.services.oracle.fundWallet({\n address: inputs.address,\n amount: inputs.amount || 250000,\n });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/wallet.generateAndFund',\n can: 'wallet/generateAndFund',\n sideEffect: true,\n proof: { fields: ['transactionHash'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: [],\n properties: {\n amount: { type: 'number', description: 'Funding amount in base units for the generated wallet (defaults to 250000).' },\n },\n },\n outputSchema: [\n { path: 'address', displayName: 'Wallet Address', type: 'string', description: 'The generated IXO wallet address' },\n { path: 'did', displayName: 'DID', type: 'string', description: 'The DID derived from the wallet address' },\n { path: 'pubKey', displayName: 'Public Key', type: 'string', description: 'The secp256k1 public key (hex)' },\n { path: 'mnemonic', displayName: 'Mnemonic', type: 'string', description: 'The BIP39 mnemonic seed phrase' },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The funding transaction hash' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.generateWallet) {\n throw new Error('oracle.generateWallet handler not available');\n }\n if (!ctx.services.oracle?.fundWallet) {\n throw new Error('oracle.fundWallet handler not available');\n }\n\n // Step 1: Generate wallet\n const walletResult = await ctx.services.oracle.generateWallet();\n if (!walletResult?.address) {\n throw new Error('generateWallet did not return an address');\n }\n\n // Step 2: Fund wallet\n const fundResult = await ctx.services.oracle.fundWallet({\n address: walletResult.address,\n amount: inputs.amount || 250000,\n });\n if (!fundResult?.transactionHash) {\n throw new Error('fundWallet did not return a transactionHash');\n }\n\n return {\n output: {\n address: walletResult.address,\n did: walletResult.did,\n pubKey: walletResult.pubKey,\n mnemonic: walletResult.mnemonic,\n transactionHash: fundResult.transactionHash,\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/iid.create',\n can: 'iid/create',\n sideEffect: true,\n proof: { fields: ['transactionHash', 'alreadyExisted'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['mnemonic', 'did', 'address', 'pubKey'],\n properties: {\n mnemonic: { type: 'string', description: 'Wallet mnemonic used to create the IID document.' },\n did: { type: 'string', description: 'The DID for the IID document.' },\n address: { type: 'string', description: 'The blockchain address.' },\n pubKey: { type: 'string', description: 'The public key for the IID document.' },\n },\n },\n outputSchema: [\n { path: 'did', displayName: 'DID', type: 'string', description: 'The IID document DID' },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The IID creation transaction hash' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.createIidDocument) {\n throw new Error('oracle.createIidDocument handler not available');\n }\n if (!inputs.mnemonic) throw new Error('mnemonic is required');\n if (!inputs.did) throw new Error('did is required');\n if (!inputs.address) throw new Error('address is required');\n if (!inputs.pubKey) throw new Error('pubKey is required');\n // network and matrixHomeServerUrl are resolved by the consumer-side handler\n // from the platform's DefaultChainNetwork — this app is single-network.\n const result = await ctx.services.oracle.createIidDocument({\n mnemonic: inputs.mnemonic,\n did: inputs.did,\n address: inputs.address,\n pubKey: inputs.pubKey,\n });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/matrix.register',\n can: 'matrix/register',\n sideEffect: true,\n proof: { fields: ['matrixUserId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['mnemonic', 'address', 'did', 'pin', 'oracleName'],\n properties: {\n mnemonic: { type: 'string', description: 'Wallet mnemonic used to register the Matrix account.' },\n address: { type: 'string', description: 'The blockchain address.' },\n did: { type: 'string', description: 'The DID associated with the Matrix account.' },\n pin: { type: 'string', description: 'PIN used to register the Matrix account.' },\n oracleName: { type: 'string', description: 'Oracle name for the Matrix account.' },\n avatarUrl: { type: 'string', description: 'Avatar URL for the Matrix account.' },\n },\n },\n outputSchema: [\n { path: 'matrixUserId', displayName: 'Matrix User ID', type: 'string', description: 'The Matrix user ID' },\n { path: 'matrixAccessToken', displayName: 'Matrix Access Token', type: 'string', description: 'The Matrix access token' },\n { path: 'matrixRoomId', displayName: 'Matrix Room ID', type: 'string', description: 'The Matrix room ID' },\n { path: 'matrixDeviceId', displayName: 'Matrix Device ID', type: 'string', description: 'The Matrix device ID' },\n { path: 'matrixMnemonic', displayName: 'Matrix Mnemonic', type: 'string', description: 'The Matrix account mnemonic' },\n { path: 'matrixPassword', displayName: 'Matrix Password', type: 'string', description: 'The Matrix account password' },\n { path: 'matrixRecoveryPhrase', displayName: 'Recovery Phrase', type: 'string', description: 'The Matrix recovery phrase' },\n { path: 'matrixHomeServerUrl', displayName: 'Matrix Homeserver', type: 'string', description: 'The Matrix homeserver URL' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.registerMatrixAccount) {\n throw new Error('oracle.registerMatrixAccount handler not available');\n }\n if (!inputs.mnemonic) throw new Error('mnemonic is required');\n if (!inputs.address) throw new Error('address is required');\n if (!inputs.did) throw new Error('did is required');\n if (!inputs.pin) throw new Error('pin is required');\n if (!inputs.oracleName) throw new Error('oracleName is required');\n const result = await ctx.services.oracle.registerMatrixAccount({\n mnemonic: inputs.mnemonic,\n address: inputs.address,\n did: inputs.did,\n pin: inputs.pin,\n oracleName: inputs.oracleName,\n avatarUrl: inputs.avatarUrl,\n });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/identity.create',\n can: 'identity/create',\n sideEffect: true,\n // Dual-phase proof: on-chain IID (transactionHash or alreadyExisted) AND matrix registration.\n proof: { validate: (output) => !!(output.transactionHash || output.alreadyExisted) && !!output.matrixUserId },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['mnemonic', 'did', 'address', 'pubKey', 'pin', 'oracleName'],\n properties: {\n mnemonic: { type: 'string', description: 'Wallet mnemonic used to create the IID document and Matrix account.' },\n did: { type: 'string', description: 'The DID for the IID document.' },\n address: { type: 'string', description: 'The blockchain address.' },\n pubKey: { type: 'string', description: 'The public key for the IID document.' },\n pin: { type: 'string', description: 'PIN used to register the Matrix account.' },\n oracleName: { type: 'string', description: 'Oracle name for the Matrix account.' },\n avatarUrl: { type: 'string', description: 'Avatar URL for the Matrix account (mapped from form logoUrl).' },\n formAnswers: { type: 'string', description: 'JSON string of runtime form answers merged into inputs.' },\n },\n },\n outputSchema: [\n { path: 'did', displayName: 'DID', type: 'string', description: 'The IID document DID' },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The IID creation transaction hash' },\n { path: 'alreadyExisted', displayName: 'Already Existed', type: 'boolean', description: 'Whether the IID document already existed' },\n { path: 'matrixUserId', displayName: 'Matrix User ID', type: 'string', description: 'The Matrix user ID' },\n { path: 'matrixAccessToken', displayName: 'Matrix Access Token', type: 'string', description: 'The Matrix access token' },\n { path: 'matrixRoomId', displayName: 'Matrix Room ID', type: 'string', description: 'The Matrix room ID' },\n { path: 'matrixDeviceId', displayName: 'Matrix Device ID', type: 'string', description: 'The Matrix device ID' },\n { path: 'matrixMnemonic', displayName: 'Matrix Mnemonic', type: 'string', description: 'The Matrix account mnemonic' },\n { path: 'matrixPassword', displayName: 'Matrix Password', type: 'string', description: 'The Matrix account password' },\n { path: 'matrixRecoveryPhrase', displayName: 'Recovery Phrase', type: 'string', description: 'The Matrix recovery phrase' },\n { path: 'matrixHomeServerUrl', displayName: 'Matrix Homeserver', type: 'string', description: 'The Matrix homeserver URL' },\n ],\n run: async (rawInputs, ctx) => {\n // Parse form answers (JSON string from runtime.output.form.answers) and\n // merge them into inputs so existing inputs.<field> references resolve.\n // Explicit template inputs take precedence over form fields.\n const form = (() => {\n const raw = (rawInputs as Record<string, unknown>).formAnswers;\n if (typeof raw !== 'string' || !raw) return {};\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n })() as Record<string, unknown>;\n const inputs = {\n // Rename: form.logoUrl → avatarUrl for the registerMatrixAccount handler\n avatarUrl: form.logoUrl,\n ...form,\n ...rawInputs,\n } as typeof rawInputs & Record<string, unknown>;\n\n // --- Validate handlers ---\n if (!ctx.services.oracle?.createIidDocument) {\n throw new Error('oracle.createIidDocument handler not available');\n }\n if (!ctx.services.oracle?.registerMatrixAccount) {\n throw new Error('oracle.registerMatrixAccount handler not available');\n }\n\n // --- Validate IID inputs ---\n if (!inputs.mnemonic) throw new Error('mnemonic is required');\n if (!inputs.did) throw new Error('did is required');\n if (!inputs.address) throw new Error('address is required');\n if (!inputs.pubKey) throw new Error('pubKey is required');\n\n // --- Validate Matrix inputs ---\n if (!inputs.pin) throw new Error('pin is required');\n if (!inputs.oracleName) throw new Error('oracleName is required');\n\n // --- Phase 1: Create IID document ---\n const iidResult = (await ctx.services.oracle.createIidDocument({\n mnemonic: inputs.mnemonic,\n did: inputs.did,\n address: inputs.address,\n pubKey: inputs.pubKey,\n })) as { did: string; transactionHash: string; alreadyExisted?: boolean };\n\n // Validate IID result\n if (!iidResult?.transactionHash && !iidResult?.alreadyExisted) {\n throw new Error('IID creation returned success without a transaction hash or alreadyExisted flag');\n }\n\n // --- Phase 2: Register Matrix account ---\n const matrixResult = await ctx.services.oracle.registerMatrixAccount({\n mnemonic: inputs.mnemonic,\n address: inputs.address,\n did: inputs.did,\n pin: inputs.pin,\n oracleName: inputs.oracleName,\n avatarUrl: inputs.avatarUrl,\n });\n\n // Validate Matrix result\n if (!matrixResult?.matrixUserId) {\n throw new Error('Matrix registration returned success without a matrixUserId');\n }\n\n // --- Return combined output ---\n return {\n output: {\n did: iidResult.did || inputs.did,\n transactionHash: iidResult.transactionHash,\n alreadyExisted: iidResult.alreadyExisted || false,\n matrixUserId: matrixResult.matrixUserId,\n matrixAccessToken: matrixResult.matrixAccessToken,\n matrixRoomId: matrixResult.matrixRoomId,\n matrixDeviceId: matrixResult.matrixDeviceId,\n matrixMnemonic: matrixResult.matrixMnemonic,\n matrixPassword: matrixResult.matrixPassword,\n matrixRecoveryPhrase: matrixResult.matrixRecoveryPhrase,\n matrixHomeServerUrl: matrixResult.matrixHomeServerUrl,\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/entity.createOracle',\n can: 'entity/createOracle',\n sideEffect: true,\n proof: { fields: ['entityDid'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['mnemonic', 'address', 'did', 'pubKey', 'pin', 'matrixAccessToken', 'matrixRoomId', 'oracleName', 'apiUrl', 'price'],\n properties: {\n mnemonic: { type: 'string', description: 'BIP39 mnemonic for the oracle wallet.' },\n address: { type: 'string', description: 'The oracle wallet address.' },\n did: { type: 'string', description: 'The oracle DID.' },\n pubKey: { type: 'string', description: 'The oracle wallet public key.' },\n pin: { type: 'string', description: 'PIN used to sign the oracle entity creation.' },\n matrixAccessToken: { type: 'string', description: 'Matrix access token for the oracle.' },\n matrixRoomId: { type: 'string', description: 'Matrix room ID for the oracle.' },\n oracleName: { type: 'string', description: 'Display name of the oracle.' },\n apiUrl: { type: 'string', description: 'The oracle API URL.' },\n price: { type: 'string', description: 'The oracle subscription price.' },\n orgName: { type: 'string', description: 'Optional organization name.' },\n description: { type: 'string', description: 'Optional oracle description.' },\n location: { type: 'string', description: 'Optional oracle location.' },\n logoUrl: { type: 'string', description: 'Optional oracle logo URL.' },\n coverImageUrl: { type: 'string', description: 'Optional oracle cover image URL.' },\n llmModel: { type: 'string', description: 'Optional LLM model identifier.' },\n opening: { type: 'string', description: 'Optional oracle opening message.' },\n communicationStyle: { type: 'string', description: 'Optional oracle communication style.' },\n capabilities: { type: 'array', description: 'Optional oracle capabilities.' },\n mcpConfig: { type: 'object', description: 'Optional MCP configuration.' },\n parentProtocol: { type: 'string', description: 'Optional parent protocol DID.' },\n formAnswers: { type: 'string', description: 'Optional JSON string of form answers merged into inputs.' },\n },\n },\n outputSchema: [\n { path: 'entityDid', displayName: 'Entity DID', type: 'string', description: 'The oracle entity DID' },\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The entity creation transaction hash' },\n {\n path: 'encryptionPublicKeyMultibase',\n displayName: 'Encryption Public Key (multibase)',\n type: 'string',\n description: 'Multibase-encoded P-256 public key registered as a keyAgreement vm on the entity DID',\n },\n {\n path: 'encryptionVerificationMethodId',\n displayName: 'Encryption Verification Method ID',\n type: 'string',\n description: 'DID verification method id of the P-256 keyAgreement key',\n },\n ],\n run: async (rawInputs, ctx) => {\n // Parse form answers (JSON string from runtime.output.form.answers) and\n // merge into inputs so existing inputs.<field> references resolve.\n const form = (() => {\n const raw = (rawInputs as Record<string, unknown>).formAnswers;\n if (typeof raw !== 'string' || !raw) return {};\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n })() as Record<string, unknown>;\n const inputs = { ...form, ...rawInputs } as typeof rawInputs & Record<string, unknown>;\n\n if (!ctx.services.oracle?.createOracleEntity) {\n throw new Error('oracle.createOracleEntity handler not available');\n }\n if (!inputs.mnemonic) throw new Error('mnemonic is required');\n if (!inputs.address) throw new Error('address is required');\n if (!inputs.did) throw new Error('did is required');\n if (!inputs.pubKey) throw new Error('pubKey is required');\n if (!inputs.pin) throw new Error('pin is required');\n if (!inputs.matrixAccessToken) throw new Error('matrixAccessToken is required');\n if (!inputs.matrixRoomId) throw new Error('matrixRoomId is required');\n if (!inputs.oracleName) throw new Error('oracleName is required');\n if (!inputs.apiUrl) throw new Error('apiUrl is required');\n if (!inputs.price) throw new Error('price is required');\n // network and matrixHomeServerUrl come from the platform's DefaultChainNetwork\n // in the consumer-side handler — this app is single-network.\n const result = await ctx.services.oracle.createOracleEntity({\n mnemonic: inputs.mnemonic,\n address: inputs.address,\n did: inputs.did,\n pubKey: inputs.pubKey,\n pin: inputs.pin,\n matrixAccessToken: inputs.matrixAccessToken,\n matrixRoomId: inputs.matrixRoomId,\n oracleName: inputs.oracleName,\n orgName: inputs.orgName,\n description: inputs.description,\n location: inputs.location,\n logoUrl: inputs.logoUrl,\n coverImageUrl: inputs.coverImageUrl,\n apiUrl: inputs.apiUrl,\n price: inputs.price,\n llmModel: inputs.llmModel,\n opening: inputs.opening,\n communicationStyle: inputs.communicationStyle,\n capabilities: inputs.capabilities,\n mcpConfig: inputs.mcpConfig,\n parentProtocol: inputs.parentProtocol,\n });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/sandbox.provision',\n can: 'sandbox/provision',\n sideEffect: true,\n proof: { fields: ['status', 'sandboxUrl'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['entityDid', 'matrixRoomId'],\n properties: {\n entityDid: { type: 'string', description: 'Oracle entity DID to provision a sandbox for.' },\n matrixRoomId: { type: 'string', description: 'Matrix room id associated with the oracle.' },\n },\n },\n outputSchema: [\n { path: 'sandboxUrl', displayName: 'Sandbox URL', type: 'string', description: 'The provisioned sandbox URL' },\n { path: 'status', displayName: 'Status', type: 'string', description: 'Provisioning status' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.provisionSandbox) {\n throw new Error('oracle.provisionSandbox handler not available');\n }\n if (!inputs.entityDid) throw new Error('entityDid is required');\n if (!inputs.matrixRoomId) throw new Error('matrixRoomId is required');\n\n const result = await ctx.services.oracle.provisionSandbox({\n entityDid: inputs.entityDid,\n matrixRoomId: inputs.matrixRoomId,\n });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/oracle.contract',\n can: 'oracle/contract',\n sideEffect: true,\n proof: { fields: ['userOracleRoomId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['oracleEntityDid'],\n properties: {\n oracleEntityDid: { type: 'string', description: 'Oracle entity DID from the entity.createOracle output.' },\n },\n },\n outputSchema: [\n { path: 'userOracleRoomId', displayName: 'User↔Oracle Room ID', type: 'string', description: 'Matrix room id of the user↔oracle DM room' },\n { path: 'userOracleRoomAlias', displayName: 'User↔Oracle Room Alias', type: 'string', description: 'Matrix alias of the user↔oracle DM room' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.contract) {\n throw new Error('oracle.contract handler not available');\n }\n if (!inputs.oracleEntityDid) throw new Error('oracleEntityDid is required (from entity.createOracle output)');\n\n const result = await ctx.services.oracle.contract({\n oracleEntityDid: inputs.oracleEntityDid,\n });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nconst SENSITIVE_PLAINTEXT_KEYS = ['SECP_MNEMONIC', 'MATRIX_ORACLE_ADMIN_PASSWORD', 'MATRIX_RECOVERY_PHRASE', 'MATRIX_VALUE_PIN'] as const;\n\nregisterAction({\n type: 'qi/oracle.storeSecrets',\n can: 'oracle/storeSecrets',\n sideEffect: true,\n proof: { fields: ['storedSecrets'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: [\n 'matrixRoomId',\n 'publicKeyMultibase',\n 'verificationMethodId',\n 'matrixHomeServerUrl',\n 'matrixUsername',\n 'matrixPassword',\n 'mnemonic',\n 'matrixRecoveryPhrase',\n 'pin',\n 'openRouterApiKeyJwe',\n ],\n properties: {\n matrixRoomId: { type: 'string', description: 'Matrix room id from the oracle.contract output.' },\n publicKeyMultibase: { type: 'string', description: 'Oracle public key (multibase) from the entity.createOracle output.' },\n verificationMethodId: { type: 'string', description: 'Verification method id from the entity.createOracle output.' },\n matrixHomeServerUrl: { type: 'string', description: 'Matrix homeserver URL from the matrix.register output.' },\n matrixUsername: { type: 'string', description: 'Matrix username from the matrix.register output.' },\n matrixPassword: { type: 'string', description: 'Matrix password from the matrix.register output.' },\n mnemonic: { type: 'string', description: 'Wallet mnemonic from the wallet.generate output.' },\n matrixRecoveryPhrase: { type: 'string', description: 'Matrix recovery phrase from the matrix.register output.' },\n pin: { type: 'string', description: 'PIN from the form output.' },\n openRouterApiKeyJwe: { type: 'string', description: 'JWE-encrypted OpenRouter API key from the form.' },\n mcpAuthSecrets: { type: 'object', description: 'Optional pre-encrypted MCP auth secrets (object or JSON string).' },\n },\n },\n outputSchema: [\n { path: 'storedSecrets', displayName: 'Stored Secrets', type: 'array', description: 'List of secret names stored' },\n { path: 'roomId', displayName: 'Room ID', type: 'string', description: 'Matrix room where secrets are stored' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.storeSecrets) {\n throw new Error('oracle.storeSecrets handler not available');\n }\n // Routing\n if (!inputs.matrixRoomId) throw new Error('matrixRoomId is required (from oracle.contract output)');\n if (!inputs.publicKeyMultibase) throw new Error('publicKeyMultibase is required (from entity.createOracle output)');\n if (!inputs.verificationMethodId) throw new Error('verificationMethodId is required (from entity.createOracle output)');\n // Fresh mxLogin\n if (!inputs.matrixHomeServerUrl) throw new Error('matrixHomeServerUrl is required (from matrix.register output)');\n if (!inputs.matrixUsername) throw new Error('matrixUsername is required (from matrix.register output matrixUserId)');\n if (!inputs.matrixPassword) throw new Error('matrixPassword is required (from matrix.register output)');\n // Sensitive plaintext values\n if (!inputs.mnemonic) throw new Error('mnemonic is required (from wallet.generate output)');\n if (!inputs.matrixRecoveryPhrase) throw new Error('matrixRecoveryPhrase is required (from matrix.register output)');\n if (!inputs.pin) throw new Error('pin is required (from form output)');\n // OpenRouter must already be JWE-encrypted by the FlowDetail before submit\n if (!inputs.openRouterApiKeyJwe) {\n throw new Error('OPEN_ROUTER_API_KEY is required — enter it in the form before submitting');\n }\n\n const secrets: Record<string, string> = {\n SECP_MNEMONIC: inputs.mnemonic,\n MATRIX_ORACLE_ADMIN_PASSWORD: inputs.matrixPassword,\n MATRIX_RECOVERY_PHRASE: inputs.matrixRecoveryPhrase,\n MATRIX_VALUE_PIN: inputs.pin,\n };\n const preEncryptedSecrets: Record<string, string> = {\n OPEN_ROUTER_API_KEY: inputs.openRouterApiKeyJwe,\n };\n\n // Add MCP auth secrets if provided (already JWE-encrypted by FlowDetail)\n if (inputs.mcpAuthSecrets) {\n try {\n const mcpSecrets = typeof inputs.mcpAuthSecrets === 'string' ? JSON.parse(inputs.mcpAuthSecrets) : inputs.mcpAuthSecrets;\n if (mcpSecrets && typeof mcpSecrets === 'object') {\n Object.assign(preEncryptedSecrets, mcpSecrets);\n }\n } catch {\n console.warn('[oracle.storeSecrets] Failed to parse mcpAuthSecrets');\n }\n }\n\n // Sanity: do not let any sensitive plaintext key be empty after assembly\n for (const k of SENSITIVE_PLAINTEXT_KEYS) {\n if (!secrets[k]) throw new Error(`${k} is empty after assembly — refusing to call storeSecrets`);\n }\n\n const result = await ctx.services.oracle.storeSecrets({\n matrixRoomId: inputs.matrixRoomId,\n publicKeyMultibase: inputs.publicKeyMultibase,\n verificationMethodId: inputs.verificationMethodId,\n matrixHomeServerUrl: inputs.matrixHomeServerUrl,\n matrixUsername: inputs.matrixUsername,\n matrixPassword: inputs.matrixPassword,\n secrets,\n preEncryptedSecrets,\n });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/oracle.storeConfig',\n can: 'oracle/storeConfig',\n sideEffect: true,\n proof: { fields: ['configStored'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['matrixRoomId', 'oracleName', 'entityDid'],\n properties: {\n matrixRoomId: { type: 'string', description: 'Matrix room id from the oracle.contract output.' },\n oracleName: { type: 'string', description: 'Oracle name.' },\n entityDid: { type: 'string', description: 'Oracle entity DID.' },\n orgName: { type: 'string', description: 'Organisation name.' },\n description: { type: 'string', description: 'Oracle description.' },\n location: { type: 'string', description: 'Oracle location.' },\n price: { type: 'number', description: 'Oracle price; defaults to 0.' },\n apiUrl: { type: 'string', description: 'Oracle API URL.' },\n logoUrl: { type: 'string', description: 'Oracle logo URL.' },\n llmModel: { type: 'string', description: 'LLM model identifier.' },\n opening: { type: 'string', description: 'Oracle opening message.' },\n communicationStyle: { type: 'string', description: 'Oracle communication style.' },\n capabilities: { type: 'string', description: 'Oracle capabilities description.' },\n skills: { type: 'array', description: 'List of oracle skills.' },\n mcpServers: { type: 'array', description: 'List of configured MCP servers.' },\n matrixUserId: { type: 'string', description: 'Oracle Matrix user id.' },\n matrixAccountRoomId: { type: 'string', description: 'Oracle Matrix account room id.' },\n oracleAddress: { type: 'string', description: 'Oracle wallet address.' },\n oracleDid: { type: 'string', description: 'Oracle DID.' },\n },\n },\n outputSchema: [\n { path: 'configStored', displayName: 'Config Stored', type: 'boolean', description: 'Whether the oracle config was stored successfully' },\n { path: 'roomId', displayName: 'Room ID', type: 'string', description: 'The Matrix room ID where config was stored' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.storeConfig) {\n throw new Error('oracle.storeConfig handler not available');\n }\n if (!inputs.matrixRoomId) throw new Error('matrixRoomId is required (from oracle.contract output)');\n if (!inputs.oracleName) throw new Error('oracleName is required');\n if (!inputs.entityDid) throw new Error('entityDid is required');\n\n const result = await ctx.services.oracle.storeConfig({\n matrixRoomId: inputs.matrixRoomId,\n config: {\n oracleName: inputs.oracleName,\n orgName: inputs.orgName || '',\n description: inputs.description || '',\n location: inputs.location || '',\n price: inputs.price ?? 0,\n apiUrl: inputs.apiUrl || '',\n entityDid: inputs.entityDid,\n logoUrl: inputs.logoUrl || '',\n llmModel: inputs.llmModel || '',\n opening: inputs.opening,\n communicationStyle: inputs.communicationStyle,\n capabilities: inputs.capabilities,\n skills: inputs.skills,\n mcpServers: inputs.mcpServers,\n matrixUserId: inputs.matrixUserId || '',\n matrixAccountRoomId: inputs.matrixAccountRoomId || '',\n oracleAddress: inputs.oracleAddress || '',\n oracleDid: inputs.oracleDid || '',\n },\n });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nconst SENSITIVE_PLAINTEXT_KEYS = ['SECP_MNEMONIC', 'MATRIX_ORACLE_ADMIN_PASSWORD', 'MATRIX_RECOVERY_PHRASE', 'MATRIX_VALUE_PIN'] as const;\n\nregisterAction({\n type: 'qi/oracle.storeSecretsAndConfig',\n can: 'oracle/storeSecretsAndConfig',\n sideEffect: true,\n proof: { fields: ['storedSecrets'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: [\n 'matrixRoomId',\n 'publicKeyMultibase',\n 'verificationMethodId',\n 'matrixHomeServerUrl',\n 'matrixUsername',\n 'matrixPassword',\n 'mnemonic',\n 'matrixRecoveryPhrase',\n 'pin',\n 'openRouterApiKeyJwe',\n 'oracleName',\n 'entityDid',\n ],\n properties: {\n matrixRoomId: { type: 'string', description: 'Matrix room id from the oracle.contract output.' },\n publicKeyMultibase: { type: 'string', description: 'Oracle public key (multibase) from the entity.createOracle output.' },\n verificationMethodId: { type: 'string', description: 'Verification method id from the entity.createOracle output.' },\n matrixHomeServerUrl: { type: 'string', description: 'Matrix homeserver URL from the matrix.register output.' },\n matrixUsername: { type: 'string', description: 'Matrix username from the matrix.register output.' },\n matrixPassword: { type: 'string', description: 'Matrix password from the matrix.register output.' },\n mnemonic: { type: 'string', description: 'Wallet mnemonic from the wallet.generate output.' },\n matrixRecoveryPhrase: { type: 'string', description: 'Matrix recovery phrase from the matrix.register output.' },\n pin: { type: 'string', description: 'PIN from the form output.' },\n openRouterApiKeyJwe: { type: 'string', description: 'JWE-encrypted OpenRouter API key from the form.' },\n mcpAuthSecrets: { type: 'object', description: 'Optional pre-encrypted MCP auth secrets (object or JSON string).' },\n oracleName: { type: 'string', description: 'Oracle name.' },\n entityDid: { type: 'string', description: 'Oracle entity DID.' },\n orgName: { type: 'string', description: 'Organisation name.' },\n description: { type: 'string', description: 'Oracle description.' },\n location: { type: 'string', description: 'Oracle location.' },\n price: { type: 'number', description: 'Oracle price; defaults to 0.' },\n apiUrl: { type: 'string', description: 'Oracle API URL.' },\n logoUrl: { type: 'string', description: 'Oracle logo URL.' },\n llmModel: { type: 'string', description: 'LLM model identifier.' },\n opening: { type: 'string', description: 'Oracle opening message.' },\n communicationStyle: { type: 'string', description: 'Oracle communication style.' },\n capabilities: { type: 'string', description: 'Oracle capabilities description.' },\n skills: { type: 'array', description: 'List of oracle skills.' },\n mcpServers: { type: 'array', description: 'List of configured MCP servers.' },\n matrixUserId: { type: 'string', description: 'Oracle Matrix user id.' },\n matrixAccountRoomId: { type: 'string', description: 'Oracle Matrix account room id.' },\n oracleAddress: { type: 'string', description: 'Oracle wallet address.' },\n oracleDid: { type: 'string', description: 'Oracle DID.' },\n },\n },\n outputSchema: [\n { path: 'storedSecrets', displayName: 'Stored Secrets', type: 'array', description: 'List of secret names stored' },\n { path: 'roomId', displayName: 'Room ID', type: 'string', description: 'Matrix room where data is stored' },\n { path: 'configStored', displayName: 'Config Stored', type: 'boolean', description: 'Whether oracle config was stored' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.storeSecrets) throw new Error('oracle.storeSecrets handler not available');\n if (!ctx.services.oracle?.storeConfig) throw new Error('oracle.storeConfig handler not available');\n\n // ── Phase 1: Store Secrets ──────────────────────────────────────────\n // Routing\n if (!inputs.matrixRoomId) throw new Error('matrixRoomId is required (from oracle.contract output)');\n if (!inputs.publicKeyMultibase) throw new Error('publicKeyMultibase is required (from entity.createOracle output)');\n if (!inputs.verificationMethodId) throw new Error('verificationMethodId is required (from entity.createOracle output)');\n // Fresh mxLogin\n if (!inputs.matrixHomeServerUrl) throw new Error('matrixHomeServerUrl is required (from matrix.register output)');\n if (!inputs.matrixUsername) throw new Error('matrixUsername is required (from matrix.register output matrixUserId)');\n if (!inputs.matrixPassword) throw new Error('matrixPassword is required (from matrix.register output)');\n // Sensitive plaintext values\n if (!inputs.mnemonic) throw new Error('mnemonic is required (from wallet.generate output)');\n if (!inputs.matrixRecoveryPhrase) throw new Error('matrixRecoveryPhrase is required (from matrix.register output)');\n if (!inputs.pin) throw new Error('pin is required (from form output)');\n // OpenRouter must already be JWE-encrypted by the FlowDetail before submit\n if (!inputs.openRouterApiKeyJwe) {\n throw new Error('OPEN_ROUTER_API_KEY is required — enter it in the form before submitting');\n }\n\n const secrets: Record<string, string> = {\n SECP_MNEMONIC: inputs.mnemonic,\n MATRIX_ORACLE_ADMIN_PASSWORD: inputs.matrixPassword,\n MATRIX_RECOVERY_PHRASE: inputs.matrixRecoveryPhrase,\n MATRIX_VALUE_PIN: inputs.pin,\n };\n const preEncryptedSecrets: Record<string, string> = {\n OPEN_ROUTER_API_KEY: inputs.openRouterApiKeyJwe,\n };\n\n // Add MCP auth secrets if provided (already JWE-encrypted by FlowDetail)\n if (inputs.mcpAuthSecrets) {\n try {\n const mcpSecrets = typeof inputs.mcpAuthSecrets === 'string' ? JSON.parse(inputs.mcpAuthSecrets) : inputs.mcpAuthSecrets;\n if (mcpSecrets && typeof mcpSecrets === 'object') {\n Object.assign(preEncryptedSecrets, mcpSecrets);\n }\n } catch {\n console.warn('[oracle.storeSecretsAndConfig] Failed to parse mcpAuthSecrets');\n }\n }\n\n // Sanity: do not let any sensitive plaintext key be empty after assembly\n for (const k of SENSITIVE_PLAINTEXT_KEYS) {\n if (!secrets[k]) throw new Error(`${k} is empty after assembly — refusing to call storeSecrets`);\n }\n\n console.log('[oracle.storeSecretsAndConfig] Phase 1: storing secrets');\n const secretsResult = await ctx.services.oracle.storeSecrets({\n matrixRoomId: inputs.matrixRoomId,\n publicKeyMultibase: inputs.publicKeyMultibase,\n verificationMethodId: inputs.verificationMethodId,\n matrixHomeServerUrl: inputs.matrixHomeServerUrl,\n matrixUsername: inputs.matrixUsername,\n matrixPassword: inputs.matrixPassword,\n secrets,\n preEncryptedSecrets,\n });\n\n if (!secretsResult.storedSecrets || secretsResult.storedSecrets.length === 0) {\n throw new Error('storeSecrets returned success without any storedSecrets');\n }\n\n // ── Phase 2: Store Config ───────────────────────────────────────────\n if (!inputs.oracleName) throw new Error('oracleName is required');\n if (!inputs.entityDid) throw new Error('entityDid is required');\n\n console.log('[oracle.storeSecretsAndConfig] Phase 2: storing config');\n const configResult = await ctx.services.oracle.storeConfig({\n matrixRoomId: inputs.matrixRoomId,\n config: {\n oracleName: inputs.oracleName,\n orgName: inputs.orgName || '',\n description: inputs.description || '',\n location: inputs.location || '',\n price: inputs.price ?? 0,\n apiUrl: inputs.apiUrl || '',\n entityDid: inputs.entityDid,\n logoUrl: inputs.logoUrl || '',\n llmModel: inputs.llmModel || '',\n opening: inputs.opening,\n communicationStyle: inputs.communicationStyle,\n capabilities: inputs.capabilities,\n skills: inputs.skills,\n mcpServers: inputs.mcpServers,\n matrixUserId: inputs.matrixUserId || '',\n matrixAccountRoomId: inputs.matrixAccountRoomId || '',\n oracleAddress: inputs.oracleAddress || '',\n oracleDid: inputs.oracleDid || '',\n },\n });\n\n if (!configResult.configStored) {\n throw new Error('storeConfig returned success without configStored=true');\n }\n\n console.log('[oracle.storeSecretsAndConfig] Both phases complete');\n return {\n output: {\n storedSecrets: secretsResult.storedSecrets,\n roomId: secretsResult.roomId,\n configStored: configResult.configStored,\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nconst SENSITIVE_PLAINTEXT_KEYS = ['SECP_MNEMONIC', 'MATRIX_ORACLE_ADMIN_PASSWORD', 'MATRIX_RECOVERY_PHRASE', 'MATRIX_VALUE_PIN'] as const;\n\nregisterAction({\n type: 'qi/oracle.configureOracle',\n can: 'oracle/configureOracle',\n sideEffect: true,\n proof: { fields: ['configStored'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: [\n 'oracleEntityDid',\n 'publicKeyMultibase',\n 'verificationMethodId',\n 'matrixHomeServerUrl',\n 'matrixUsername',\n 'matrixPassword',\n 'mnemonic',\n 'matrixRecoveryPhrase',\n 'pin',\n 'openRouterApiKeyJwe',\n 'oracleName',\n 'entityDid',\n ],\n properties: {\n formAnswers: { type: 'string', description: 'Optional JSON string of form answers merged into the inputs.' },\n oracleEntityDid: { type: 'string', description: 'Oracle entity DID from the entity.createOracle output.' },\n publicKeyMultibase: { type: 'string', description: 'Oracle public key (multibase) from the entity.createOracle output.' },\n verificationMethodId: { type: 'string', description: 'Verification method id from the entity.createOracle output.' },\n matrixHomeServerUrl: { type: 'string', description: 'Matrix homeserver URL from the matrix.register output.' },\n matrixUsername: { type: 'string', description: 'Matrix username from the matrix.register output.' },\n matrixPassword: { type: 'string', description: 'Matrix password from the matrix.register output.' },\n mnemonic: { type: 'string', description: 'Wallet mnemonic from the wallet.generate output.' },\n matrixRecoveryPhrase: { type: 'string', description: 'Matrix recovery phrase from the matrix.register output.' },\n pin: { type: 'string', description: 'PIN from the form output.' },\n openRouterApiKeyJwe: { type: 'string', description: 'JWE-encrypted OpenRouter API key from the form.' },\n openRouterApiKeyPlaintext: { type: 'string', description: 'Optional plaintext OpenRouter API key passed through to the deploy output.' },\n mcpAuthSecrets: { type: 'object', description: 'Optional pre-encrypted MCP auth secrets (object or JSON string).' },\n oracleName: { type: 'string', description: 'Oracle name.' },\n entityDid: { type: 'string', description: 'Oracle entity DID.' },\n orgName: { type: 'string', description: 'Organisation name.' },\n description: { type: 'string', description: 'Oracle description.' },\n location: { type: 'string', description: 'Oracle location.' },\n price: { type: 'number', description: 'Oracle price; defaults to 0.' },\n apiUrl: { type: 'string', description: 'Oracle API URL.' },\n logoUrl: { type: 'string', description: 'Oracle logo URL.' },\n llmModel: { type: 'string', description: 'LLM model identifier.' },\n opening: { type: 'string', description: 'Oracle opening message.' },\n communicationStyle: { type: 'string', description: 'Oracle communication style.' },\n capabilities: { type: 'string', description: 'Oracle capabilities description.' },\n skills: { type: 'array', description: 'List of oracle skills.' },\n mcpServers: { type: 'array', description: 'List of configured MCP servers.' },\n matrixUserId: { type: 'string', description: 'Oracle Matrix user id.' },\n matrixAccountRoomId: { type: 'string', description: 'Oracle Matrix account room id.' },\n oracleAddress: { type: 'string', description: 'Oracle wallet address.' },\n oracleDid: { type: 'string', description: 'Oracle DID.' },\n },\n },\n outputSchema: [\n { path: 'userOracleRoomId', displayName: 'User-Oracle Room ID', type: 'string', description: 'Matrix room id from contract phase' },\n { path: 'userOracleRoomAlias', displayName: 'User-Oracle Room Alias', type: 'string', description: 'Matrix alias from contract phase' },\n { path: 'storedSecrets', displayName: 'Stored Secrets', type: 'array', description: 'List of secret names stored' },\n { path: 'roomId', displayName: 'Room ID', type: 'string', description: 'Matrix room where data is stored' },\n { path: 'configStored', displayName: 'Config Stored', type: 'boolean', description: 'Whether oracle config was stored' },\n { path: 'freshAccessToken', displayName: 'Fresh Access Token', type: 'string', description: 'Fresh Matrix access token from mxLogin during secret storage' },\n { path: 'openRouterApiKeyPlaintext', displayName: 'OpenRouter API Key', type: 'string', description: 'Plaintext OpenRouter API key for deploy' },\n ],\n run: async (rawInputs, ctx) => {\n // Parse form answers (JSON string from runtime.output.form.answers) and\n // merge into inputs so existing inputs.<field> references resolve.\n const form = (() => {\n const raw = (rawInputs as Record<string, unknown>).formAnswers;\n if (typeof raw !== 'string' || !raw) return {};\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n })() as Record<string, unknown>;\n const inputs = { ...form, ...rawInputs } as typeof rawInputs & Record<string, unknown>;\n\n if (!ctx.services.oracle?.contract) throw new Error('oracle.contract handler not available');\n if (!ctx.services.oracle?.storeSecrets) throw new Error('oracle.storeSecrets handler not available');\n if (!ctx.services.oracle?.storeConfig) throw new Error('oracle.storeConfig handler not available');\n\n // ── Phase 1: Contract ──────────────────────────────────────────────\n if (!inputs.oracleEntityDid) throw new Error('oracleEntityDid is required (from entity.createOracle output)');\n\n // Validate secrets inputs upfront so we fail fast before any side effects\n if (!inputs.publicKeyMultibase) throw new Error('publicKeyMultibase is required (from entity.createOracle output)');\n if (!inputs.verificationMethodId) throw new Error('verificationMethodId is required (from entity.createOracle output)');\n if (!inputs.matrixHomeServerUrl) throw new Error('matrixHomeServerUrl is required (from matrix.register output)');\n if (!inputs.matrixUsername) throw new Error('matrixUsername is required (from matrix.register output matrixUserId)');\n if (!inputs.matrixPassword) throw new Error('matrixPassword is required (from matrix.register output)');\n if (!inputs.mnemonic) throw new Error('mnemonic is required (from wallet.generate output)');\n if (!inputs.matrixRecoveryPhrase) throw new Error('matrixRecoveryPhrase is required (from matrix.register output)');\n if (!inputs.pin) throw new Error('pin is required (from form output)');\n if (!inputs.openRouterApiKeyJwe) {\n throw new Error('OPEN_ROUTER_API_KEY is required — enter it in the form before submitting');\n }\n if (!inputs.oracleName) throw new Error('oracleName is required');\n if (!inputs.entityDid) throw new Error('entityDid is required');\n\n console.log('[oracle.configureOracle] Phase 1: contracting oracle');\n const contractResult = await ctx.services.oracle.contract({\n oracleEntityDid: inputs.oracleEntityDid,\n });\n\n if (!contractResult.userOracleRoomId) {\n throw new Error('contract returned success without userOracleRoomId');\n }\n\n const matrixRoomId = contractResult.userOracleRoomId;\n\n // ── Phase 2: Store Secrets ─────────────────────────────────────────\n const secrets: Record<string, string> = {\n SECP_MNEMONIC: inputs.mnemonic,\n MATRIX_ORACLE_ADMIN_PASSWORD: inputs.matrixPassword,\n MATRIX_RECOVERY_PHRASE: inputs.matrixRecoveryPhrase,\n MATRIX_VALUE_PIN: inputs.pin,\n };\n const preEncryptedSecrets: Record<string, string> = {\n OPEN_ROUTER_API_KEY: inputs.openRouterApiKeyJwe,\n };\n\n // Add MCP auth secrets if provided (already JWE-encrypted by FlowDetail)\n if (inputs.mcpAuthSecrets) {\n try {\n const mcpSecrets = typeof inputs.mcpAuthSecrets === 'string' ? JSON.parse(inputs.mcpAuthSecrets) : inputs.mcpAuthSecrets;\n if (mcpSecrets && typeof mcpSecrets === 'object') {\n Object.assign(preEncryptedSecrets, mcpSecrets);\n }\n } catch {\n console.warn('[oracle.configureOracle] Failed to parse mcpAuthSecrets');\n }\n }\n\n // Sanity: do not let any sensitive plaintext key be empty after assembly\n for (const k of SENSITIVE_PLAINTEXT_KEYS) {\n if (!secrets[k]) throw new Error(`${k} is empty after assembly — refusing to call storeSecrets`);\n }\n\n console.log('[oracle.configureOracle] Phase 2: storing secrets');\n const secretsResult = await ctx.services.oracle.storeSecrets({\n matrixRoomId,\n publicKeyMultibase: inputs.publicKeyMultibase,\n verificationMethodId: inputs.verificationMethodId,\n matrixHomeServerUrl: inputs.matrixHomeServerUrl,\n matrixUsername: inputs.matrixUsername,\n matrixPassword: inputs.matrixPassword,\n secrets,\n preEncryptedSecrets,\n });\n\n if (!secretsResult.storedSecrets || secretsResult.storedSecrets.length === 0) {\n throw new Error('storeSecrets returned success without any storedSecrets');\n }\n\n // ── Phase 3: Store Config ──────────────────────────────────────────\n console.log('[oracle.configureOracle] Phase 3: storing config');\n const configResult = await ctx.services.oracle.storeConfig({\n matrixRoomId,\n config: {\n oracleName: inputs.oracleName,\n orgName: inputs.orgName || '',\n description: inputs.description || '',\n location: inputs.location || '',\n price: inputs.price ?? 0,\n apiUrl: inputs.apiUrl || '',\n entityDid: inputs.entityDid,\n logoUrl: inputs.logoUrl || '',\n llmModel: inputs.llmModel || '',\n opening: inputs.opening,\n communicationStyle: inputs.communicationStyle,\n capabilities: inputs.capabilities,\n skills: inputs.skills,\n mcpServers: inputs.mcpServers,\n matrixUserId: inputs.matrixUserId || '',\n matrixAccountRoomId: inputs.matrixAccountRoomId || '',\n oracleAddress: inputs.oracleAddress || '',\n oracleDid: inputs.oracleDid || '',\n },\n });\n\n if (!configResult.configStored) {\n throw new Error('storeConfig returned success without configStored=true');\n }\n\n console.log('[oracle.configureOracle] All 3 phases complete');\n return {\n output: {\n userOracleRoomId: contractResult.userOracleRoomId,\n userOracleRoomAlias: contractResult.userOracleRoomAlias,\n storedSecrets: secretsResult.storedSecrets,\n roomId: secretsResult.roomId,\n configStored: configResult.configStored,\n freshAccessToken: secretsResult.freshAccessToken || '',\n openRouterApiKeyPlaintext: inputs.openRouterApiKeyPlaintext || '',\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/oracle.deploySetup',\n can: 'oracle/deploySetup',\n sideEffect: true,\n proof: { fields: ['setupComplete'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['name', 'config', 'roomId'],\n properties: {\n name: { type: 'string', description: 'Project name from the form.' },\n config: { type: 'object', description: 'Oracle config object (or its JSON string).' },\n roomId: { type: 'string', description: 'Matrix room id from the oracle contract/configure output.' },\n secrets: { type: 'object', description: 'Optional map of secret name to value passed to deploy setup.' },\n },\n },\n outputSchema: [\n { path: 'setupComplete', displayName: 'Setup Complete', type: 'boolean', description: 'Whether the oracle setup completed successfully' },\n { path: 'stdout', displayName: 'Build Output', type: 'string', description: 'Build stdout output' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.deploySetup) {\n throw new Error('oracle.deploySetup handler not available');\n }\n if (!inputs.name) throw new Error('name is required (project name from form)');\n\n const config = typeof inputs.config === 'string' ? JSON.parse(inputs.config) : inputs.config;\n if (!config || typeof config !== 'object') throw new Error('config is required (oracle config object)');\n\n if (!inputs.roomId) throw new Error('roomId is required (from oracle contract/configure output)');\n\n const secrets = inputs.secrets as Record<string, string> | undefined;\n const result = await ctx.services.oracle.deploySetup({ name: inputs.name, config, roomId: inputs.roomId, secrets });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/oracle.deployStart',\n can: 'oracle/deployStart',\n sideEffect: true,\n proof: { fields: ['processId', 'status'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['name', 'entityDid', 'roomId'],\n properties: {\n name: { type: 'string', description: 'Project name from the form.' },\n entityDid: { type: 'string', description: 'Oracle entity DID from the entity.createOracle output.' },\n roomId: { type: 'string', description: 'Matrix room id from the oracle contract/configure output.' },\n secrets: { type: 'object', description: 'Optional map of secret name to value passed to deploy start.' },\n },\n },\n outputSchema: [\n { path: 'processId', displayName: 'Process ID', type: 'string', description: 'Running process identifier' },\n { path: 'status', displayName: 'Status', type: 'string', description: 'Oracle process status' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.deployStart) {\n throw new Error('oracle.deployStart handler not available');\n }\n if (!inputs.name) throw new Error('name is required (project name from form)');\n if (!inputs.entityDid) throw new Error('entityDid is required (from entity.createOracle output)');\n if (!inputs.roomId) throw new Error('roomId is required (from oracle contract/configure output)');\n\n const secrets = inputs.secrets as Record<string, string> | undefined;\n const result = await ctx.services.oracle.deployStart({ name: inputs.name, entityDid: inputs.entityDid, roomId: inputs.roomId, secrets });\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../registry';\n\nregisterAction({\n type: 'qi/oracle.deploy',\n can: 'oracle/deploy',\n sideEffect: true,\n proof: { fields: ['processId', 'status'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['name', 'entityDid', 'roomId', 'config'],\n properties: {\n name: { type: 'string', description: 'Project name from the form.' },\n entityDid: { type: 'string', description: 'Oracle entity DID from the entity.createOracle output.' },\n roomId: { type: 'string', description: 'Matrix room id from the oracle.configureOracle output.' },\n config: { type: 'object', description: 'Oracle config object (or its JSON string).' },\n secrets: { type: 'object', description: 'Optional map of secret name to value passed to deploy.' },\n },\n },\n outputSchema: [\n { path: 'setupComplete', displayName: 'Setup Complete', type: 'boolean', description: 'Whether the oracle setup completed successfully' },\n { path: 'processId', displayName: 'Process ID', type: 'string', description: 'Running process identifier' },\n { path: 'status', displayName: 'Status', type: 'string', description: 'Oracle process status' },\n { path: 'deploymentUrl', displayName: 'Deployment URL', type: 'string', description: 'The URL where the oracle was deployed' },\n { path: 'domainUpdateTxHash', displayName: 'Domain Update Tx', type: 'string', description: 'Transaction hash of the on-chain domain update' },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.oracle?.deploySetup) {\n throw new Error('oracle.deploySetup handler not available');\n }\n if (!ctx.services.oracle?.deployStart) {\n throw new Error('oracle.deployStart handler not available');\n }\n if (!inputs.name) throw new Error('name is required (project name from form)');\n if (!inputs.entityDid) throw new Error('entityDid is required (from entity.createOracle output)');\n if (!inputs.roomId) throw new Error('roomId is required (from oracle.configureOracle output)');\n\n const config = typeof inputs.config === 'string' ? JSON.parse(inputs.config) : inputs.config;\n if (!config || typeof config !== 'object') throw new Error('config is required (oracle config object)');\n\n const secrets = inputs.secrets as Record<string, string> | undefined;\n\n const setupResult = await ctx.services.oracle.deploySetup({ name: inputs.name, config, roomId: inputs.roomId, secrets });\n if (!setupResult.setupComplete) {\n throw new Error(`Deploy setup failed: ${setupResult.stderr || 'setupComplete was not true'}`);\n }\n\n const startResult = await ctx.services.oracle.deployStart({ name: inputs.name, entityDid: inputs.entityDid, roomId: inputs.roomId, secrets });\n if (!startResult.processId && startResult.status !== 'running') {\n throw new Error('Deploy start failed: no processId returned and status is not running');\n }\n\n let deploymentUrl: string | undefined;\n let domainUpdateTxHash: string | undefined;\n if (startResult.url) {\n if (!ctx.services.oracle?.updateOracleDomain) {\n console.warn('[oracle.deploy] updateOracleDomain handler not available, skipping domain update');\n } else {\n const domainResult = await ctx.services.oracle.updateOracleDomain({\n entityDid: inputs.entityDid,\n newApiUrl: startResult.url,\n });\n deploymentUrl = startResult.url;\n domainUpdateTxHash = domainResult.transactionHash;\n }\n }\n\n return {\n output: {\n setupComplete: setupResult.setupComplete,\n processId: startResult.processId,\n status: startResult.status,\n deploymentUrl,\n domainUpdateTxHash,\n },\n };\n },\n});\n","import type { ActionEventDefinition, OutputSchemaField } from '../../types';\n\n/**\n * Canonical action type for the single claim-collection lifecycle block.\n * One block, one runtime entry; `run()` dispatches on the `operation` input\n * (create | updateState | updateDates | updateQuota | updatePayments |\n * updateIntents | refresh) and always returns the full latest on-chain\n * `CollectionState` as `output` (IXO-2573).\n */\nexport const COLLECTION_LIFECYCLE_ACTION_TYPE = 'qi/collection.lifecycle';\n\n/**\n * Output schema = the fields of `CollectionState`. `output` always holds the\n * full latest on-chain collection state, never a per-operation delta.\n */\nexport const COLLECTION_LIFECYCLE_OUTPUT_SCHEMA: OutputSchemaField[] = [\n { path: 'collectionId', displayName: 'Collection ID', type: 'string', description: 'Chain-assigned collection identifier' },\n { path: 'entity', displayName: 'Entity DID', type: 'string', description: 'Entity (deed) DID the collection belongs to' },\n { path: 'protocol', displayName: 'Protocol', type: 'string', description: 'Protocol DID/id the collection follows' },\n { path: 'admin', displayName: 'Admin Address', type: 'string', description: 'Address authorised to mutate the collection' },\n { path: 'state', displayName: 'State', type: 'number', description: 'Lifecycle state (0=OPEN, 1=PAUSED, 2=CLOSED)' },\n { path: 'startDate', displayName: 'Start Date', type: 'string', description: 'ISO-8601 start date' },\n { path: 'endDate', displayName: 'End Date', type: 'string', description: 'ISO-8601 end date' },\n { path: 'quota', displayName: 'Quota', type: 'string', description: 'Max claims; 0 = unlimited' },\n { path: 'count', displayName: 'Count', type: 'string', description: 'Number of claims submitted' },\n { path: 'evaluated', displayName: 'Evaluated', type: 'string', description: 'Number of claims evaluated' },\n { path: 'approved', displayName: 'Approved', type: 'string', description: 'Number of approved claims' },\n { path: 'rejected', displayName: 'Rejected', type: 'string', description: 'Number of rejected claims' },\n { path: 'disputed', displayName: 'Disputed', type: 'string', description: 'Number of disputed claims' },\n { path: 'payments', displayName: 'Payments', type: 'object', description: 'Payment legs (submission/evaluation/approval/rejection)' },\n { path: 'intents', displayName: 'Intents', type: 'object', description: 'Intent configuration' },\n];\n\n/**\n * Name of the event emitted once when a new collection is created on-chain\n * (IXO-2595). A listener block — e.g. Manage Collection Users\n * (`qi/collection.users`) — can declare a `block.event` trigger on this event\n * and will be queued for invocation, bound to the freshly-created collection,\n * the moment the create succeeds.\n */\nexport const COLLECTION_CREATED_EVENT_NAME = 'created';\n\n/**\n * Event vocabulary for the `created` event. The payload carries everything a\n * listener needs to act on the new collection without re-deriving it: the\n * chain-assigned `collectionId`, the owning `entity` (deed) DID and the\n * `protocol`. `pendingDisplayFields` drive the inline preview the assignee\n * sees in their pending-invocation list.\n *\n * Emitted ONLY on the `create` operation (see `./collection`); manage/update\n * /refresh runs never emit it. `getDynamicEvents` hides it from the trigger\n * picker for manage-mode blocks (those bound to an existing collectionId).\n */\nexport const COLLECTION_CREATED_EVENT: ActionEventDefinition = {\n name: COLLECTION_CREATED_EVENT_NAME,\n displayName: 'Collection created',\n description: 'Fires once when a new claim collection is created on-chain. Carries the collection id, entity (deed) DID and protocol so a listener can manage the new collection.',\n payloadSchema: [\n { path: 'collectionId', displayName: 'Collection ID', type: 'string', description: 'Chain-assigned collection identifier' },\n { path: 'entity', displayName: 'Entity DID', type: 'string', description: 'Entity (deed) DID the collection belongs to' },\n { path: 'protocol', displayName: 'Protocol', type: 'string', description: 'Protocol DID/id the collection follows' },\n { path: 'transactionHash', displayName: 'Tx Hash', type: 'string', description: 'MsgCreateCollection broadcast transaction hash' },\n ],\n pendingDisplayFields: ['collectionId', 'entity'],\n};\n\n// NOTE: The action is registered (with the real operation dispatcher `run()`)\n// in `./collection`. This module intentionally exports only the shared\n// constants (action type + output schema + event vocabulary) that `./collection`\n// and the FlowDetail/diff tracks import, so there is exactly one `registerAction`\n// call for `qi/collection.lifecycle` and no Phase-0 stub collision (IXO-2580).\n","import type { Doc as YDoc } from 'yjs';\n\nimport type { FlowNode, FlowNodeRuntimeState } from '../../types/authorization';\nimport type { IxoEditorType } from '../../types/editor';\nimport type { FlowRuntimeStateManager } from '../flowEngine/runtime';\nimport type { PendingInvocation } from '../flowEngine/triggers';\n\n/**\n * The raw consumer handler bag (mantine `BlocknoteHandlers`), as visible to\n * action `run()` implementations via `ctx.handlers`. The real interface lives\n * in the mantine layer and cannot be imported here without a core→mantine\n * cycle, so this declares only the members actions actually call — loosely\n * typed, since the parameter shapes are owned by the consumer contract.\n *\n * There is deliberately NO index signature: calling an undeclared handler is a\n * compile error, so a renamed consumer handler surfaces here instead of\n * failing at runtime. Add the member when an action starts using a new\n * handler. Prefer `ctx.services.*` (the typed, adapted contract) over\n * `ctx.handlers` for new actions — this escape hatch exists for actions that\n * predate `buildServicesFromHandlers`.\n */\nexport interface ActionHandlers {\n askCompanion?: (prompt: string) => Promise<any>;\n vote?: (...args: any[]) => any;\n getPreProposalContractAddress?: (...args: any[]) => any;\n getGroupContractAddress?: (...args: any[]) => any;\n getProposalContractAddress?: (...args: any[]) => any;\n createProposal?: (...args: any[]) => any;\n getUserRoles?: (...args: any[]) => any;\n getClaimData?: (...args: any[]) => any;\n requestPin?: (...args: any[]) => any;\n signCredential?: (...args: any[]) => any;\n publicFileUpload?: (...args: any[]) => any;\n createDomain?: (...args: any[]) => any;\n createAddLinkedResourceMessage?: (...args: any[]) => any;\n executeTransaction?: (...args: any[]) => any;\n createGovernanceGroup?: (...args: any[]) => any;\n getEntityDid?: (...args: any[]) => any;\n getCurrentUser?: (...args: any[]) => any;\n createAddLinkedEntityMessage?: (...args: any[]) => any;\n sourceDomainSpaces?: (...args: any[]) => any;\n importProtocolTemplatesToSpace?: (...args: any[]) => any;\n integrations?: {\n executeTool?: (...args: any[]) => any;\n fetchCurrentState?: (...args: any[]) => any;\n getEntityDid?: (...args: any[]) => any;\n };\n}\n\nexport interface ActionContext {\n actorDid: string;\n flowId: string;\n /** Explicit session run; distinct from an individual action execution id. */\n sessionRunId?: string;\n nodeId: string;\n services: ActionServices;\n flowNode?: FlowNode;\n runtime?: FlowRuntimeStateManager;\n flowUri?: string;\n handlers?: ActionHandlers;\n editor?: IxoEditorType;\n /**\n * The flow document. Present on both execution paths — `editor` is undefined\n * headless, so an action that needs flow-level configuration (the connection\n * bindings, say) has to read it from here rather than from the editor.\n */\n yDoc?: YDoc;\n pendingInvocation?: PendingInvocation;\n}\n\n/**\n * Lifecycle state of an IXO claims-module collection.\n *\n * Mirrors `ixo.claims.v1beta1.CollectionState` (the on-chain enum). Carried as\n * a numeric enum at this boundary so the consumer-side handler can map it\n * directly onto the SDK enum without a string lookup.\n *\n * - `OPEN` (0) — accepting claims/bids.\n * - `PAUSED` (1) — temporarily not accepting submissions.\n * - `CLOSED` (2) — permanently closed.\n */\nexport enum CollectionStateEnum {\n OPEN = 0,\n PAUSED = 1,\n CLOSED = 2,\n}\n\n/**\n * A single coin amount. Mirrors `cosmos.base.v1beta1.Coin`. `amount` is the\n * integer base-denom amount carried as a string (no `Long`/`bigint` at this\n * boundary).\n */\nexport interface CollectionCoin {\n denom: string;\n amount: string;\n}\n\n/**\n * A CW20 token payment leg. Mirrors `ixo.claims.v1beta1.CW20Payment`.\n */\nexport interface CollectionCW20Payment {\n address: string;\n /** Integer amount carried as a string. */\n amount: string;\n}\n\n/**\n * A CW1155 contract payment leg. Mirrors `ixo.claims.v1beta1.Contract1155Payment`.\n */\nexport interface CollectionContract1155Payment {\n address: string;\n tokenId: string;\n /** Integer amount carried as a string. */\n amount: string;\n}\n\n/**\n * One payment leg of a collection (submission / evaluation / approval /\n * rejection). Mirrors `ixo.claims.v1beta1.Payment`.\n *\n * Optional/empty legs are represented by an empty `amount` array. The consumer\n * handler fills `account` with the collection admin address when creating.\n */\nexport interface CollectionPayment {\n /** Destination/charging account address. */\n account: string;\n /** Native-coin amounts. Empty when this leg charges nothing in native coin. */\n amount: CollectionCoin[];\n /** Optional CW20 payment legs. */\n cw20Payment?: CollectionCW20Payment[];\n /** Optional CW1155 contract payment. */\n contract_1155Payment?: CollectionContract1155Payment;\n /** Optional payment timeout in nanoseconds, carried as a string. */\n timeoutNs?: string;\n /** Whether this leg is paid by the oracle rather than the claimant. */\n isOraclePayment?: boolean;\n}\n\n/**\n * The four payment legs of a collection. Mirrors `ixo.claims.v1beta1.Payments`.\n */\nexport interface Payments {\n submission?: CollectionPayment;\n evaluation?: CollectionPayment;\n approval?: CollectionPayment;\n rejection?: CollectionPayment;\n}\n\n/**\n * Per-intent configuration for a collection. Mirrors the\n * `ixo.claims.v1beta1.CollectionIntentOptions` shape — controls whether/how\n * claimants can declare an intent before submitting.\n */\nexport interface CollectionIntentOptions {\n /** Whether intents are enabled on this collection. */\n allowed?: boolean;\n /** Optional intent timeout in nanoseconds, carried as a string. */\n timeoutNs?: string;\n /** Optional per-intent payment override. */\n payment?: CollectionPayment;\n}\n\n/**\n * Parameters for creating a collection (`MsgCreateCollection`).\n *\n * `entity` and `protocol` are template configuration; the consumer resolves the\n * `signer`/admin from its own wallet context, so it is not part of this\n * boundary. `quota` is carried as a string (`0` = unlimited).\n */\nexport interface CollectionCreateParams {\n /** Entity (deed) DID the collection belongs to. */\n entity: string;\n /** Protocol DID/id the collection follows. */\n protocol: string;\n /** Initial lifecycle state. Defaults to OPEN if omitted by the consumer. */\n state?: CollectionStateEnum;\n /** ISO-8601 start date. */\n startDate?: string;\n /** ISO-8601 end date. */\n endDate?: string;\n /** Max number of claims; `0` = unlimited. Carried as a string. */\n quota?: string;\n /** Payment configuration for the four claim legs. */\n payments?: Payments;\n /** Intent configuration. */\n intents?: CollectionIntentOptions;\n}\n\n/**\n * The full, canonical on-chain state of a collection, returned by every\n * `collection.*` operation (read or write) and stored verbatim as\n * `runtime.output`. It is never a delta — see IXO-2573: `output` always holds\n * the latest full on-chain collection state.\n *\n * Field names mirror `ixo.claims.v1beta1.Collection`. Numeric chain types\n * (`Long`/uint64) are carried as strings; `state` is the numeric enum.\n */\nexport interface CollectionState {\n /** Collection identifier (the chain-assigned id). */\n collectionId: string;\n /** Entity (deed) DID the collection belongs to. */\n entity: string;\n /** Protocol DID/id the collection follows. */\n protocol: string;\n /** Admin address authorised to mutate the collection. */\n admin?: string;\n /** Current lifecycle state. */\n state: CollectionStateEnum;\n /** ISO-8601 start date, if set. */\n startDate?: string;\n /** ISO-8601 end date, if set. */\n endDate?: string;\n /** Max number of claims; `0` = unlimited. Carried as a string. */\n quota: string;\n /** Number of claims submitted so far. Carried as a string. */\n count: string;\n /** Number of claims evaluated so far. Carried as a string. */\n evaluated?: string;\n /** Number of approved claims. Carried as a string. */\n approved?: string;\n /** Number of rejected claims. Carried as a string. */\n rejected?: string;\n /** Number of disputed claims. Carried as a string. */\n disputed?: string;\n /** Payment configuration for the four claim legs. */\n payments?: Payments;\n /** Intent configuration. */\n intents?: CollectionIntentOptions;\n}\n\n/**\n * Role a grantee holds on a claim collection. Drives which custom claims-module\n * authorization is granted: `submit` → `SubmitClaimAuthorization`,\n * `evaluate` → `EvaluateClaimAuthorization` (each carries `[]constraints`, one\n * per collection). See IXO-2586.\n */\nexport type CollectionUserRole = 'submit' | 'evaluate';\n\n/**\n * How a grantee address is treated when adding it to a collection:\n * - `user` — a plain account; one grant.\n * - `group-account` — a DAO-core group account; one grant to the group itself.\n * Only offered when the group can exercise the grant (dao-core can MsgExec).\n * - `group-members` — fan out: enumerate the group's members and grant each\n * one individually.\n */\nexport type CollectionGranteeKind = 'user' | 'group-account' | 'group-members';\n\n/**\n * One per-collection authorization constraint held by a grantee for a role.\n * Carries the LIVE (decremented) limits as read back from chain — the revoke\n * read-modify-write must preserve these verbatim (IXO-2590), so re-granting\n * from a template would wrongly reset spent quota.\n */\nexport interface CollectionGrantee {\n /** Grantee bech32 address. */\n address: string;\n /** Optional resolved DID (display / audit). */\n did?: string;\n /** Role this grant confers. */\n role: CollectionUserRole;\n /** Remaining agent quota; `0` = unlimited. Carried as a string. */\n agentQuota?: string;\n /** Per-claim max amount cap (evaluate role). */\n maxAmount?: CollectionCoin[];\n /** Intent duration in nanoseconds, carried as a string. */\n intentDurationNs?: string;\n}\n\n/**\n * A member enumerated from a group account, used for grant fan-out. Mirrors the\n * `PODMember` shape produced by the `pod/memberMultiSelect` enumeration\n * (abstracts cw4 members / token-staking stakers / nft-staking / multisig\n * signers).\n */\nexport interface CollectionMember {\n address: string;\n did?: string;\n role?: string;\n votingPower?: number;\n}\n\n/**\n * DAO DAO classification of an address. On IXO both user accounts and CosmWasm\n * contracts share the `ixo1…` prefix, so classification is layered: bech32\n * byte-length heuristic → Wasm `ContractInfo` query → cw2 `{ \"info\": {} }`\n * smart query (IXO-2592).\n */\nexport interface AddressClassification {\n /** `user` = plain account; `contract` = CosmWasm contract / module account. */\n kind: 'user' | 'contract';\n /** Present when `kind === 'contract'` and cw2 info resolved a DAO DAO group type. */\n daodao?: {\n /** cw2 contract name family, e.g. `dao-dao-core`, `cw4-group`, `dao-voting-cw4`. */\n type: string;\n /** Whether the contract can itself exercise a granted authz (only dao-core can MsgExec). */\n canExerciseGrant: boolean;\n };\n}\n\n/**\n * Provenance/identity of a carbon batch (= a CARBON token group; the batch id\n * is the on-chain token id). `entityDid` + `adminAddress` identify the entity\n * admin account the batch was minted from — both are REQUIRED to construct a\n * harvest (the authz grant + exec transfer target that account). The host\n * `loadBatches` handler performs provenance recovery for transferred batches so\n * these are populated before the editor ever sees them. See the carbon-credit\n * technical doc §4–§5 (IXO-2675).\n */\nexport interface CarbonBatchRef {\n /** Token/batch id. */\n id: string;\n /** Minter entity DID. */\n entityDid: string;\n /** Entity admin account address (the FROM account for a harvest transfer). */\n adminAddress: string;\n /** Human-readable entity name, for display. */\n alsoKnownAs?: string;\n}\n\n/**\n * A harvestable batch: held on an entity admin account the user owns but not\n * yet pulled into their wallet. `claimable` = the admin-held amount that\n * becomes the user's on harvest.\n */\nexport interface CarbonHarvestableBatch extends CarbonBatchRef {\n /** Harvestable amount (admin-held; becomes user `amount` after harvest). */\n claimable: number;\n}\n\n/**\n * A retireable batch: credits the user already holds in their wallet and can\n * burn/offset. `entityDid` is best-effort (display/provenance) and not required\n * to retire — retirement is a single owner-signed message.\n */\nexport interface CarbonRetireableBatch {\n /** Token/batch id. */\n id: string;\n /** Amount available in the user's wallet to retire. */\n amount: number;\n /** Minter entity DID, when known. */\n entityDid?: string;\n /** Human-readable entity name, for display. */\n alsoKnownAs?: string;\n}\n\nexport interface HttpService {\n request: (params: { url: string; method: string; headers?: Record<string, string>; body?: any }) => Promise<{ status: number; headers: Record<string, string>; data: any }>;\n}\n\nexport interface EmailService {\n send: (params: {\n to: string;\n subject: string;\n template: string;\n templateVersion?: string;\n variables?: Record<string, any>;\n cc?: string;\n bcc?: string;\n replyTo?: string;\n }) => Promise<{ messageId: string; sentAt: string }>;\n}\n\nexport interface NotifyService {\n send: (params: {\n channel: string;\n to: string[];\n cc?: string[];\n bcc?: string[];\n subject?: string;\n body?: string;\n bodyType?: 'text' | 'html';\n from?: string;\n replyTo?: string;\n }) => Promise<{ messageId: string; sentAt: string }>;\n}\n\nexport interface BidService {\n submitBid: (params: { collectionId: string; role: string; surveyAnswers: Record<string, any>; entityDid?: string; onBehalfOfAddress?: string }) => Promise<any>;\n approveBid: (params: { bidId: string; collectionId: string; did: string; entityDid?: string }) => Promise<any>;\n rejectBid: (params: { bidId: string; collectionId: string; did: string; reason: string; entityDid?: string }) => Promise<any>;\n approveServiceAgentApplication: (params: { adminAddress: string; collectionId: string; agentQuota: number; deedDid: string; currentUserAddress: string }) => Promise<void>;\n approveEvaluatorApplication: (params: {\n adminAddress: string;\n collectionId: string;\n deedDid: string;\n evaluatorAddress: string;\n agentQuota?: number;\n claimIds?: string[];\n maxAmounts?: Array<{ denom: string; amount: string }>;\n }) => Promise<void>;\n}\n\nexport interface ClaimService {\n requestPin: (config?: { title?: string; description?: string; submitText?: string }) => Promise<string>;\n submitClaim: (params: { surveyData: any; deedDid: string; collectionId: string; adminAddress: string; pin: string; entityDid?: string }) => Promise<{\n transactionHash: string;\n claimId: string;\n }>;\n evaluateClaim: (\n granteeAddress: string,\n did: string,\n payload: {\n claimId: string;\n collectionId: string;\n adminAddress: string;\n status?: number;\n verificationProof: string;\n amount?: { denom: string; amount: string };\n }\n ) => Promise<{\n code: number;\n transactionHash: string;\n rawLog?: string;\n height?: number;\n txIndex?: number;\n gasWanted?: bigint;\n gasUsed?: bigint;\n }>;\n disputeClaim?: (\n granteeAddress: string,\n did: string,\n payload: {\n subjectId: string;\n disputeType: number;\n reason: string;\n }\n ) => Promise<any>;\n getCurrentUser: () => { address: string; did?: string };\n createUdid?: (params: any) => Promise<any>;\n}\n\n/**\n * Claims-module collection lifecycle service. The editor declares the\n * contract only; the consumer app implements each method (broadcast on chain,\n * resolve admin from its wallet context, map string<->Long).\n *\n * Per IXO-2573, each write op should broadcast then the dispatcher re-fetches\n * via `get(...)` so `runtime.output` always holds the latest full\n * `CollectionState`. `get` is the read-only `refresh` primitive.\n */\nexport interface CollectionService {\n /** Read the full current on-chain state of a collection. */\n get: (params: { collectionId: string }) => Promise<CollectionState>;\n /** Broadcast `MsgCreateCollection`. Returns the new collectionId + tx hash. */\n create: (params: CollectionCreateParams) => Promise<{ transactionHash: string; collectionId: string }>;\n /** Broadcast `MsgUpdateCollectionState`. */\n updateState: (params: { collectionId: string; state: CollectionStateEnum; adminAddress: string }) => Promise<{ transactionHash: string }>;\n /** Broadcast `MsgUpdateCollectionDates`. */\n updateDates: (params: { collectionId: string; startDate?: string; endDate?: string; adminAddress: string }) => Promise<{ transactionHash: string }>;\n /** Broadcast `MsgUpdateCollectionQuota`. `quota` carried as a string; `0` = unlimited. */\n updateQuota: (params: { collectionId: string; quota: string; adminAddress: string }) => Promise<{ transactionHash: string }>;\n /** Broadcast `MsgUpdateCollectionPayments`. */\n updatePayments: (params: { collectionId: string; payments: Payments; adminAddress: string }) => Promise<{ transactionHash: string }>;\n /** Broadcast `MsgUpdateCollectionIntents`. */\n updateIntents: (params: { collectionId: string; intents: CollectionIntentOptions; adminAddress: string }) => Promise<{ transactionHash: string }>;\n}\n\n/**\n * Claim-collection user-management service (IXO-2586). The editor declares the\n * contract only; the consumer app implements each method (build/broadcast the\n * claims-module authz messages, query authz grants, classify addresses,\n * enumerate group members). Extends → replaces the reactive `bid` service.\n */\nexport interface CollectionUsersService {\n /**\n * Grant submit/evaluate authz for ONE collection to a grantee. The handler\n * reads the grantee's existing authz for the role's msgTypeUrl and APPENDS a\n * per-collection constraint (preserving other collections' live values),\n * then broadcasts `MsgCreateClaimAuthorization` routed via\n * `MsgGrantEntityAccountAuthz` (entity admin = granter). See IXO-2589.\n */\n grant: (params: {\n granterAdminAddress: string;\n granteeAddress: string;\n collectionId: string;\n role: CollectionUserRole;\n agentQuota?: string;\n maxAmount?: CollectionCoin[];\n intentDurationNs?: string;\n deedDid?: string;\n }) => Promise<{ transactionHash: string }>;\n /**\n * Per-collection read-modify-write revoke (IXO-2590). Reads the grantee's\n * live authz, drops the target collection's constraint, and — when other\n * constraints remain — broadcasts a single atomic tx ordered\n * `[MsgRevokeEntityAccountAuthz, then one MsgCreateClaimAuthorization per\n * remaining constraint]`, preserving each remaining constraint's live\n * (decremented) quota/limits. Short-circuits to a plain revoke when the\n * target was the only constraint.\n */\n revoke: (params: { granterAdminAddress: string; granteeAddress: string; collectionId: string; role: CollectionUserRole }) => Promise<{ transactionHash: string }>;\n /**\n * List the grantees holding a submit/evaluate constraint for a collection.\n * Queries authz grants against the entity admin account, decodes the\n * authorizations, and filters constraints by `collectionId` (IXO-2591).\n */\n list: (params: { granterAdminAddress: string; collectionId: string }) => Promise<{ grantees: CollectionGrantee[] }>;\n /** Classify an address as a plain user vs a DAO DAO contract (IXO-2592). */\n classifyAddress: (params: { address: string }) => Promise<AddressClassification>;\n /** Enumerate the members of a group account for grant fan-out (IXO-2592). */\n enumerateMembers: (params: { groupAddress: string }) => Promise<{ members: CollectionMember[] }>;\n}\n\nexport interface MatrixCredentialService {\n storeCredential: (params: { roomId: string; credentialKey: string; credential: Record<string, any>; cid: string }) => Promise<{ storedAt: string; duplicate: boolean }>;\n}\n\n/** Result of any integration tool execution (direct or via a binding). */\nexport interface IntegrationExecuteOutcome {\n successful: boolean;\n data?: Record<string, unknown>;\n error?: string;\n code?: 'OK' | 'VALIDATION' | 'AUTH_EXPIRED' | 'UPSTREAM_4XX' | 'UPSTREAM_5XX' | 'RATE_LIMIT' | 'UNKNOWN';\n}\n\n/**\n * The author-authorised connection a delegated block stores in its template\n * config. Holds only opaque references — never a credential. Clones verbatim\n * from template to flow; runners execute against it without connecting\n * anything. The binding lives on the worker keyed by `bindingId`; expiry (if\n * the underlying OAuth dies) surfaces at execute time, not as a stored field.\n */\nexport interface BoundConnection {\n /** Opaque, template-scoped reference to the author's stored credential. */\n bindingId: string;\n /** The underlying platform account id (for display / ownership only). */\n connectedAccountId: string;\n /** Toolkit slug, e.g. 'gmail'. Kept as a plain string for core portability. */\n toolkit: string;\n /** Human label captured at bind time, e.g. \"you@ixo.world\". */\n label: string | null;\n}\n\nexport interface IntegrationsService {\n executeTool: (args: { toolSlug: string; connectedAccountId: string; arguments: Record<string, unknown> }) => Promise<IntegrationExecuteOutcome>;\n fetchCurrentState?: (args: { toolSlug: string; connectedAccountId: string; arguments: Record<string, unknown> }) => Promise<Record<string, unknown>>;\n getEntityDid?: () => string | undefined;\n /**\n * Execute a tool on the template author's behalf via an opaque, server-side\n * binding (delegated blocks). The runner never holds the author's\n * credential — `bindingId` selects it on the worker. Returns the same\n * outcome shape as `executeTool`.\n */\n executeBinding?: (args: { bindingId: string; toolSlug: string; arguments: Record<string, unknown> }) => Promise<IntegrationExecuteOutcome>;\n}\n\nexport interface OracleService {\n // Note: oracle handlers are single-network. The consumer-side handler\n // resolves the chain network and matrix homeserver from its own\n // DefaultChainNetwork — the editor never passes them in.\n generateWallet: () => Promise<{\n address: string;\n did: string;\n pubKey: string;\n mnemonic: string;\n }>;\n fundWallet: (params: { address: string; amount: number }) => Promise<{ transactionHash: string }>;\n createIidDocument: (params: { mnemonic: string; did: string; address: string; pubKey: string }) => Promise<{ did: string; transactionHash: string }>;\n registerMatrixAccount: (params: { mnemonic: string; address: string; did: string; pin: string; oracleName: string; avatarUrl?: string }) => Promise<{\n matrixUserId: string;\n matrixAccessToken: string;\n matrixRoomId: string;\n matrixDeviceId: string;\n matrixMnemonic: string;\n matrixPassword: string;\n matrixRecoveryPhrase: string;\n matrixHomeServerUrl: string;\n }>;\n createOracleEntity: (params: {\n mnemonic: string;\n address: string;\n did: string;\n pubKey: string;\n pin: string;\n matrixAccessToken: string;\n matrixRoomId: string;\n oracleName: string;\n orgName: string;\n description: string;\n location: string;\n logoUrl: string;\n coverImageUrl: string;\n apiUrl: string;\n price: number;\n llmModel: string;\n opening?: string;\n communicationStyle?: string;\n capabilities?: string;\n mcpConfig?: any;\n parentProtocol?: string;\n }) => Promise<{\n entityDid: string;\n transactionHash: string;\n /** Multibase-encoded P-256 public key registered as a keyAgreement vm on the oracle entity DID. */\n encryptionPublicKeyMultibase: string;\n /** DID verification method id of the P-256 keyAgreement key. */\n encryptionVerificationMethodId: string;\n }>;\n /**\n * Contract the oracle: ensure the user↔oracle Matrix DM room exists and\n * the user has joined it. Pure Matrix work — no chain calls, no key setup.\n * Returns the user↔oracle room id which downstream steps (storeSecrets,\n * storeConfig) write into.\n */\n contract: (params: { oracleEntityDid: string }) => Promise<{\n userOracleRoomId: string;\n userOracleRoomAlias: string;\n }>;\n provisionSandbox: (params: { entityDid: string; matrixRoomId: string }) => Promise<{ sandboxUrl: string; status: string }>;\n storeSecrets: (params: {\n matrixRoomId: string;\n publicKeyMultibase: string;\n verificationMethodId: string;\n // For fresh mxLogin → fresh MATRIX_ORACLE_ADMIN_ACCESS_TOKEN value\n matrixHomeServerUrl: string;\n matrixUsername: string;\n matrixPassword: string;\n // Plaintext secrets — handler JWE-encrypts to oracle pubkey before sending\n secrets: Record<string, string>;\n // Already JWE-encrypted secrets — handler writes them to the room as-is\n preEncryptedSecrets?: Record<string, string>;\n }) => Promise<{ storedSecrets: string[]; roomId: string; freshAccessToken?: string }>;\n /** JWE-encrypts a single plaintext value to the oracle's P-256 public key (multibase).\n * Used by storeSecrets FlowDetail to encrypt user-typed OpenRouter key at-rest. */\n encryptForOracle: (params: { plaintext: string; publicKeyMultibase: string }) => Promise<{ jwe: string }>;\n /** Reads `ixo.room.secret.index` state events from the matrix room and returns the\n * list of secret names already stored. Used for idempotency checks. */\n readStoredSecrets: (params: { matrixRoomId: string }) => Promise<{ secretNames: string[] }>;\n /** Returns the network-derived .env constants (RPC URL, matrix homeserver, etc.)\n * for the consumer's currently configured network. Used by the storeSecrets\n * FlowDetail's \"Additional Configuration\" display section, and merged into the\n * storeConfig state event by the consumer handler. Must be deterministic per network. */\n getNetworkConstants: (params: { oracleName: string }) => Promise<{\n constants: Record<string, string>;\n }>;\n validateMcpServer: (params: { url: string; authType?: 'bearer' | 'api-key' | 'none'; authToken?: string }) => Promise<{\n success: boolean;\n tools?: Array<{ name: string; description?: string }>;\n error?: string;\n }>;\n storeConfig: (params: {\n matrixRoomId: string;\n config: {\n oracleName: string;\n orgName: string;\n description: string;\n location: string;\n price: number;\n apiUrl: string;\n entityDid: string;\n logoUrl: string;\n llmModel: string;\n opening?: string;\n communicationStyle?: string;\n capabilities?: string;\n skills?: string[];\n mcpServers?: Array<{ name: string; url: string; description?: string; authEnvVar?: string }>;\n matrixUserId?: string;\n matrixAccountRoomId?: string;\n oracleAddress?: string;\n oracleDid?: string;\n };\n }) => Promise<{ configStored: boolean; roomId: string }>;\n deploySetup: (params: {\n name: string;\n config: Record<string, any>;\n roomId: string;\n secrets?: Record<string, string>;\n }) => Promise<{ setupComplete: boolean; stdout?: string; stderr?: string }>;\n deployStart: (params: { name: string; entityDid: string; roomId: string; secrets?: Record<string, string> }) => Promise<{ processId: string; status: string; url?: string }>;\n updateOracleDomain: (params: { entityDid: string; newApiUrl: string }) => Promise<{ transactionHash: string }>;\n}\n\n/**\n * Carbon credit batch service (IXO-2675). The editor declares the contract\n * only; the consumer app implements each method (run the owner/admin\n * reconciliation read, build + broadcast the harvest grant/exec pair and the\n * retire message, sign via its own wallet/SignX). Both writes are USER-signed\n * — the editor never signs on the user's behalf.\n */\nexport interface CarbonService {\n /**\n * Reconcile the user's owner-side and entity-admin-side batches into the\n * unified view. Pure read (no signing). Performs provenance recovery for\n * transferred batches so every `harvestableBatch` carries `entityDid` +\n * `adminAddress`. See technical doc §3–§4.\n */\n loadBatches: (params: { ownerAddress: string }) => Promise<{\n harvestableBatches: CarbonHarvestableBatch[];\n retireableBatches: CarbonRetireableBatch[];\n totalClaimable: number;\n totalAvailable: number;\n totalRetired: number;\n }>;\n /**\n * Harvest (claim) the given batches: per entity, grant the owner authz to\n * transfer out of the entity admin account, then exec that transfer into\n * the owner's wallet (ordered pairs, 30-min grant). User-signed. See §5.2.\n */\n harvest: (params: {\n ownerAddress: string;\n tokens: Array<{ id: string; entityDid: string; adminAddress: string; claimable: number }>;\n }) => Promise<{ transactionHash: string; harvestedBatchIds: string[]; harvestedAmount: number }>;\n /**\n * Retire (burn/offset) the given amounts from the owner's wallet. Single\n * owner-signed `MsgRetireToken`. Irreversible. `jurisdiction` arrives\n * pre-composed as a string (default \"Global\"); `reason` defaults to\n * \"offset\". See §5.1.\n */\n retire: (params: {\n owner: string;\n reason?: string;\n jurisdiction?: string;\n tokens: Array<{ id: string; amount: number }>;\n }) => Promise<{ transactionHash: string; retiredBatchIds: string[]; retiredAmount: number }>;\n}\n\n/**\n * Entity (domain) ownership service (IXO-2696). The editor declares the\n * contract only; the consumer app implements `transfer` — resolve a group\n * recipient to its DAO controller, ensure the recipient has an IID document,\n * build + broadcast `MsgTransferEntity`, and sign via its own wallet/SignX.\n * USER-signed and IRREVERSIBLE — the editor never signs on the user's behalf.\n */\nexport interface EntityService {\n /**\n * Transfer ownership of `entityDid` to `recipientDid`. The consumer resolves\n * a `did:ixo:entity:` group recipient to its `did:ixo:wasm:` controller\n * (reported back as `recipientResolved` when changed) and creates the\n * recipient's IID document first if it is missing (`createdRecipientIid`).\n * `ownerDid`/`ownerAddress` default to the connected user inside the host.\n * Proof of a real transfer is the returned `transactionHash`.\n */\n transfer: (params: {\n entityDid: string;\n recipientDid: string;\n ownerDid?: string;\n ownerAddress?: string;\n }) => Promise<{ transactionHash: string; recipientResolved?: string; createdRecipientIid?: boolean }>;\n}\n\n/**\n * KYC verification service (qi/kyc.verify). The editor declares the contract\n * only; the consumer app implements each method against its KYC server\n * (create/read the ComplyCube evaluation, mint the hosted verification URL,\n * persist the SD-JWT credential to the user's Matrix vault). The server's\n * status is the single source of truth for the lifecycle\n * (`verify → review → clear → issuing → issued → complete`, failure states\n * `rejected|attention|error`, plus `unknown`) — the editor only polls it.\n *\n * PII boundary: survey answers flow INTO `initiate` but never back out —\n * action outputs carry only `credentialCid`, `credentialType`, `protocolId`,\n * and `status`.\n */\nexport interface KycService {\n /**\n * Load the KYC protocol's details form + the user's current server-side\n * state. `credentialType` is the vault index key of the credential this\n * protocol issues (e.g. 'kycamllevel1' | 'kycamllevel2'); hosts default it\n * to level 1 when omitted — `hasExistingCredential` refers to THAT type\n * only, so a level-2 flow is never satisfied by a level-1 credential.\n */\n loadForm(params: { protocolDid: string; credentialType?: string }): Promise<{\n protocolId: string;\n claimCollectionId?: string;\n deedOfferId?: string;\n surveyJson: Record<string, unknown>;\n hasExistingCredential: boolean;\n /** Non-PII metadata of matching Vault credentials, oldest first. */\n existingCredentials?: Array<{ cid: string; credentialType: string; storedAt?: string; issuerDid?: string }>;\n status: string;\n }>;\n /** Submit the details form; the server creates the ComplyCube evaluation. */\n initiate(params: { protocolId: string; claimCollectionId?: string; deedOfferId?: string; data: Record<string, unknown> }): Promise<{ status: string }>;\n /** Mint the hosted-webview verification URL for the user's evaluation. */\n getVerificationUrl(params: { protocolId: string }): Promise<{ url: string }>;\n /** Read the current server-side lifecycle status. */\n getStatus(params: { protocolId: string }): Promise<{ status: string }>;\n /**\n * Save the issued SD-JWT credential to the user's Matrix vault room and\n * move the server status to `complete`. Idempotent — re-saving an\n * already-saved credential of the same `credentialType` returns the\n * existing CID (defaults to level 1 when omitted).\n */\n saveCredential(params: { protocolId: string; credentialType?: string; credentialCid?: string }): Promise<{ credentialCid: string; credentialType: string }>;\n}\n\nexport interface BlueprintService {\n execute(params: { action: string; inputs: Record<string, unknown>; actorDid: string; flowId: string; nodeId: string }): Promise<{\n receiptRef: string;\n result?: Record<string, unknown>;\n }>;\n}\n\nexport interface FlowRunLifecycleService {\n start(params: { actorDid: string; flowId: string; flowUri?: string; label?: string }): Promise<{ runId: string; eventId?: string; startedAt?: number }>;\n close(params: {\n actorDid: string;\n flowId: string;\n flowUri?: string;\n runId: string;\n allowIncomplete?: boolean;\n }): Promise<{ status: 'closed'; eventId?: string; closedAt?: number }>;\n cancel(params: { actorDid: string; flowId: string; flowUri?: string; runId: string; reason?: string }): Promise<{ status: 'cancelled'; eventId?: string; cancelledAt?: number }>;\n}\n\n/**\n * The full service contract an action execution context can carry. Composed\n * from the per-domain service interfaces above so consumers can implement and\n * type one domain at a time; the runtime shape is unchanged.\n */\nexport interface ActionServices {\n blueprint?: BlueprintService;\n /** Explicit session lifecycle capability supplied by browser/headless hosts. */\n flowRuns?: FlowRunLifecycleService;\n http?: HttpService;\n email?: EmailService;\n notify?: NotifyService;\n bid?: BidService;\n claim?: ClaimService;\n collection?: CollectionService;\n collectionUsers?: CollectionUsersService;\n matrix?: MatrixCredentialService;\n integrations?: IntegrationsService;\n oracle?: OracleService;\n carbon?: CarbonService;\n entity?: EntityService;\n kyc?: KycService;\n}\n\nexport interface OutputSchemaField {\n path: string;\n displayName: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n description?: string;\n /**\n * For `type === 'array'`: the shape of each element. Drives item-scoped\n * reference pickers (e.g. the Xero invoice LineItems iterative mapper,\n * where each cell refs into `{{item.<field>}}`).\n */\n itemSchema?: OutputSchemaField[];\n}\n\n/**\n * A typed event that an action can emit when it runs.\n *\n * Events drive the trigger/listener model: another block can declare a\n * `block.event` trigger on a (sourceBlockId, eventName) pair, and when this\n * action emits a matching event, a pending invocation is queued on the\n * listener block. See `docs/flow-engine/events-and-triggers-plan.md` for the full model.\n */\nexport interface ActionEventDefinition {\n /** Stable identifier — used in trigger declarations and ref strings. */\n name: string;\n /** Human-readable label shown in the trigger picker UI. */\n displayName: string;\n /** Short description shown as inline hint in the trigger picker. */\n description: string;\n /** Schema of the event payload. Same shape as `outputSchema`. */\n payloadSchema: OutputSchemaField[];\n /**\n * Field paths from `payloadSchema` (in order) shown inline in the\n * pending-invocation list so the assignee can distinguish queued\n * invocations at a glance. E.g. `['claimId', 'evaluatedAt']`.\n */\n pendingDisplayFields?: string[];\n}\n\n/**\n * Declares what counts as proof that this action's side effect actually\n * happened. Enforced centrally by `executeActionBlock`: a run that returns\n * success without satisfying its proof declaration is recorded as\n * `state: 'failed'` (code `PROOF_MISSING`), never as `completed`.\n *\n * - `{ fields }` — at least one of the listed output paths (dot notation\n * allowed) must be truthy. Empty arrays and `false` do not count.\n * - `{ validate }` — custom predicate over the raw output.\n * - `'none'` — explicit opt-out for actions with no side effect to prove\n * (pure selection/config actions). Must be stated, not omitted.\n */\nexport type ActionProofDeclaration = { fields: string[] } | { validate: (output: Record<string, unknown>) => boolean } | 'none';\n\nexport interface ActionRunContext {\n runId: string;\n flowId?: string;\n flowUri?: string;\n actorDid?: string;\n nodeId?: string;\n /** Read-only service capabilities available to `done.check`. */\n services?: ActionServices;\n now: number;\n}\n\nexport interface CompletionCheck {\n done: boolean | 'unknown';\n source: string;\n output?: Record<string, unknown>;\n reason?: string;\n}\n\n/**\n * Canonical completion semantics for one run of an action. Every registered\n * action declares one — see {@link ActionDefinition.done}.\n */\nexport interface ActionDoneContract<TInputs extends Record<string, any> = Record<string, any>> {\n /** Pure fold used by session summaries and the default close condition. */\n isDone: (actionState: FlowNodeRuntimeState, runContext: ActionRunContext) => boolean;\n /** Optional side-effect-free external read used by explicit reconciliation. */\n check?: (params: { inputs: TInputs; actionState: FlowNodeRuntimeState; ctx: ActionRunContext }) => Promise<CompletionCheck>;\n}\n\nexport interface ActionDefinition<TInputs extends Record<string, any> = Record<string, any>> {\n type: string;\n\n /** UCAN-style ability string used by the flow compiler, e.g., \"bid/submit\". */\n can?: string;\n\n // Policy\n sideEffect: boolean;\n defaultRequiresConfirmation: boolean;\n requiredCapability?: string;\n\n /**\n * Who performs the execution once inputs are complete.\n *\n * - 'agent' (the default) — a headless orchestrator may run `run()` itself\n * or delegate it to a capable oracle.\n * - 'human' — only a human surface (Portal FlowDetail) may execute: the\n * side effect needs an authority the orchestrator does not hold, e.g. a\n * chain transaction signed as the entity admin. Orchestrators still\n * gather inputs and notify the human, but must never run or delegate\n * the action themselves.\n */\n executionOwner?: 'agent' | 'human';\n\n /**\n * Hide this action from authoring surfaces (action-type pickers, step\n * palettes) so no new blocks of this type can be added. The action stays\n * registered: existing docs and templates keep rendering and executing.\n * Use for deprecated actions superseded by a newer type.\n */\n hiddenFromAuthoring?: boolean;\n\n /** Proof-of-execution declaration. See {@link ActionProofDeclaration}. */\n proof: ActionProofDeclaration;\n\n /**\n * How many times this action is meant to run within a single flow.\n *\n * - 'once' (the default) — a one-shot step that reaches a terminal\n * `completed` state and is then Done.\n * - 'many' — a standing, repeatable capability that can fire any number of\n * times on a cadence the flow (not the action) decides — e.g. submitting a\n * claim every month. A repeatable block never latches to a terminal Done:\n * a `completed` runtime entry means \"has fired at least once\", and its real\n * progress is the count of successful runs in the audit trail, not this\n * single summary entry. Such blocks never withhold the flow.\n */\n cardinality?: 'once' | 'many';\n\n /**\n * Canonical completion semantics for a run. Required: every action states\n * how one of its runs folds to Done, and `isActionDone` consults nothing\n * else. Most actions are Done when the run reached `completed` and use the\n * shared {@link doneWhenCompleted} contract; repeatable (`many`) actions use\n * {@link neverDone}. Declare a bespoke contract when Done-ness depends on an\n * output field, a quota, or an external system (see `qi/kyc.verify`).\n */\n done: ActionDoneContract<TInputs>;\n\n /**\n * How dynamic resolver results combine with the static `events` /\n * `outputSchema` baselines. 'merge' (the default) dedupes by event name /\n * field path with the dynamic entry winning; 'replace' hands the resolver\n * full control of the vocabulary (needed e.g. to hide the baseline until\n * configuration is complete).\n */\n dynamicResolutionMode?: 'merge' | 'replace';\n\n // Validation (optional, wire JSON Schema later)\n inputSchema?: object;\n\n /**\n * Machine-readable mirror of the required-input preamble in `run()`: given a\n * fully-merged inputs object, returns the names of inputs still missing or\n * blank (empty array = ready to execute). External orchestrators call this\n * via `getMissingActionInputs` BEFORE queuing execution so a missing input\n * becomes a prompt to a human rather than a failed run.\n *\n * Only define this when requiredness is conditional — it branches on other\n * inputs (skip flags, group types, either-of-two-fields) and therefore\n * cannot be derived from `inputSchema.required`, which is the default\n * derivation. Keep it directly above `run()` and keep the two in lockstep:\n * every presence throw in `run()` must be predicted here. Presence only —\n * value validity (ranges, formats, duplicates) stays in `run()`.\n */\n getMissingInputs?: (inputs: TInputs) => string[];\n\n /** Static output schema for action types with predictable output (e.g. email.send).\n * For action types with dynamic output (e.g. http.request), the schema is user-defined in inputs. */\n outputSchema?: OutputSchemaField[];\n\n /**\n * Typed vocabulary of events this action can emit. Drives the trigger\n * picker UI and compile-time validation of `block.event` triggers.\n */\n events?: ActionEventDefinition[];\n\n /**\n * Optional per-block event resolver. Called with the block's current\n * template inputs; returns the event vocabulary that applies to this\n * specific block.\n *\n * Use this when the event schema depends on configuration the designer\n * picks at template time. For example, `qi/claim.submit` only knows the\n * shape of `surveyAnswers` once a claim collection has been chosen —\n * returning `[]` until then hides the block from the trigger picker.\n *\n * Consumers (trigger picker, flow compiler, event payload picker) prefer\n * `getDynamicEvents(inputs)` when defined and fall back to static `events`\n * otherwise. By default the result is MERGED with the static `events`\n * baseline (deduped by name, dynamic wins). Set\n * `dynamicResolutionMode: 'replace'` when the resolver must control the\n * full vocabulary (e.g. returning [] to hide the baseline).\n */\n getDynamicEvents?: (inputs: TInputs) => ActionEventDefinition[];\n\n /**\n * Optional per-block output-schema resolver. Symmetric to `getDynamicEvents`\n * but for `outputSchema` — drives the reference picker for `${block.field}`\n * refs so survey-derived fields like `output.surveyAnswers.<question>` show\n * up alongside the static baseline.\n *\n * By default the returned array is MERGED with the static `outputSchema`\n * baseline (deduped by path, dynamic wins); `dynamicResolutionMode:\n * 'replace'` gives the resolver full control.\n */\n getDynamicOutputSchema?: (inputs: TInputs) => OutputSchemaField[];\n\n /**\n * Whether this action can be wired to a `block.event` trigger.\n * False (the default) for user-interaction-driven actions like forms,\n * claims, and evaluations — they always run as `manual`. True for actions\n * where it makes sense for an event to nudge a human assignee to invoke\n * them (email, http, notify).\n *\n * The trigger picker UI is hidden for blocks whose action type has this\n * set to false.\n */\n eligibleForEventTrigger?: boolean;\n\n // Execution\n run: (inputs: TInputs, ctx: ActionContext) => Promise<ActionResult>;\n}\n\n/**\n * Result returned by an action's `run()` function.\n *\n * The optional `events` array is the explicit emission surface — actions\n * declare which named events they're emitting on this particular run, with\n * the payload by value. The runtime persists these as part of the run record\n * and the reconciliation loop turns them into pending invocations on\n * subscribed listener blocks.\n */\nexport interface ActionResult {\n output: Record<string, any>;\n events?: Array<{ name: string; payload: Record<string, any> }>;\n completion?: {\n state?: 'completed' | 'awaiting_readback';\n readBack?: Record<string, any>;\n };\n}\n","import { registerAction } from '../../registry';\nimport type { ActionResult } from '../../types';\nimport { isGroupExecution, proposeGroupExecution, requireGroupExecutionParams } from '../_shared/groupExecution';\nimport { COLLECTION_CREATED_EVENT, COLLECTION_CREATED_EVENT_NAME, COLLECTION_LIFECYCLE_ACTION_TYPE, COLLECTION_LIFECYCLE_OUTPUT_SCHEMA } from './index';\nimport { CollectionStateEnum } from './types';\nimport type { CollectionCreateParams, CollectionIntentOptions, CollectionLifecycleRunInputs, CollectionState, CollectionWriteOperation, Payments } from './types';\n\n/**\n * Core `run()` for the single `qi/collection.lifecycle` block (IXO-2573 / IXO-2575).\n *\n * One action type, one runtime entry. `run()` dispatches on `inputs.operation`\n * and — per the architecture decision in IXO-2573 — `output` ALWAYS holds the\n * full latest on-chain `CollectionState`, never a per-operation delta. Every\n * write op therefore follows the same three steps:\n *\n * 1. broadcast its `Msg*` (via `ctx.services.collection.<method>`),\n * 2. re-fetch the full collection by id (`collection.get`),\n * 3. return that whole `CollectionState` as `output`.\n *\n * `refresh` is read-only: it skips step 1 (broadcasts nothing) and just reads\n * back state. It is the recovery primitive for the three moments `output` is\n * blank — loading an existing collection by id, recovering after a failed\n * write, and the in-flight window during an update.\n *\n * Proof guard (hard rule, see CLAUDE.md): a write op is only \"completed\" when\n * the service returned a `transactionHash` AND the follow-up `get` returned a\n * non-empty collection. `create` additionally asserts the chain assigned a\n * `collectionId`. A run that broadcasts but cannot read back state THROWS so the\n * executor writes `failed`; `refresh` then recovers the display. We never return\n * `output` without a resolved `collectionId`.\n */\n\n/** Coerce the optional numeric quota boundary string. `''`/undefined → absent. */\nfunction normalizeQuota(quota: string | undefined): string | undefined {\n if (quota === undefined || quota === null) return undefined;\n const trimmed = String(quota).trim();\n return trimmed === '' ? undefined : trimmed;\n}\n\n/**\n * Validate that a requested quota is acceptable for the collection's current\n * count. Mirrors the chain-side `ErrCollectionQuotaBelowCount`: `0` (unlimited)\n * is always allowed; otherwise the quota must be `>= count`.\n */\nfunction assertQuotaNotBelowCount(quota: string, count: string): void {\n if (quota === '0') return; // 0 = unlimited, always allowed.\n const quotaNum = Number(quota);\n const countNum = Number(count);\n if (!Number.isFinite(quotaNum) || quotaNum < 0) {\n throw new Error(`Invalid quota \"${quota}\". Quota must be a non-negative integer string (\"0\" = unlimited).`);\n }\n if (Number.isFinite(countNum) && quotaNum < countNum) {\n throw new Error(`Quota ${quota} is below the current submitted count ${count} (ErrCollectionQuotaBelowCount). Quota must be 0 (unlimited) or >= ${count}.`);\n }\n}\n\n/** Assert the fetched collection is non-empty (has a resolved collectionId). */\nfunction assertNonEmptyCollection(state: CollectionState | undefined | null, collectionId: string): asserts state is CollectionState {\n if (!state || !String(state.collectionId || '').trim()) {\n throw new Error(\n `Collection read-back returned empty state for collectionId \"${collectionId}\". Broadcast may have succeeded but chain state is not yet readable — retry via refresh.`\n );\n }\n}\n\nregisterAction<CollectionLifecycleRunInputs>({\n type: COLLECTION_LIFECYCLE_ACTION_TYPE,\n can: 'collection/lifecycle',\n sideEffect: true,\n // Chain transaction signed as the entity admin — only the human in the\n // Portal FlowDetail holds that authority. Orchestrators gather inputs and\n // hand off; they must not run or delegate this.\n executionOwner: 'human',\n // Dynamic resolvers predate merge-by-default and intentionally control\n // the full vocabulary (e.g. returning [] to hide the static baseline).\n dynamicResolutionMode: 'replace',\n proof: { fields: ['collectionId'] },\n done: {\n isDone: (state) => state.state === 'completed' && typeof state.output?.collectionId === 'string' && state.output.collectionId.length > 0,\n check: async ({ inputs, actionState, ctx }) => {\n const service = ctx.services?.collection;\n const collectionId = String(inputs.collectionId || actionState.output?.collectionId || '').trim();\n if (!service || !collectionId) {\n return {\n done: 'unknown',\n source: 'collection.chain',\n reason: !service ? 'Collection read service unavailable.' : 'No collection id is available for read-back.',\n };\n }\n try {\n const state = await service.get({ collectionId });\n assertNonEmptyCollection(state, collectionId);\n const operation = inputs.operation;\n let done = false;\n switch (operation) {\n case 'create':\n case 'refresh':\n done = true;\n break;\n case 'updateState':\n done = state.state === inputs.state;\n break;\n case 'updateDates':\n done = (inputs.startDate === undefined || state.startDate === inputs.startDate) && (inputs.endDate === undefined || state.endDate === inputs.endDate);\n break;\n case 'updateQuota':\n done = state.quota === normalizeQuota(inputs.quota);\n break;\n case 'updatePayments':\n done = JSON.stringify(state.payments || {}) === JSON.stringify(inputs.payments || {});\n break;\n case 'updateIntents':\n done = JSON.stringify(state.intents || {}) === JSON.stringify(inputs.intents || {});\n break;\n default:\n done = false;\n }\n return {\n done,\n source: 'collection.chain',\n ...(done ? { output: state as unknown as Record<string, unknown> } : {}),\n ...(!done ? { reason: `Collection state does not satisfy ${String(operation)}.` } : {}),\n };\n } catch (error) {\n return {\n done: 'unknown',\n source: 'collection.chain',\n reason: error instanceof Error ? error.message : 'Collection state could not be read.',\n };\n }\n },\n },\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n outputSchema: COLLECTION_LIFECYCLE_OUTPUT_SCHEMA,\n getDynamicOutputSchema: () => COLLECTION_LIFECYCLE_OUTPUT_SCHEMA,\n // Static vocabulary (used by the pending-invocation preview / compiler).\n events: [COLLECTION_CREATED_EVENT],\n // Only a CREATE entry point (no bound collectionId) can emit `created`, so a\n // manage-mode block bound to an existing collection is hidden from the\n // trigger picker as a source (IXO-2595).\n getDynamicEvents: (inputs) => (String(inputs?.collectionId || '').trim() ? [] : [COLLECTION_CREATED_EVENT]),\n inputSchema: {\n type: 'object',\n required: ['operation'],\n properties: {\n operation: { type: 'string', description: 'Lifecycle op to dispatch: create | updateState | updateDates | updateQuota | updatePayments | updateIntents | refresh.' },\n collectionId: { type: 'string', description: 'Target collection id; required for every op except create.' },\n entity: { type: 'string', description: 'create — entity (deed) DID the collection belongs to.' },\n protocol: { type: 'string', description: 'create — protocol DID the collection follows (must be a bare did:).' },\n state: { type: 'number', description: 'create/updateState — lifecycle state (0=OPEN, 1=PAUSED, 2=CLOSED).' },\n startDate: { type: 'string', description: 'create/updateDates — ISO-8601 start date.' },\n endDate: { type: 'string', description: 'create/updateDates — ISO-8601 end date.' },\n quota: { type: 'string', description: 'create/updateQuota — max claims; \"0\" = unlimited.' },\n payments: { type: 'object', description: 'create/updatePayments — payment legs.' },\n intents: { type: 'object', description: 'create/updateIntents — intent configuration.' },\n },\n },\n // Mirrors run()'s throw-preamble: `operation` selects the branch, `create`\n // needs the entity + protocol DIDs, and every other op targets an existing\n // collection so it needs `collectionId`. Per-op value validity (state enum,\n // quota vs count, at-least-one-date) stays with run().\n getMissingInputs: (inputs) => {\n const operation = String(inputs?.operation || '').trim();\n if (!operation) return ['operation'];\n if (operation === 'create') {\n const missing: string[] = [];\n if (!String(inputs?.entity || '').trim()) missing.push('entity');\n if (!String(inputs?.protocol || '').trim()) missing.push('protocol');\n return missing;\n }\n return String(inputs?.collectionId || '').trim() ? [] : ['collectionId'];\n },\n run: async (inputs, ctx): Promise<ActionResult> => {\n const service = ctx.services.collection;\n if (!service) {\n throw new Error('collection service not configured (ctx.services.collection is undefined)');\n }\n\n const operation = inputs.operation;\n if (!operation) {\n throw new Error('operation is required (create | updateState | updateDates | updateQuota | updatePayments | updateIntents | refresh)');\n }\n\n // ---- create: broadcast MsgCreateCollection, then read back full state ----\n if (operation === 'create') {\n const entity = String(inputs.entity || '').trim();\n const protocol = String(inputs.protocol || '').trim();\n if (!entity) throw new Error('create: entity is required');\n if (!protocol) throw new Error('create: protocol is required');\n // The protocol must be a bare DID. A non-DID value here is almost always\n // an unresolved claim-template reference (e.g. a creator-studio\n // `ref:<node>:did#<name>` placeholder) that slipped through the picker —\n // fail with a clear message instead of the chain's opaque DID-syntax error.\n if (!protocol.startsWith('did:') || protocol.includes('#')) {\n throw new Error(\n `create: protocol \"${protocol}\" is not a valid DID. The selected claim protocol did not resolve to a ledgered did:ixo: identifier (it may be an unresolved template reference). Re-pick the protocol from the entity's linked claims.`\n );\n }\n\n const quota = normalizeQuota(inputs.quota);\n\n // Consumer handler resolves the entity admin account + owner (gql.entity →\n // admin account + entity.owner) and fills each payment leg's `account`\n // with the resolved admin address — see impacts-x-webapp createCollection\n // reference. The editor only forwards the template configuration.\n const createParams: CollectionCreateParams = {\n entity,\n protocol,\n state: inputs.state,\n startDate: inputs.startDate,\n endDate: inputs.endDate,\n quota,\n payments: inputs.payments,\n intents: inputs.intents,\n };\n\n // ---- Act as the DAO POD: the MsgCreateCollection goes in the proposal.\n // The new collection id is only assigned when the proposal executes, so\n // the host snapshots the entity's existing collection ids at prepare\n // time and the finalize step diffs against the live list to resolve the\n // created one (`resolveGroupCreatedCollection`).\n if (isGroupExecution(inputs)) {\n const { coreAddress, title, description } = requireGroupExecutionParams(inputs);\n const groupHandlers = ctx.handlers as any;\n if (typeof groupHandlers?.prepareGroupCollectionLifecycle !== 'function') {\n throw new Error('Acting as a POD is not available: the host does not implement prepareGroupCollectionLifecycle');\n }\n const prepared = await groupHandlers.prepareGroupCollectionLifecycle({\n groupAddress: coreAddress,\n operation: 'create',\n params: createParams,\n });\n return proposeGroupExecution(ctx, {\n coreAddress,\n title,\n description,\n msgs: prepared.msgs || [],\n expectedOutput: { collectionId: '', entity, protocol, state: inputs.state, startDate: inputs.startDate, endDate: inputs.endDate, quota, transactionHash: '' },\n finalize: 'collection.create-resolve',\n finalizeParams: {\n entityDid: entity,\n protocolDid: protocol,\n priorCollectionIds: Array.isArray(prepared.priorCollectionIds) ? prepared.priorCollectionIds : [],\n },\n completionEvent: COLLECTION_CREATED_EVENT_NAME,\n });\n }\n\n const result = await service.create(createParams);\n const transactionHash = String(result?.transactionHash || '').trim();\n const collectionId = String(result?.collectionId || '').trim();\n\n // Proof guard: create must yield both a tx hash and a chain-assigned id.\n if (!transactionHash) {\n throw new Error('create: service returned no transactionHash. Collection was not created.');\n }\n if (!collectionId) {\n throw new Error('create: service returned no collectionId. Cannot read back collection state.');\n }\n\n const state = await service.get({ collectionId });\n assertNonEmptyCollection(state, collectionId);\n // Emit `created` so listener blocks (e.g. Manage Collection Users) are\n // queued for invocation bound to this new collection. The payload carries\n // the chain truth (`state.*`), falling back to the validated inputs.\n return {\n output: state,\n events: [\n {\n name: COLLECTION_CREATED_EVENT_NAME,\n payload: {\n collectionId: String(state.collectionId || collectionId),\n entity: String(state.entity || entity),\n protocol: String(state.protocol || protocol),\n transactionHash,\n },\n },\n ],\n };\n }\n\n // ---- refresh: read-only, broadcasts nothing ----\n if (operation === 'refresh') {\n const collectionId = String(inputs.collectionId || '').trim();\n if (!collectionId) throw new Error('refresh: collectionId is required');\n\n const state = await service.get({ collectionId });\n assertNonEmptyCollection(state, collectionId);\n return { output: state };\n }\n\n // ---- write updates: collectionId required; admin resolved from chain ----\n const writeOp: CollectionWriteOperation = operation;\n const collectionId = String(inputs.collectionId || '').trim();\n if (!collectionId) throw new Error(`${writeOp}: collectionId is required`);\n\n // Pre-fetch the current collection: this resolves the authoritative admin\n // address for the update and (for updateQuota) the current count used by the\n // quota validation. It also confirms the collection exists before we\n // broadcast a mutation against it.\n const current = await service.get({ collectionId });\n assertNonEmptyCollection(current, collectionId);\n\n const adminAddress = String(current.admin || '').trim();\n if (!adminAddress) {\n throw new Error(`${writeOp}: could not resolve admin address for collection \"${collectionId}\" (chain state has no admin). Cannot authorise the update.`);\n }\n\n // ---- Act as the DAO group: propose instead of broadcasting directly ----\n // The host builds the same MsgExec-wrapped update with the GROUP as the\n // authorized executor; once the proposal passes, the update lands and the\n // block completes via read-back with the refreshed collection state.\n // (`create` as a group is not supported yet — the new collection id is\n // only knowable after execution.)\n if (isGroupExecution(inputs)) {\n const { coreAddress, title, description } = requireGroupExecutionParams(inputs);\n const groupHandlers = ctx.handlers as any;\n if (typeof groupHandlers?.prepareGroupCollectionLifecycle !== 'function') {\n throw new Error('Acting as a POD is not available: the host does not implement prepareGroupCollectionLifecycle');\n }\n const prepared = await groupHandlers.prepareGroupCollectionLifecycle({\n groupAddress: coreAddress,\n operation: writeOp,\n params: { ...inputs, collectionId, adminAddress },\n });\n return proposeGroupExecution(ctx, {\n coreAddress,\n title,\n description,\n msgs: prepared.msgs || [],\n expectedOutput: { ...current, collectionId, transactionHash: '' },\n finalize: 'collection.refresh',\n finalizeParams: { collectionId },\n });\n }\n\n let transactionHash = '';\n\n switch (writeOp) {\n case 'updateState': {\n const state = inputs.state;\n if (state === undefined || state === null) {\n throw new Error('updateState: state is required (0=OPEN, 1=PAUSED, 2=CLOSED)');\n }\n if (!(state in CollectionStateEnum) || typeof state !== 'number') {\n throw new Error(`updateState: invalid state \"${String(state)}\". Expected 0 (OPEN), 1 (PAUSED) or 2 (CLOSED).`);\n }\n const res = await service.updateState({ collectionId, state: state as CollectionStateEnum, adminAddress });\n transactionHash = String(res?.transactionHash || '').trim();\n break;\n }\n\n case 'updateDates': {\n const startDate = inputs.startDate;\n const endDate = inputs.endDate;\n if (!startDate && !endDate) {\n throw new Error('updateDates: at least one of startDate or endDate is required');\n }\n const res = await service.updateDates({ collectionId, startDate, endDate, adminAddress });\n transactionHash = String(res?.transactionHash || '').trim();\n break;\n }\n\n case 'updateQuota': {\n const quota = normalizeQuota(inputs.quota);\n if (quota === undefined) {\n throw new Error('updateQuota: quota is required (\"0\" = unlimited)');\n }\n // Validate against the current submitted count before broadcasting.\n assertQuotaNotBelowCount(quota, String(current.count || '0'));\n const res = await service.updateQuota({ collectionId, quota, adminAddress });\n transactionHash = String(res?.transactionHash || '').trim();\n break;\n }\n\n case 'updatePayments': {\n const payments = inputs.payments as Payments | undefined;\n if (!payments || typeof payments !== 'object') {\n throw new Error('updatePayments: payments is required');\n }\n const res = await service.updatePayments({ collectionId, payments, adminAddress });\n transactionHash = String(res?.transactionHash || '').trim();\n break;\n }\n\n case 'updateIntents': {\n const intents = inputs.intents as CollectionIntentOptions | undefined;\n if (!intents || typeof intents !== 'object') {\n throw new Error('updateIntents: intents is required');\n }\n const res = await service.updateIntents({ collectionId, intents, adminAddress });\n transactionHash = String(res?.transactionHash || '').trim();\n break;\n }\n\n default: {\n // Exhaustiveness guard — unreachable if CollectionWriteOperation is honoured.\n const _exhaustive: never = writeOp;\n throw new Error(`Unsupported collection operation: ${String(_exhaustive)}`);\n }\n }\n\n // Proof guard: write ops must return a transactionHash.\n if (!transactionHash) {\n throw new Error(`${writeOp}: service returned no transactionHash. The update was not broadcast.`);\n }\n\n // Re-fetch the full latest on-chain state so `output` is canonical truth.\n const updated = await service.get({ collectionId });\n assertNonEmptyCollection(updated, collectionId);\n return { output: updated };\n },\n});\n","import type { OutputSchemaField } from '../../types';\n\n/**\n * Canonical action type for the single claim-collection user-management block\n * (IXO-2586). One block, one runtime entry; `run()` dispatches on the\n * `operation` input (add | revoke | list). Extends and is intended to replace\n * `qi/bid.evaluate` once tested.\n */\nexport const COLLECTION_USERS_ACTION_TYPE = 'qi/collection.users';\n\n/**\n * Output schema. The shape of `output` depends on the operation that last ran:\n * `add`/`revoke` write a `transactionHash` (the proof field); `list` writes a\n * `grantees` array. All fields are declared so the reference picker can target\n * any of them.\n */\nexport const COLLECTION_USERS_OUTPUT_SCHEMA: OutputSchemaField[] = [\n { path: 'transactionHash', displayName: 'Tx Hash', type: 'string', description: 'Broadcast transaction hash (add/revoke)' },\n { path: 'grantedCount', displayName: 'Granted Count', type: 'number', description: 'Number of grants broadcast (fan-out)' },\n { path: 'role', displayName: 'Role', type: 'string', description: 'submit or evaluate' },\n { path: 'collectionId', displayName: 'Collection ID', type: 'string', description: 'Target claim collection identifier' },\n { path: 'granteeAddress', displayName: 'Grantee Address', type: 'string', description: 'Address granted/revoked' },\n {\n path: 'grantees',\n displayName: 'Grantees',\n type: 'array',\n description: 'Grantees holding a constraint for the collection (list)',\n itemSchema: [\n { path: 'address', displayName: 'Address', type: 'string' },\n { path: 'role', displayName: 'Role', type: 'string' },\n { path: 'agentQuota', displayName: 'Agent Quota', type: 'string' },\n { path: 'intentDurationNs', displayName: 'Intent Duration (ns)', type: 'string' },\n ],\n },\n];\n\n// NOTE: The action is registered (with the real operation dispatcher `run()`)\n// in `./collectionUsers`. This module intentionally exports only the shared\n// constants (action type + output schema) that `./collectionUsers`, the\n// FlowDetail and the diff resolver import, so there is exactly one\n// `registerAction` call for `qi/collection.users`.\n","import { registerAction, neverDone } from '../../registry';\nimport { isGroupExecution, proposeGroupExecution, requireGroupExecutionParams } from '../_shared/groupExecution';\nimport type { ActionResult } from '../../types';\nimport { COLLECTION_USERS_ACTION_TYPE, COLLECTION_USERS_OUTPUT_SCHEMA } from './index';\nimport type { CollectionUserRole, CollectionUsersRunInputs } from './types';\n\n/**\n * Core `run()` for the single `qi/collection.users` block (IXO-2586).\n *\n * One action type, one runtime entry. `run()` dispatches on `inputs.operation`:\n *\n * - `add` → grant submit/evaluate authz for one collection to a grantee.\n * For `granteeKind === 'group-members'` the FlowDetail resolves\n * the group's members up front (via `enumerateMembers`) and the\n * dispatcher fans the grant out, one `grant(...)` per member.\n * - `revoke` → per-collection read-modify-write revoke (the consumer handler\n * reads live authz, drops the target constraint, and re-grants\n * the remainder in a single atomic tx — see IXO-2590).\n * - `list` → read-only; returns the grantees holding a constraint for the\n * target collection.\n *\n * Proof guard (hard rule, see CLAUDE.md): a write op is only \"completed\" when\n * the service returned a non-empty `transactionHash`; `list` is only complete\n * when it returns a (possibly empty) `grantees` array. A handler that returns\n * `{}` THROWS so the executor writes `failed`.\n */\n\nfunction normalizeRole(value: string | undefined): CollectionUserRole {\n const normalized = String(value || '')\n .trim()\n .toLowerCase();\n if (normalized === 'submit' || normalized === 'evaluate') return normalized;\n throw new Error('role must be either \"submit\" or \"evaluate\"');\n}\n\nregisterAction<CollectionUsersRunInputs>({\n type: COLLECTION_USERS_ACTION_TYPE,\n can: 'collection/users',\n sideEffect: true,\n // Authz grants signed by the entity admin — only the human in the Portal\n // FlowDetail holds that authority. Orchestrators gather inputs and hand\n // off; they must not run or delegate this.\n executionOwner: 'human',\n // Dynamic resolvers predate merge-by-default and intentionally control\n // the full vocabulary (e.g. returning [] to hide the static baseline).\n dynamicResolutionMode: 'replace',\n proof: { fields: ['transactionHash', 'collectionId'] },\n done: neverDone,\n // Repeatable: members are granted/revoked many times over the flow's life.\n // Never latches to a terminal Done. See cardinality.\n cardinality: 'many',\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n outputSchema: COLLECTION_USERS_OUTPUT_SCHEMA,\n getDynamicOutputSchema: () => COLLECTION_USERS_OUTPUT_SCHEMA,\n // Can be wired to a `block.event` trigger (IXO-2596) — e.g. listen for the\n // `created` event from a Claim Collection block and manage the new\n // collection's users. When invoked from a pending invocation, `collectionId`\n // arrives via the event payload (merged into inputs by name); the FlowDetail\n // resolves the entity admin account from the payload `entity` and passes it\n // as `adminAddress`.\n eligibleForEventTrigger: true,\n inputSchema: {\n type: 'object',\n required: ['operation', 'collectionId', 'adminAddress'],\n properties: {\n operation: { type: 'string', description: 'Which user-management operation to run: add | revoke | list.' },\n collectionId: { type: 'string', description: 'Target claim collection identifier.' },\n adminAddress: { type: 'string', description: 'Granter entity admin account address (the authz granter).' },\n role: { type: 'string', description: 'Which authorization to act on for add/revoke: submit or evaluate.' },\n deedDid: { type: 'string', description: 'Entity (deed) DID forwarded to the handler.' },\n granteeAddress: { type: 'string', description: 'The single grantee bech32 address for add/revoke.' },\n granteeDid: { type: 'string', description: 'Optional resolved grantee DID for display or audit.' },\n granteeKind: { type: 'string', description: 'How to treat the add grantee: user, group-account, or group-members.' },\n agentQuota: { type: 'string', description: 'Remaining agent quota for add; 0 means unlimited.' },\n maxAmount: { type: 'array', description: 'Per-claim max amount cap for the add evaluate role.' },\n intentDurationNs: { type: 'string', description: 'Intent duration in nanoseconds for add, carried as a string.' },\n members: { type: 'array', description: 'Resolved members to fan the grant out to when granteeKind is group-members.' },\n },\n },\n // Only the decision inputs are human-askable: `operation` selects the\n // branch and `collectionId` targets the collection (often filled by the\n // `created` event of an upstream collection.lifecycle block). adminAddress,\n // role and grantee fields are resolved by the host/FlowDetail, so a blank\n // there is not something to escalate to a human for.\n getMissingInputs: (inputs) => {\n const operation = String(inputs?.operation || '').trim();\n if (!operation) return ['operation'];\n return String(inputs?.collectionId || '').trim() ? [] : ['collectionId'];\n },\n run: async (inputs, ctx): Promise<ActionResult> => {\n const service = ctx.services.collectionUsers;\n if (!service) {\n throw new Error('collectionUsers service not configured (ctx.services.collectionUsers is undefined)');\n }\n\n const operation = inputs.operation;\n if (!operation) {\n throw new Error('operation is required (add | revoke | list)');\n }\n\n const collectionId = String(inputs.collectionId || '').trim();\n const adminAddress = String(inputs.adminAddress || '').trim();\n\n // ---- list: read-only; returns grantees for the collection ----------------\n if (operation === 'list') {\n if (!collectionId) throw new Error('list: collectionId is required');\n if (!adminAddress) throw new Error('list: adminAddress (entity admin account) is required');\n\n const result = await service.list({ granterAdminAddress: adminAddress, collectionId });\n const grantees = Array.isArray(result?.grantees) ? result.grantees : undefined;\n // Proof guard: list must return an array (empty is valid — no grantees yet).\n if (!grantees) {\n throw new Error('list: service returned no grantees array. Check the [collection:list] handler logs.');\n }\n return { output: { grantees, collectionId } };\n }\n\n // ---- shared validation for the two write ops ------------------------------\n if (!collectionId) throw new Error(`${operation}: collectionId is required`);\n if (!adminAddress) throw new Error(`${operation}: adminAddress (entity admin account) is required`);\n const role = normalizeRole(inputs.role);\n const deedDid = String(inputs.deedDid || '').trim() || undefined;\n\n // ---- Act as the DAO group: propose instead of broadcasting directly ------\n // The host builds the same MsgExec-wrapped grant/revoke with the GROUP as\n // the signer (the group must hold the entity owner's authorization). For\n // group-members adds, every member's grant goes into ONE proposal.\n if (isGroupExecution(inputs) && (operation === 'add' || operation === 'revoke')) {\n const { coreAddress, title, description } = requireGroupExecutionParams(inputs);\n const groupHandlers = ctx.handlers as any;\n if (typeof groupHandlers?.prepareGroupCollectionUserChange !== 'function') {\n throw new Error('Acting as a POD is not available: the host does not implement prepareGroupCollectionUserChange');\n }\n if (!deedDid) throw new Error(`${operation}: deedDid is required when acting as a POD`);\n\n const grantees: string[] = [];\n if (operation === 'add' && inputs.granteeKind === 'group-members') {\n const members = Array.isArray(inputs.members) ? inputs.members.filter((m) => !!String(m?.address || '').trim()) : [];\n if (members.length === 0) throw new Error('add (group-members): no members resolved to grant to.');\n grantees.push(...members.map((m) => String(m.address).trim()));\n } else {\n const granteeAddress = String(inputs.granteeAddress || '').trim();\n if (!granteeAddress) throw new Error(`${operation}: granteeAddress is required`);\n grantees.push(granteeAddress);\n }\n\n const msgs: Array<{ typeUrl: string; value: string }> = [];\n for (const granteeAddress of grantees) {\n const prepared = await groupHandlers.prepareGroupCollectionUserChange({\n groupAddress: coreAddress,\n operation,\n entityDid: deedDid,\n collectionId,\n adminAddress,\n role,\n granteeAddress,\n quota: inputs.agentQuota !== undefined && inputs.agentQuota !== null ? Number(inputs.agentQuota) : undefined,\n maxAmount: Array.isArray(inputs.maxAmount) ? inputs.maxAmount : undefined,\n });\n msgs.push(...(prepared.msgs || []));\n }\n\n return proposeGroupExecution(ctx, {\n coreAddress,\n title,\n description,\n msgs,\n expectedOutput: {\n transactionHash: '',\n transactionHashes: [],\n grantedCount: operation === 'add' ? grantees.length : 0,\n role,\n collectionId,\n granteeAddress: grantees.length === 1 ? grantees[0] : undefined,\n },\n });\n }\n\n // ---- revoke: per-collection read-modify-write -----------------------------\n if (operation === 'revoke') {\n const granteeAddress = String(inputs.granteeAddress || '').trim();\n if (!granteeAddress) throw new Error('revoke: granteeAddress is required');\n\n const result = await service.revoke({ granterAdminAddress: adminAddress, granteeAddress, collectionId, role });\n const transactionHash = String(result?.transactionHash || '').trim();\n if (!transactionHash) {\n throw new Error('revoke: service returned no transactionHash. The revoke was not broadcast.');\n }\n return { output: { transactionHash, role, collectionId, granteeAddress } };\n }\n\n // ---- add: grant one collection's authz; fan out for group-members ---------\n const granteeKind = inputs.granteeKind || 'user';\n const agentQuota = inputs.agentQuota !== undefined && inputs.agentQuota !== null ? String(inputs.agentQuota).trim() || undefined : undefined;\n const maxAmount = Array.isArray(inputs.maxAmount) ? inputs.maxAmount : undefined;\n const intentDurationNs = String(inputs.intentDurationNs || '').trim() || undefined;\n\n if (granteeKind === 'group-members') {\n const members = Array.isArray(inputs.members) ? inputs.members.filter((m) => !!String(m?.address || '').trim()) : [];\n if (members.length === 0) {\n throw new Error('add (group-members): no members resolved to grant to. Enumerate the group members before signing.');\n }\n\n const transactionHashes: string[] = [];\n for (const member of members) {\n const granteeAddress = String(member.address).trim();\n const res = await service.grant({ granterAdminAddress: adminAddress, granteeAddress, collectionId, role, agentQuota, maxAmount, intentDurationNs, deedDid });\n const hash = String(res?.transactionHash || '').trim();\n if (!hash) {\n throw new Error(`add (group-members): grant to ${granteeAddress} returned no transactionHash. ${transactionHashes.length} of ${members.length} grants completed.`);\n }\n transactionHashes.push(hash);\n }\n\n return {\n output: {\n transactionHash: transactionHashes[transactionHashes.length - 1],\n transactionHashes,\n grantedCount: transactionHashes.length,\n role,\n collectionId,\n },\n };\n }\n\n // Single grantee ('user' or a 'group-account' that can exercise the grant).\n const granteeAddress = String(inputs.granteeAddress || '').trim();\n if (!granteeAddress) throw new Error('add: granteeAddress is required');\n\n const result = await service.grant({ granterAdminAddress: adminAddress, granteeAddress, collectionId, role, agentQuota, maxAmount, intentDurationNs, deedDid });\n const transactionHash = String(result?.transactionHash || '').trim();\n if (!transactionHash) {\n throw new Error('add: service returned no transactionHash. The grant was not broadcast.');\n }\n\n return {\n output: {\n transactionHash,\n transactionHashes: [transactionHash],\n grantedCount: 1,\n role,\n collectionId,\n granteeAddress,\n },\n };\n },\n});\n","import type { OutputSchemaField } from '../../types';\n\n// ---------------------------------------------------------------------------\n// Shared output schemas for the carbon action types (IXO-2675).\n//\n// These drive the reference picker for `{{block.output.field}}` refs. The array\n// fields expose `itemSchema` so downstream blocks (harvest/retire) can pick the\n// per-batch fields, and so the harvest/retire FlowDetails can reference the\n// upstream `loadBatches` arrays.\n// ---------------------------------------------------------------------------\n\nconst HARVESTABLE_ITEM_SCHEMA: OutputSchemaField[] = [\n { path: 'id', displayName: 'Batch ID', type: 'string' },\n { path: 'entityDid', displayName: 'Entity DID', type: 'string' },\n { path: 'adminAddress', displayName: 'Admin Address', type: 'string' },\n { path: 'claimable', displayName: 'Claimable', type: 'number' },\n { path: 'alsoKnownAs', displayName: 'Entity Name', type: 'string' },\n];\n\nconst RETIREABLE_ITEM_SCHEMA: OutputSchemaField[] = [\n { path: 'id', displayName: 'Batch ID', type: 'string' },\n { path: 'amount', displayName: 'Amount', type: 'number' },\n { path: 'entityDid', displayName: 'Entity DID', type: 'string' },\n { path: 'alsoKnownAs', displayName: 'Entity Name', type: 'string' },\n];\n\n/** Output of `qi/carbon.loadBatches`. */\nexport const CARBON_LOAD_OUTPUT: OutputSchemaField[] = [\n { path: 'harvestableBatches', displayName: 'Harvestable Batches', type: 'array', itemSchema: HARVESTABLE_ITEM_SCHEMA, description: 'Batches with claimable credits' },\n { path: 'retireableBatches', displayName: 'Retireable Batches', type: 'array', itemSchema: RETIREABLE_ITEM_SCHEMA, description: 'Batches with credits available to retire' },\n { path: 'totalClaimable', displayName: 'Total Claimable', type: 'number', description: 'Sum of all claimable credits' },\n { path: 'totalAvailable', displayName: 'Total Available', type: 'number', description: 'Sum of all retireable credits' },\n { path: 'totalRetired', displayName: 'Total Retired', type: 'number', description: 'Sum of all retired credits' },\n];\n\n/** Output of `qi/carbon.harvest`. */\nexport const CARBON_HARVEST_OUTPUT: OutputSchemaField[] = [\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The harvest transaction hash' },\n {\n path: 'harvestedBatchIds',\n displayName: 'Harvested Batch IDs',\n type: 'array',\n itemSchema: [{ path: '', displayName: 'Batch ID', type: 'string' }],\n description: 'Ids of the harvested batches',\n },\n { path: 'harvestedAmount', displayName: 'Harvested Amount', type: 'number', description: 'Total credits harvested into the wallet' },\n];\n\n/** Output of `qi/carbon.retire`. */\nexport const CARBON_RETIRE_OUTPUT: OutputSchemaField[] = [\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The retire transaction hash' },\n {\n path: 'retiredBatchIds',\n displayName: 'Retired Batch IDs',\n type: 'array',\n itemSchema: [{ path: '', displayName: 'Batch ID', type: 'string' }],\n description: 'Ids of the retired batches',\n },\n { path: 'retiredAmount', displayName: 'Retired Amount', type: 'number', description: 'Total credits permanently retired' },\n { path: 'jurisdiction', displayName: 'Jurisdiction', type: 'string', description: 'Jurisdiction recorded on the retirement' },\n];\n","import { registerAction } from '../../registry';\nimport { CARBON_LOAD_OUTPUT } from './schemas';\n\n/**\n * qi/carbon.loadBatches — reconcile the user's owner-side and entity-admin-side\n * CARBON batches into the unified harvestable/retireable view (IXO-2675).\n *\n * Pure read (no side effect, no signing). The heavy lifting — the two-perspective\n * read, the owner-driven reconciliation, and provenance recovery for transferred\n * batches — lives in the consumer `carbon.loadBatches` handler. The editor only\n * validates the address and forwards the call; the returned payload becomes\n * `runtime.output` for downstream harvest/retire blocks to reference.\n */\nregisterAction({\n type: 'qi/carbon.loadBatches',\n can: 'carbon/load',\n sideEffect: false,\n proof: 'none',\n done: {\n isDone: (state) => state.state === 'completed',\n check: async ({ inputs, ctx }) => {\n if (!ctx.services?.carbon?.loadBatches || !inputs.ownerAddress) {\n return {\n done: 'unknown',\n source: 'carbon.chain',\n reason: 'Carbon read service or owner address is unavailable.',\n };\n }\n try {\n const output = await ctx.services.carbon.loadBatches({\n ownerAddress: inputs.ownerAddress,\n });\n return { done: true, source: 'carbon.chain', output };\n } catch (error) {\n return {\n done: 'unknown',\n source: 'carbon.chain',\n reason: error instanceof Error ? error.message : 'Carbon batches could not be read.',\n };\n }\n },\n },\n defaultRequiresConfirmation: false,\n inputSchema: {\n type: 'object',\n required: ['ownerAddress'],\n properties: {\n ownerAddress: { type: 'string', description: 'Wallet address whose owner-side and entity-admin-side CARBON batches are reconciled.' },\n },\n },\n outputSchema: CARBON_LOAD_OUTPUT,\n run: async (inputs, ctx) => {\n if (!ctx.services.carbon?.loadBatches) {\n throw new Error('carbon.loadBatches handler not available');\n }\n if (!inputs.ownerAddress) throw new Error('ownerAddress is required');\n\n const result = await ctx.services.carbon.loadBatches({\n ownerAddress: inputs.ownerAddress,\n });\n\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { CARBON_HARVEST_OUTPUT } from './schemas';\nimport type { CarbonHarvestRunInputs } from './types';\n\n/**\n * qi/carbon.harvest — claim (harvest) batches held on entity admin accounts the\n * user owns into the user's wallet (IXO-2675).\n *\n * User-signed. The consumer `carbon.harvest` handler builds the per-entity\n * authz-grant + exec-transfer pairs and signs them via the user's wallet; the\n * editor never signs on the user's behalf. Proof of a real harvest is the\n * returned `transactionHash` — we refuse to report success without it so the\n * FlowDetail's catch path writes `failed` instead of a stale `completed`.\n */\nregisterAction<CarbonHarvestRunInputs>({\n type: 'qi/carbon.harvest',\n can: 'carbon/harvest',\n sideEffect: true,\n proof: { fields: ['transactionHash'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n inputSchema: {\n type: 'object',\n required: ['ownerAddress', 'tokens'],\n properties: {\n ownerAddress: { type: 'string', description: 'Wallet address owning the entity admin accounts to harvest from.' },\n tokens: { type: 'array', description: 'Batches to harvest; each requires id, entityDid, adminAddress and a claimable amount > 0.' },\n },\n },\n outputSchema: CARBON_HARVEST_OUTPUT,\n run: async (inputs, ctx) => {\n if (!ctx.services.carbon?.harvest) {\n throw new Error('carbon.harvest handler not available');\n }\n if (!inputs.ownerAddress) throw new Error('ownerAddress is required');\n const tokens = Array.isArray(inputs.tokens) ? inputs.tokens : [];\n if (tokens.length === 0) throw new Error('No batches selected to harvest');\n for (const t of tokens) {\n if (!t.id) throw new Error('Each harvest token requires an id');\n if (!t.entityDid) throw new Error(`Batch ${t.id} is missing entityDid (cannot construct harvest)`);\n if (!t.adminAddress) throw new Error(`Batch ${t.id} is missing adminAddress (cannot construct harvest)`);\n if (!(Number(t.claimable) > 0)) throw new Error(`Batch ${t.id} has no claimable amount`);\n }\n\n const result = await ctx.services.carbon.harvest({\n ownerAddress: inputs.ownerAddress,\n tokens: tokens.map((t) => ({ id: t.id, entityDid: t.entityDid, adminAddress: t.adminAddress, claimable: Number(t.claimable) })),\n });\n\n if (!result?.transactionHash) {\n throw new Error('carbon.harvest returned no transaction hash. Check the [carbon:harvest] handler logs.');\n }\n\n return { output: result };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { CARBON_RETIRE_OUTPUT } from './schemas';\nimport type { CarbonRetireRunInputs } from './types';\n\n/**\n * qi/carbon.retire — retire (burn/offset) credits the user holds in their\n * wallet (IXO-2675).\n *\n * User-signed and IRREVERSIBLE. The consumer `carbon.retire` handler builds and\n * signs a single `MsgRetireToken`. Proof of a real retirement is the returned\n * `transactionHash`; we refuse to report success without it.\n */\nregisterAction<CarbonRetireRunInputs>({\n type: 'qi/carbon.retire',\n can: 'carbon/retire',\n sideEffect: true,\n proof: { fields: ['transactionHash'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n inputSchema: {\n type: 'object',\n required: ['owner', 'tokens'],\n properties: {\n owner: { type: 'string', description: 'Wallet address holding the credits to retire.' },\n tokens: { type: 'array', description: 'Batches to retire; each requires an id and an amount > 0.' },\n reason: { type: 'string', description: 'Retirement reason (defaults to \"offset\").' },\n jurisdiction: { type: 'string', description: 'Retirement jurisdiction (defaults to \"Global\").' },\n },\n },\n outputSchema: CARBON_RETIRE_OUTPUT,\n run: async (inputs, ctx) => {\n if (!ctx.services.carbon?.retire) {\n throw new Error('carbon.retire handler not available');\n }\n if (!inputs.owner) throw new Error('owner is required');\n const tokens = Array.isArray(inputs.tokens) ? inputs.tokens : [];\n if (tokens.length === 0) throw new Error('No batches selected to retire');\n for (const t of tokens) {\n if (!t.id) throw new Error('Each retire token requires an id');\n if (!(Number(t.amount) > 0)) throw new Error(`Batch ${t.id} has no amount to retire`);\n }\n\n const reason = inputs.reason || 'offset';\n const jurisdiction = inputs.jurisdiction || 'Global';\n\n const result = await ctx.services.carbon.retire({\n owner: inputs.owner,\n reason,\n jurisdiction,\n tokens: tokens.map((t) => ({ id: t.id, amount: Number(t.amount) })),\n });\n\n if (!result?.transactionHash) {\n throw new Error('carbon.retire returned no transaction hash. Check the [carbon:retire] handler logs.');\n }\n\n return { output: { ...result, jurisdiction } };\n },\n});\n","import type { OutputSchemaField } from '../../types';\n\n// ---------------------------------------------------------------------------\n// Output schema for qi/entity.transfer (IXO-2696).\n//\n// Drives the reference picker for `{{block.output.field}}` refs. `transactionHash`\n// is the proof field; `recipientResolved` / `createdRecipientIid` surface what\n// the host actually did (group→DAO resolution, recipient IID creation).\n// ---------------------------------------------------------------------------\n\nexport const ENTITY_TRANSFER_OUTPUT: OutputSchemaField[] = [\n { path: 'transactionHash', displayName: 'Transaction Hash', type: 'string', description: 'The entity transfer transaction hash' },\n { path: 'recipientDid', displayName: 'Recipient DID', type: 'string', description: 'The new owner DID the entity was transferred to' },\n {\n path: 'recipientResolved',\n displayName: 'Resolved Recipient',\n type: 'string',\n description: 'The resolved recipient when a group entity was mapped to its DAO controller',\n },\n {\n path: 'createdRecipientIid',\n displayName: 'Created Recipient IID',\n type: 'boolean',\n description: \"True when the host created the recipient's IID document before transferring\",\n },\n];\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { ENTITY_TRANSFER_OUTPUT } from './schemas';\nimport type { EntityTransferRunInputs } from './types';\n\n/**\n * qi/entity.transfer — transfer ownership of an entity (domain) to a new owner\n * (IXO-2696).\n *\n * User-signed and IRREVERSIBLE. The consumer `entity.transfer` handler resolves\n * a group recipient to its DAO controller, ensures the recipient has an IID\n * document, builds a single `MsgTransferEntity`, and signs it via the user's\n * wallet — the editor never signs on the user's behalf. Proof of a real transfer\n * is the returned `transactionHash`; we refuse to report success without it so\n * the FlowDetail's catch path writes `failed` instead of a stale `completed`.\n */\nregisterAction<EntityTransferRunInputs>({\n type: 'qi/entity.transfer',\n can: 'entity/transfer',\n sideEffect: true,\n proof: { fields: ['transactionHash'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n outputSchema: ENTITY_TRANSFER_OUTPUT,\n inputSchema: {\n type: 'object',\n required: ['entityDid', 'recipientDid'],\n properties: {\n entityDid: { type: 'string', description: 'Entity DID being transferred (did:ixo:entity:…).' },\n recipientDid: { type: 'string', description: 'New owner DID (user or did:ixo:wasm: controller).' },\n ownerDid: { type: 'string', description: 'Current owner DID; host defaults to the connected user when omitted.' },\n ownerAddress: { type: 'string', description: 'Current owner address; host defaults to the connected user when omitted.' },\n },\n },\n run: async (inputs, ctx) => {\n if (!ctx.services.entity?.transfer) {\n throw new Error('entity.transfer handler not available');\n }\n if (!inputs.entityDid) throw new Error('entityDid is required');\n if (!inputs.recipientDid) throw new Error('recipientDid is required');\n\n const result = await ctx.services.entity.transfer({\n entityDid: inputs.entityDid,\n recipientDid: inputs.recipientDid,\n ...(inputs.ownerDid ? { ownerDid: inputs.ownerDid } : {}),\n ...(inputs.ownerAddress ? { ownerAddress: inputs.ownerAddress } : {}),\n });\n\n if (!result?.transactionHash) {\n throw new Error('entity.transfer returned no transaction hash. Check the [entity:transfer] handler logs.');\n }\n\n return { output: { ...result, recipientDid: inputs.recipientDid } };\n },\n});\n","import { registerAction } from '../registry';\n\n/**\n * qi/kyc.verify — complete an identity (KYC) verification inside a flow.\n *\n * The KYC lifecycle is driven by an external KYC server that the editor never\n * calls directly — the host exposes it through the `kyc` service group\n * (`kycLoadForm` / `kycInitiate` / `kycGetVerificationUrl` / `kycGetStatus` /\n * `kycSaveCredential` handlers). The server's status is the single source of\n * truth: `verify → review → clear → issuing → issued → complete`, failure\n * states `rejected|attention|error`, plus `unknown`.\n *\n * Everything BEFORE the final save (form load, initiate, hosted-webview open,\n * 15s status polling) is done by the FlowDetail calling the host handlers\n * directly — the same handler-direct pattern the payment action uses. This\n * `run()` executes ONCE, at the final save step: it re-checks the server\n * status, refuses to complete unless the credential is `issued` (or already\n * `complete`), then saves the SD-JWT credential to the user's Vault\n * (idempotent on the host side).\n *\n * PII boundary: the output carries NO personal data — only the credential CID\n * (the proof), credential type, protocol id, and terminal status.\n */\nregisterAction({\n type: 'qi/kyc.verify',\n can: 'kyc/verify',\n sideEffect: true,\n proof: { fields: ['credentialCid'] },\n done: {\n isDone: (state) => state.state === 'completed' && typeof state.output?.credentialCid === 'string' && state.output.credentialCid.length > 0,\n check: async ({ inputs, actionState, ctx }) => {\n const service = ctx.services?.kyc;\n const protocolDid = String(inputs.protocolDid || '').trim();\n if (!service || !protocolDid) {\n return {\n done: 'unknown',\n source: 'kyc.server',\n reason: 'KYC read service or protocol DID is unavailable.',\n };\n }\n try {\n const { status } = await service.getStatus({\n protocolId: protocolDid,\n });\n if (status !== 'issued' && status !== 'complete') {\n if (status === 'unknown') {\n return { done: 'unknown', source: 'kyc.server' };\n }\n return {\n done: false,\n source: 'kyc.server',\n reason: `KYC status is ${status}.`,\n };\n }\n let credentialCid = String(actionState.output?.credentialCid || inputs.credentialCid || '').trim();\n let credentialType = String(actionState.output?.credentialType || inputs.credentialType || 'kycamllevel1').trim();\n if (!credentialCid) {\n const form = await service.loadForm({\n protocolDid,\n credentialType,\n });\n const credential = form.existingCredentials?.find((entry) => entry.credentialType === credentialType);\n credentialCid = credential?.cid || '';\n credentialType = credential?.credentialType || credentialType;\n }\n if (!credentialCid) {\n return {\n done: false,\n source: 'kyc.server',\n reason: 'KYC is terminal but no matching credential is in the Vault.',\n };\n }\n return {\n done: true,\n source: 'kyc.server',\n output: {\n credentialCid,\n credentialType,\n protocolId: protocolDid,\n status: 'complete',\n },\n };\n } catch (error) {\n return {\n done: 'unknown',\n source: 'kyc.server',\n reason: error instanceof Error ? error.message : 'KYC status could not be read.',\n };\n }\n },\n },\n defaultRequiresConfirmation: false,\n cardinality: 'once',\n // Human-driven (details form + hosted webview) — never event-triggered,\n // same as the human input actions.\n eligibleForEventTrigger: false,\n inputSchema: {\n type: 'object',\n required: ['protocolDid'],\n properties: {\n protocolDid: { type: 'string', description: 'DID of the KYC protocol entity to verify against. The protocol determines the KYC level and check plan.' },\n credentialType: {\n type: 'string',\n description: \"Vault index key of the credential the protocol issues (e.g. 'kycamllevel1', 'kycamllevel2'). Defaults to level 1 when omitted.\",\n },\n credentialCid: {\n type: 'string',\n description: 'Runtime-selected CID of an existing Vault credential to use (set by the FlowDetail when the user picks one of several).',\n },\n },\n },\n outputSchema: [\n { path: 'credentialCid', displayName: 'Credential CID', type: 'string', description: 'CID of the SD-JWT credential saved to the Vault (proof of completion).' },\n { path: 'credentialType', displayName: 'Credential Type', type: 'string', description: 'Type of the issued credential.' },\n { path: 'protocolId', displayName: 'Protocol ID', type: 'string', description: 'The KYC protocol this verification ran against.' },\n { path: 'status', displayName: 'Status', type: 'string', description: \"Terminal lifecycle status — 'complete' once the credential is saved.\" },\n ],\n events: [\n {\n name: 'kyc.completed',\n displayName: 'KYC completed',\n description: 'Fires when the issued credential has been saved to the Vault and the verification is complete.',\n payloadSchema: [\n { path: 'credentialCid', displayName: 'Credential CID', type: 'string' },\n { path: 'credentialType', displayName: 'Credential Type', type: 'string' },\n { path: 'protocolId', displayName: 'Protocol ID', type: 'string' },\n { path: 'status', displayName: 'Status', type: 'string' },\n ],\n pendingDisplayFields: ['credentialType', 'status'],\n },\n ],\n run: async (inputs, ctx) => {\n if (!ctx.services.kyc) {\n throw new Error('kyc handlers not available');\n }\n if (!inputs.protocolDid) throw new Error('protocolDid is required');\n const credentialType = typeof inputs.credentialType === 'string' && inputs.credentialType.trim() ? inputs.credentialType.trim() : undefined;\n const credentialCid = typeof inputs.credentialCid === 'string' && inputs.credentialCid.trim() ? inputs.credentialCid.trim() : undefined;\n\n // Server status is the single source of truth — re-check it at save time\n // instead of trusting anything the UI polled earlier.\n const { status } = await ctx.services.kyc.getStatus({ protocolId: inputs.protocolDid });\n let eligible = status === 'issued' || status === 'complete';\n if (!eligible) {\n // The server archives evaluations after completion (and credentials can\n // be acquired via other apps), so an existing vault credential of the\n // expected type counts as complete even when the server has no live\n // evaluation.\n try {\n const form = await ctx.services.kyc.loadForm({ protocolDid: inputs.protocolDid, credentialType });\n eligible = !!form.hasExistingCredential;\n } catch (err) {\n console.warn('[kyc.verify] vault fallback check failed', err);\n }\n }\n if (!eligible) {\n throw new Error(`KYC verification not complete — current status: ${status}`);\n }\n\n // Idempotent on the host side: re-saving an already-saved credential of\n // this type returns the existing CID (safe for the \"already verified\"\n // path); `credentialCid` pins the user's selection when they hold several.\n const saved = await ctx.services.kyc.saveCredential({ protocolId: inputs.protocolDid, credentialType, credentialCid });\n if (!saved?.credentialCid) {\n throw new Error('kyc.saveCredential returned no credentialCid. Check the [kyc:saveCredential] handler logs.');\n }\n\n const output = {\n credentialCid: saved.credentialCid,\n credentialType: saved.credentialType,\n protocolId: inputs.protocolDid,\n status: 'complete',\n };\n\n return {\n output,\n events: [{ name: 'kyc.completed', payload: output }],\n };\n },\n});\n","/**\n * Shared plumbing for \"delegated integration\" action blocks (Gmail, Outlook,\n * Slack — and any future toolkit). These blocks run a third-party tool on the\n * TEMPLATE AUTHOR's connected account: the author connects once and binds it to\n * the template; any runner then executes it via an opaque, server-side binding,\n * never holding the author's credential.\n *\n * NB this is distinct from `qi/email.send`, which sends a pre-defined templated\n * email from the PLATFORM owner's address. Delegated blocks send free-form\n * messages from the author's OWN account.\n *\n * Schemas are hardcoded + typed per tool (see each tool's `*.types.ts`). Tool\n * fields are stored FLAT on the inputs object (not nested) so the flow engine's\n * top-level `{{block.output.field}}` reference resolution works on them, exactly\n * like the calendar block.\n */\n\nimport type { IntegrationToolSchema } from '@/mantine/context/BlocknoteContext';\nimport type { ActionContext } from '../../types';\nimport type { BoundConnection } from '../../types';\n\n/** Stored inputs: the bound connection + each tool field as a flat string. */\nexport type DelegatedToolInputs = {\n connection: BoundConnection | null;\n} & Record<string, unknown>;\n\nexport function parseBoundConnection(raw: unknown): BoundConnection | null {\n if (!raw || typeof raw !== 'object') return null;\n const c = raw as Record<string, unknown>;\n if (typeof c.bindingId !== 'string' || !c.bindingId) return null;\n if (typeof c.connectedAccountId !== 'string') return null;\n if (typeof c.toolkit !== 'string') return null;\n return {\n bindingId: c.bindingId,\n connectedAccountId: c.connectedAccountId,\n toolkit: c.toolkit,\n label: typeof c.label === 'string' ? c.label : null,\n };\n}\n\nexport function parseDelegatedToolInputs(raw: string | Record<string, unknown> | undefined): DelegatedToolInputs {\n let parsed: Record<string, unknown> = {};\n try {\n parsed = typeof raw === 'string' ? (JSON.parse(raw || '{}') as Record<string, unknown>) : raw || {};\n } catch {\n parsed = {};\n }\n return { ...parsed, connection: parseBoundConnection(parsed.connection) };\n}\n\nexport function serializeDelegatedToolInputs(inputs: DelegatedToolInputs): string {\n return JSON.stringify(inputs);\n}\n\n/** String value of a tool field on the inputs, or '' when unset. */\nexport function fieldValue(inputs: DelegatedToolInputs, name: string): string {\n const v = inputs[name];\n return typeof v === 'string' ? v : '';\n}\n\n/** A plain {field: stringValue} view of the inputs, excluding `connection`. */\nexport function fieldValues(inputs: DelegatedToolInputs): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(inputs)) {\n if (k === 'connection') continue;\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n}\n\n/** Required schema fields that are missing/blank in `values`. */\nexport function missingRequired(schema: IntegrationToolSchema, values: Record<string, string>): string[] {\n return (schema.parameters.required || []).filter((name) => !(values[name] ?? '').trim());\n}\n\n/**\n * `getMissingInputs` for a delegated tool action: the bound connection plus\n * the tool schema's own required fields. Mirrors executeDelegatedTool's gates\n * so orchestrators can ask for inputs before execution instead of hitting the\n * run-time throw.\n */\nexport function delegatedToolMissingInputs(schema: IntegrationToolSchema, rawInputs: Record<string, unknown>): string[] {\n const parsed = parseDelegatedToolInputs(rawInputs);\n const missing: string[] = [];\n if (!parsed.connection?.bindingId) missing.push('connection');\n missing.push(...missingRequired(schema, fieldValues(parsed)));\n return missing;\n}\n\n/**\n * Coerce the flat string field values into the typed `arguments` object the\n * underlying tool expects, driven by the hardcoded schema:\n * boolean → true/false, array → split on comma/newline, number → Number.\n * Empty values are omitted so the tool falls back to its own defaults.\n */\nexport function coerceToolArgs(schema: IntegrationToolSchema, values: Record<string, string>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [name, prop] of Object.entries(schema.parameters.properties || {})) {\n const raw = values[name];\n if (typeof raw !== 'string' || raw.trim() === '') continue;\n const type = prop.type;\n if (type === 'boolean') {\n out[name] = raw === 'true';\n } else if (type === 'array') {\n out[name] = raw\n .split(/[\\n,]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n } else if (type === 'number' || type === 'integer') {\n const n = Number(raw);\n if (!Number.isNaN(n)) out[name] = n;\n } else {\n out[name] = raw;\n }\n }\n return out;\n}\n\n/**\n * Execute a delegated tool via the runner's binding. Resolves to the tool's\n * `data` payload on success; throws a human-meaningful Error on failure (the\n * messages distinguish \"author must reconnect\" from \"binding removed\" so the\n * runner knows whether the fix is theirs or the author's).\n */\nexport async function executeDelegatedTool(\n ctx: ActionContext,\n opts: {\n connection: BoundConnection | null;\n schema: IntegrationToolSchema;\n toolSlug: string;\n values: Record<string, string>;\n toolkitLabel: string;\n }\n): Promise<Record<string, unknown>> {\n const svc = ctx.services.integrations;\n if (!svc?.executeBinding) {\n throw new Error(`${opts.toolkitLabel} integration is not configured.`);\n }\n const bindingId = opts.connection?.bindingId;\n if (!bindingId) {\n throw new Error(`No ${opts.toolkitLabel} account is bound. The template author must connect and bind ${opts.toolkitLabel}.`);\n }\n\n const missing = missingRequired(opts.schema, opts.values);\n if (missing.length > 0) {\n throw new Error(`Missing required field${missing.length === 1 ? '' : 's'}: ${missing.join(', ')}`);\n }\n\n const args = coerceToolArgs(opts.schema, opts.values);\n const result = await svc.executeBinding({ bindingId, toolSlug: opts.toolSlug, arguments: args });\n\n if (!result.successful) {\n if (result.code === 'AUTH_EXPIRED') {\n throw new Error(`The template author's ${opts.toolkitLabel} access expired — they need to reconnect it in the template.`);\n }\n if (result.code === 'UPSTREAM_4XX' && /not found|removed/i.test(result.error || '')) {\n throw new Error(`This ${opts.toolkitLabel} integration was removed by the template author.`);\n }\n throw new Error(result.error || `${opts.toolkitLabel} action failed.`);\n }\n\n return (result.data as Record<string, unknown>) ?? {};\n}\n","import type { IntegrationToolSchema } from '@/mantine/context/BlocknoteContext';\nimport type { OutputSchemaField } from '../../types';\n\n/**\n * Hardcoded, verified schema for Gmail's send-email tool (GMAIL_SEND_EMAIL).\n * Verified live against the Composio v3 tool schema on 2026-06-30. This is the\n * single source of truth: it drives the config form, the runner form, argument\n * coercion in run(), and the agent-facing action metadata. Field names mirror\n * the tool verbatim — no translation layer.\n *\n * Curated subset of the tool's parameters (the full tool also exposes\n * `attachment`, `extra_recipients`, etc. which we intentionally don't surface).\n */\n\nexport const GMAIL_SEND_SLUG = 'GMAIL_SEND_EMAIL';\nexport const GMAIL_SENT_EVENT = 'email.sent';\n\nexport const GMAIL_SEND_SCHEMA: IntegrationToolSchema = {\n slug: GMAIL_SEND_SLUG,\n name: 'Send Email',\n description: \"Send an email from the template author's Gmail account.\",\n parameters: {\n type: 'object',\n required: ['recipient_email', 'body'],\n properties: {\n recipient_email: { type: 'string', title: 'To', description: \"Recipient's email address.\" },\n subject: { type: 'string', title: 'Subject' },\n body: { type: 'string', title: 'Body', description: 'Email body. Plain text unless \"HTML body\" is set.' },\n cc: { type: 'array', title: 'Cc', description: 'Comma-separated email addresses.' },\n bcc: { type: 'array', title: 'Bcc', description: 'Comma-separated email addresses.' },\n is_html: { type: 'boolean', title: 'HTML body', description: 'Render the body as HTML.' },\n },\n },\n};\n\nexport const GMAIL_SEND_OUTPUT_SCHEMA: OutputSchemaField[] = [\n { path: 'messageId', displayName: 'Message ID', type: 'string', description: 'Gmail id of the sent message' },\n { path: 'threadId', displayName: 'Thread ID', type: 'string' },\n { path: 'sentAt', displayName: 'Sent At', type: 'string', description: 'ISO timestamp when sent' },\n];\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { delegatedToolMissingInputs, executeDelegatedTool, fieldValues, parseDelegatedToolInputs, type DelegatedToolInputs } from '../_shared/delegatedTool';\nimport { GMAIL_SEND_OUTPUT_SCHEMA, GMAIL_SEND_SCHEMA, GMAIL_SEND_SLUG, GMAIL_SENT_EVENT } from './emailSend.types';\n\n/**\n * Send an email from the TEMPLATE AUTHOR's connected Gmail account (delegated).\n * The author binds their account once; any runner sends as them via an opaque\n * server-side binding — runners never hold the credential.\n *\n * Distinct from `qi/email.send`, which sends a templated email from the\n * platform owner's address. This one is free-form, from the author's own inbox.\n */\nregisterAction<DelegatedToolInputs>({\n type: 'qi/gmail.email.send',\n can: 'gmail.email/send',\n sideEffect: true,\n // Proof of execution: Gmail returns the sent message id. Matches qi/email.send.\n proof: { fields: ['messageId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n // Can be wired to another block's event (e.g. form submitted → send email).\n eligibleForEventTrigger: true,\n\n // Mirrors executeDelegatedTool's gates: the bound connection plus the\n // tool schema's required fields, so orchestrators ask before run() throws.\n getMissingInputs: (inputs) => delegatedToolMissingInputs(GMAIL_SEND_SCHEMA, inputs),\n\n outputSchema: GMAIL_SEND_OUTPUT_SCHEMA,\n\n events: [\n {\n name: GMAIL_SENT_EVENT,\n displayName: 'Email sent',\n description: 'Fired after the email is sent from the author’s Gmail.',\n payloadSchema: [\n { path: 'messageId', displayName: 'Message ID', type: 'string' },\n { path: 'recipient_email', displayName: 'To', type: 'string' },\n ],\n pendingDisplayFields: ['messageId'],\n },\n ],\n\n run: async (inputs, ctx) => {\n const parsed = parseDelegatedToolInputs(inputs as unknown as Record<string, unknown>);\n const values = fieldValues(parsed);\n\n const data = await executeDelegatedTool(ctx, {\n connection: parsed.connection,\n schema: GMAIL_SEND_SCHEMA,\n toolSlug: GMAIL_SEND_SLUG,\n values,\n toolkitLabel: 'Gmail',\n });\n\n // Composio wraps tool output under data.response_data for most tools.\n const envelope = (data.response_data as Record<string, unknown>) ?? data;\n const messageId = String(envelope.id ?? envelope.messageId ?? '');\n const threadId = String(envelope.threadId ?? '');\n\n return {\n output: {\n messageId,\n threadId,\n sentAt: new Date().toISOString(),\n },\n events: messageId ? [{ name: GMAIL_SENT_EVENT, payload: { messageId, recipient_email: values.recipient_email ?? '' } }] : undefined,\n };\n },\n});\n","import type { IntegrationToolSchema } from '@/mantine/context/BlocknoteContext';\nimport type { OutputSchemaField } from '../../types';\n\n/**\n * Hardcoded, verified schema for Outlook's send-email tool\n * (OUTLOOK_OUTLOOK_SEND_EMAIL). Verified live against the Composio v3 tool\n * schema on 2026-06-30. Single source of truth for form + coercion + metadata.\n * Note the doubled `OUTLOOK_OUTLOOK_` prefix — that is the real Composio slug.\n */\n\nexport const OUTLOOK_SEND_SLUG = 'OUTLOOK_OUTLOOK_SEND_EMAIL';\nexport const OUTLOOK_SENT_EVENT = 'email.sent';\n\nexport const OUTLOOK_SEND_SCHEMA: IntegrationToolSchema = {\n slug: OUTLOOK_SEND_SLUG,\n name: 'Send Email',\n description: \"Send an email from the template author's Outlook account.\",\n parameters: {\n type: 'object',\n required: ['subject', 'body', 'to_email'],\n properties: {\n to_email: { type: 'string', title: 'To', description: \"Recipient's email address.\" },\n to_name: { type: 'string', title: 'To name', description: 'Optional display name for the recipient.' },\n subject: { type: 'string', title: 'Subject' },\n body: { type: 'string', title: 'Body', description: 'Email body. Plain text unless \"HTML body\" is set.' },\n cc_emails: { type: 'array', title: 'Cc', description: 'Comma-separated email addresses.' },\n bcc_emails: { type: 'array', title: 'Bcc', description: 'Comma-separated email addresses.' },\n is_html: { type: 'boolean', title: 'HTML body', description: 'Render the body as HTML.' },\n },\n },\n};\n\nexport const OUTLOOK_SEND_OUTPUT_SCHEMA: OutputSchemaField[] = [\n { path: 'messageId', displayName: 'Message ID', type: 'string' },\n { path: 'sentAt', displayName: 'Sent At', type: 'string', description: 'ISO timestamp when sent' },\n];\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { delegatedToolMissingInputs, executeDelegatedTool, fieldValues, parseDelegatedToolInputs, type DelegatedToolInputs } from '../_shared/delegatedTool';\nimport { OUTLOOK_SEND_OUTPUT_SCHEMA, OUTLOOK_SEND_SCHEMA, OUTLOOK_SEND_SLUG, OUTLOOK_SENT_EVENT } from './emailSend.types';\n\n/**\n * Send an email from the TEMPLATE AUTHOR's connected Outlook account (delegated).\n * The author binds their account once; any runner sends as them via an opaque\n * server-side binding — runners never hold the credential.\n *\n * Distinct from `qi/email.send`, which sends a templated email from the\n * platform owner's address. This one is free-form, from the author's own inbox.\n */\nregisterAction<DelegatedToolInputs>({\n type: 'qi/outlook.email.send',\n can: 'outlook.email/send',\n sideEffect: true,\n // Outlook's send tool often returns no message id (see run() below), so there\n // is no reliable output field to prove execution — a successful tool call\n // (run() throws on failure) is the signal. Declared 'none' rather than\n // requiring messageId, which would push every id-less send to needs_verification.\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n // Can be wired to another block's event (e.g. form submitted → send email).\n eligibleForEventTrigger: true,\n\n // Mirrors executeDelegatedTool's gates: the bound connection plus the\n // tool schema's required fields, so orchestrators ask before run() throws.\n getMissingInputs: (inputs) => delegatedToolMissingInputs(OUTLOOK_SEND_SCHEMA, inputs),\n\n outputSchema: OUTLOOK_SEND_OUTPUT_SCHEMA,\n\n events: [\n {\n name: OUTLOOK_SENT_EVENT,\n displayName: 'Email sent',\n description: 'Fired after the email is sent from the author’s Outlook.',\n payloadSchema: [\n { path: 'messageId', displayName: 'Message ID', type: 'string' },\n { path: 'to_email', displayName: 'To', type: 'string' },\n ],\n pendingDisplayFields: ['messageId'],\n },\n ],\n\n run: async (inputs, ctx) => {\n const parsed = parseDelegatedToolInputs(inputs as unknown as Record<string, unknown>);\n const values = fieldValues(parsed);\n\n const data = await executeDelegatedTool(ctx, {\n connection: parsed.connection,\n schema: OUTLOOK_SEND_SCHEMA,\n toolSlug: OUTLOOK_SEND_SLUG,\n values,\n toolkitLabel: 'Outlook',\n });\n\n // Composio wraps tool output under data.response_data for most tools.\n // Outlook's send tool may not return a message id; map defensively.\n const envelope = (data.response_data as Record<string, unknown>) ?? data;\n const messageId = String(envelope.id ?? envelope.messageId ?? '');\n\n return {\n output: {\n messageId,\n sentAt: new Date().toISOString(),\n },\n // Outlook often returns no id, so emit unconditionally.\n events: [{ name: OUTLOOK_SENT_EVENT, payload: { messageId, to_email: values.to_email ?? '' } }],\n };\n },\n});\n","import type { IntegrationToolSchema } from '@/mantine/context/BlocknoteContext';\nimport type { OutputSchemaField } from '../../types';\n\n/**\n * Hardcoded, verified schema for Slack's post-message tool\n * (SLACK_CHAT_POST_MESSAGE). Verified live against the Composio v3 tool schema\n * on 2026-06-30. This is the single source of truth: it drives the config form,\n * the runner form, argument coercion in run(), and the agent-facing action\n * metadata. Field names mirror the tool verbatim — no translation layer.\n */\n\nexport const SLACK_SEND_SLUG = 'SLACK_CHAT_POST_MESSAGE';\nexport const SLACK_SENT_EVENT = 'message.sent';\n\nexport const SLACK_SEND_SCHEMA: IntegrationToolSchema = {\n slug: SLACK_SEND_SLUG,\n name: 'Post Message',\n description: \"Post a message to a Slack channel from the template author's Slack account.\",\n parameters: {\n type: 'object',\n required: ['channel'],\n properties: {\n channel: { type: 'string', title: 'Channel', description: 'Channel ID or name, e.g. #general or C0123456.' },\n markdown_text: {\n type: 'string',\n title: 'Message',\n description: 'Message text in Slack markdown. Preferred over the deprecated plain text field.',\n },\n thread_ts: { type: 'string', title: 'Thread', description: 'Optional parent message timestamp to reply within a thread.' },\n },\n },\n};\n\nexport const SLACK_SEND_OUTPUT_SCHEMA: OutputSchemaField[] = [\n { path: 'messageTs', displayName: 'Message ts', type: 'string' },\n { path: 'channel', displayName: 'Channel', type: 'string' },\n { path: 'sentAt', displayName: 'Sent At', type: 'string', description: 'ISO timestamp when sent' },\n];\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { delegatedToolMissingInputs, executeDelegatedTool, fieldValues, parseDelegatedToolInputs, type DelegatedToolInputs } from '../_shared/delegatedTool';\nimport { SLACK_SEND_OUTPUT_SCHEMA, SLACK_SEND_SCHEMA, SLACK_SEND_SLUG, SLACK_SENT_EVENT } from './messageSend.types';\n\n/**\n * Post a message to Slack from the TEMPLATE AUTHOR's connected Slack account\n * (delegated). The author binds their account once; any runner posts as them\n * via an opaque server-side binding — runners never hold the credential.\n *\n * Distinct from `qi/email.send`, which sends a templated email from the\n * platform owner's address. This one is free-form, from the author's own\n * Slack workspace.\n */\nregisterAction<DelegatedToolInputs>({\n type: 'qi/slack.message.send',\n can: 'slack.message/send',\n sideEffect: true,\n // Proof of execution: Slack returns the posted message timestamp (ts).\n proof: { fields: ['messageTs'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n // Can be wired to another block's event (e.g. form submitted → post message).\n eligibleForEventTrigger: true,\n\n // Mirrors executeDelegatedTool's gates: the bound connection plus the\n // tool schema's required fields, so orchestrators ask before run() throws.\n getMissingInputs: (inputs) => delegatedToolMissingInputs(SLACK_SEND_SCHEMA, inputs),\n\n outputSchema: SLACK_SEND_OUTPUT_SCHEMA,\n\n events: [\n {\n name: SLACK_SENT_EVENT,\n displayName: 'Message posted',\n description: 'Fired after the message is posted to Slack.',\n payloadSchema: [\n { path: 'messageTs', displayName: 'Message ts', type: 'string' },\n { path: 'channel', displayName: 'Channel', type: 'string' },\n ],\n pendingDisplayFields: ['messageTs'],\n },\n ],\n\n run: async (inputs, ctx) => {\n const parsed = parseDelegatedToolInputs(inputs as unknown as Record<string, unknown>);\n const values = fieldValues(parsed);\n\n const data = await executeDelegatedTool(ctx, {\n connection: parsed.connection,\n schema: SLACK_SEND_SCHEMA,\n toolSlug: SLACK_SEND_SLUG,\n values,\n toolkitLabel: 'Slack',\n });\n\n // Composio wraps tool output under data.response_data for most tools.\n const envelope = (data.response_data as Record<string, unknown>) ?? data;\n const messageTs = String(envelope.ts ?? '');\n const channel = String(envelope.channel ?? values.channel ?? '');\n\n return {\n output: {\n messageTs,\n channel,\n sentAt: new Date().toISOString(),\n },\n events: messageTs ? [{ name: SLACK_SENT_EVENT, payload: { messageTs, channel } }] : undefined,\n };\n },\n});\n","import type { IntegrationToolSchema } from '@/mantine/context/BlocknoteContext';\nimport type { OutputSchemaField } from '../../types';\n\n/**\n * Hardcoded, verified schema for Google Calendar's create-event tool\n * (GOOGLECALENDAR_CREATE_EVENT). Verified live against the Composio v3 tool\n * schema on 2026-06-30. Single source of truth for form + coercion + metadata.\n *\n * This is the DELEGATED variant: the event is created on the template author's\n * connected calendar. (Distinct from the older self-connected\n * `qi/calendar.event.create`, where each runner connects their own calendar.)\n */\n\nexport const GOOGLECALENDAR_CREATE_SLUG = 'GOOGLECALENDAR_CREATE_EVENT';\nexport const GOOGLECALENDAR_CREATED_EVENT = 'event.created';\n\nexport const GOOGLECALENDAR_CREATE_SCHEMA: IntegrationToolSchema = {\n slug: GOOGLECALENDAR_CREATE_SLUG,\n name: 'Create Event',\n description: \"Create an event on the template author's Google Calendar.\",\n parameters: {\n type: 'object',\n required: ['start_datetime'],\n properties: {\n start_datetime: { type: 'string', title: 'Start time', description: 'ISO 8601, e.g. 2026-05-12T09:00:00.' },\n summary: { type: 'string', title: 'Title' },\n description: { type: 'string', title: 'Description' },\n location: { type: 'string', title: 'Location' },\n timezone: { type: 'string', title: 'Timezone', description: 'IANA name, e.g. Europe/London.' },\n attendees: { type: 'array', title: 'Attendees', description: 'Comma-separated email addresses.' },\n calendar_id: { type: 'string', title: 'Calendar', description: \"Use 'primary' for the author's main calendar.\" },\n event_duration_minutes: { type: 'number', title: 'Duration (minutes)', description: 'Defaults to the calendar default if blank.' },\n },\n },\n};\n\nexport const GOOGLECALENDAR_CREATE_OUTPUT_SCHEMA: OutputSchemaField[] = [\n { path: 'eventId', displayName: 'Event ID', type: 'string' },\n { path: 'htmlLink', displayName: 'Event link', type: 'string' },\n { path: 'summary', displayName: 'Summary', type: 'string' },\n { path: 'startIso', displayName: 'Start', type: 'string' },\n];\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { delegatedToolMissingInputs, executeDelegatedTool, fieldValues, parseDelegatedToolInputs, type DelegatedToolInputs } from '../_shared/delegatedTool';\nimport { GOOGLECALENDAR_CREATE_OUTPUT_SCHEMA, GOOGLECALENDAR_CREATE_SCHEMA, GOOGLECALENDAR_CREATE_SLUG, GOOGLECALENDAR_CREATED_EVENT } from './eventCreate.types';\n\n/**\n * Create an event on the TEMPLATE AUTHOR's connected Google Calendar\n * (delegated). The author binds their calendar once; any runner creates events\n * on it via an opaque server-side binding — runners never hold the credential.\n *\n * Distinct from `qi/calendar.event.create` (the older self-connected block,\n * where each runner connects their own calendar).\n */\nregisterAction<DelegatedToolInputs>({\n type: 'qi/googlecalendar.event.create',\n can: 'googlecalendar.event/create',\n sideEffect: true,\n // Proof of execution: the created event's id. Matches qi/calendar.event.create.\n proof: { fields: ['eventId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: true,\n\n // Mirrors executeDelegatedTool's gates: the bound connection plus the\n // tool schema's required fields, so orchestrators ask before run() throws.\n getMissingInputs: (inputs) => delegatedToolMissingInputs(GOOGLECALENDAR_CREATE_SCHEMA, inputs),\n\n outputSchema: GOOGLECALENDAR_CREATE_OUTPUT_SCHEMA,\n\n events: [\n {\n name: GOOGLECALENDAR_CREATED_EVENT,\n displayName: 'Calendar event created',\n description: 'Fired after the event is created on the author’s calendar.',\n payloadSchema: [\n { path: 'eventId', displayName: 'Event ID', type: 'string' },\n { path: 'htmlLink', displayName: 'Event link', type: 'string' },\n { path: 'summary', displayName: 'Summary', type: 'string' },\n ],\n pendingDisplayFields: ['summary', 'eventId'],\n },\n ],\n\n run: async (inputs, ctx) => {\n const parsed = parseDelegatedToolInputs(inputs as unknown as Record<string, unknown>);\n const values = fieldValues(parsed);\n\n const data = await executeDelegatedTool(ctx, {\n connection: parsed.connection,\n schema: GOOGLECALENDAR_CREATE_SCHEMA,\n toolSlug: GOOGLECALENDAR_CREATE_SLUG,\n values,\n toolkitLabel: 'Google Calendar',\n });\n\n const envelope = (data.response_data as Record<string, unknown>) ?? data;\n const eventId = String(envelope.id ?? '');\n const htmlLink = String(envelope.htmlLink ?? '');\n const summary = String(envelope.summary ?? values.summary ?? '');\n const start = envelope.start as Record<string, unknown> | undefined;\n const startIso = String(start?.dateTime ?? start?.date ?? values.start_datetime ?? '');\n\n return {\n output: { eventId, htmlLink, summary, startIso },\n events: eventId ? [{ name: GOOGLECALENDAR_CREATED_EVENT, payload: { eventId, htmlLink, summary } }] : undefined,\n };\n },\n});\n","import type { PinnedConnection } from '@/mantine/blocks/action/actionTypes/_shared/ConnectionSelector';\n\n/**\n * Template storage shape for `qi/calendar.event.create`.\n * Field names mirror the `GOOGLECALENDAR_CREATE_EVENT` schema verbatim — see\n * `docs/integrations-reference/tools/GOOGLECALENDAR_CREATE_EVENT.json`.\n * Do NOT introduce a translation layer (see integrations-plan.md §7).\n */\nexport interface CalendarEventCreateInputs {\n connection: PinnedConnection | null;\n calendar_id: string;\n summary: string;\n description: string;\n location: string;\n timezone: string;\n /** ISO 8601. Required by Composio. */\n start_datetime: string;\n /** ISO 8601. Optional; when empty, duration fields are used. */\n end_datetime: string;\n /** JSON array of email strings. Stored as string for DataInput compatibility. */\n attendees: string;\n send_updates: string;\n}\n\nconst EMPTY: CalendarEventCreateInputs = {\n connection: null,\n calendar_id: 'primary',\n summary: '',\n description: '',\n location: '',\n timezone: '',\n start_datetime: '',\n end_datetime: '',\n attendees: '',\n send_updates: '',\n};\n\nexport function parseCalendarEventCreateInputs(raw: string | Record<string, any> | undefined): CalendarEventCreateInputs {\n try {\n const parsed: any = typeof raw === 'string' ? JSON.parse(raw || '{}') : raw || {};\n const conn = parsed.connection;\n const connection: PinnedConnection | null =\n conn && typeof conn === 'object' && typeof conn.connectedAccountId === 'string' && typeof conn.entityDid === 'string'\n ? { connectedAccountId: conn.connectedAccountId, entityDid: conn.entityDid }\n : null;\n\n return {\n connection,\n calendar_id: typeof parsed.calendar_id === 'string' && parsed.calendar_id ? parsed.calendar_id : 'primary',\n summary: typeof parsed.summary === 'string' ? parsed.summary : '',\n description: typeof parsed.description === 'string' ? parsed.description : '',\n location: typeof parsed.location === 'string' ? parsed.location : '',\n timezone: typeof parsed.timezone === 'string' ? parsed.timezone : '',\n start_datetime: typeof parsed.start_datetime === 'string' ? parsed.start_datetime : '',\n end_datetime: typeof parsed.end_datetime === 'string' ? parsed.end_datetime : '',\n attendees: typeof parsed.attendees === 'string' ? parsed.attendees : Array.isArray(parsed.attendees) ? JSON.stringify(parsed.attendees) : '',\n send_updates: typeof parsed.send_updates === 'string' ? parsed.send_updates : '',\n };\n } catch {\n return { ...EMPTY };\n }\n}\n\nexport function serializeCalendarEventCreateInputs(inputs: CalendarEventCreateInputs): string {\n return JSON.stringify(inputs);\n}\n\n/**\n * Parse the `attendees` template field (may be a JSON array, newline-separated,\n * or comma-separated emails) into the shape Composio expects.\n */\nexport function parseAttendeesField(raw: string): Array<string> {\n const trimmed = (raw || '').trim();\n if (!trimmed) return [];\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.filter((v) => typeof v === 'string' && v.trim()).map((v) => v.trim());\n } catch {\n // fall through to split\n }\n }\n return trimmed\n .split(/[\\n,]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n}\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { parseAttendeesField, type CalendarEventCreateInputs } from './eventCreate.types';\n\nexport const CALENDAR_EVENT_CREATE_SLUG = 'GOOGLECALENDAR_CREATE_EVENT';\n\nregisterAction<CalendarEventCreateInputs>({\n type: 'qi/calendar.event.create',\n can: 'calendar.event/create',\n sideEffect: true,\n proof: { fields: ['eventId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: true,\n inputSchema: {\n type: 'object',\n required: ['connection', 'start_datetime'],\n properties: {\n connection: { type: 'object', description: 'Pinned Calendar connection with a connectedAccountId.' },\n start_datetime: { type: 'string', description: 'Event start time (ISO 8601).' },\n end_datetime: { type: 'string', description: 'Optional event end time (ISO 8601).' },\n calendar_id: { type: 'string', description: 'Calendar to write to; defaults to \"primary\".' },\n summary: { type: 'string', description: 'Optional event title.' },\n description: { type: 'string', description: 'Optional event description.' },\n location: { type: 'string', description: 'Optional event location.' },\n timezone: { type: 'string', description: 'Optional timezone for the event.' },\n send_updates: { type: 'string', description: 'Optional attendee-notification mode passed through to Calendar.' },\n attendees: { type: 'string', description: 'Optional attendees as a JSON array, newline-, or comma-separated emails.' },\n },\n },\n outputSchema: [\n { path: 'eventId', displayName: 'Event ID', type: 'string', description: 'Opaque identifier of the created event' },\n { path: 'htmlLink', displayName: 'Event link', type: 'string', description: 'Web UI link to the created event' },\n { path: 'summary', displayName: 'Summary', type: 'string' },\n { path: 'startIso', displayName: 'Start', type: 'string', description: 'Resolved start time (ISO 8601)' },\n { path: 'endIso', displayName: 'End', type: 'string', description: 'Resolved end time (ISO 8601)' },\n { path: 'hangoutLink', displayName: 'Meet link', type: 'string' },\n ],\n events: [\n {\n name: 'event.created',\n displayName: 'Calendar event created',\n description: 'Fired after a new event is written to Calendar',\n payloadSchema: [\n { path: 'eventId', displayName: 'Event ID', type: 'string' },\n { path: 'htmlLink', displayName: 'Event link', type: 'string' },\n { path: 'summary', displayName: 'Summary', type: 'string' },\n ],\n pendingDisplayFields: ['summary', 'eventId'],\n },\n ],\n run: async (inputs, ctx) => {\n const svc = ctx.services.integrations;\n if (!svc?.executeTool) {\n throw new Error('Calendar integration is not configured');\n }\n\n const connection = inputs.connection;\n if (!connection?.connectedAccountId) {\n throw new Error('Connect Calendar before running this action.');\n }\n\n // Entity-switch guard. See gotchas §2.\n const currentEntityDid = svc.getEntityDid?.();\n if (currentEntityDid && connection.entityDid && currentEntityDid !== connection.entityDid) {\n throw new Error('This block was configured for a different workspace. Reconnect Calendar to use it here.');\n }\n\n const start = (inputs.start_datetime || '').trim();\n if (!start) {\n throw new Error('Start time is required.');\n }\n\n const args: Record<string, unknown> = {\n start_datetime: start,\n calendar_id: (inputs.calendar_id || 'primary').trim() || 'primary',\n };\n\n const end = (inputs.end_datetime || '').trim();\n if (end) args.end_datetime = end;\n if (inputs.summary) args.summary = inputs.summary;\n if (inputs.description) args.description = inputs.description;\n if (inputs.location) args.location = inputs.location;\n if (inputs.timezone) args.timezone = inputs.timezone;\n if (inputs.send_updates) args.send_updates = inputs.send_updates;\n\n const attendees = parseAttendeesField(inputs.attendees || '');\n if (attendees.length > 0) args.attendees = attendees;\n\n const result = await svc.executeTool({\n toolSlug: CALENDAR_EVENT_CREATE_SLUG,\n connectedAccountId: connection.connectedAccountId,\n arguments: args,\n });\n\n if (!result.successful) {\n throw new Error(result.error || 'Calendar event creation failed');\n }\n\n // Composio wraps the tool response under `data.response_data`. See the tool\n // schema in docs/integrations-reference/tools/GOOGLECALENDAR_CREATE_EVENT.json.\n const envelope = result.data as any;\n const event = envelope?.response_data || envelope?.data?.response_data || envelope || {};\n\n const eventId = String(event.id || '');\n const htmlLink = String(event.htmlLink || envelope?.display_url || '');\n const summary = String(event.summary || inputs.summary || '');\n const startIso = String(event.start?.dateTime || event.start?.date || start);\n const endIso = String(event.end?.dateTime || event.end?.date || end || '');\n const hangoutLink = String(event.hangoutLink || '');\n\n return {\n output: {\n eventId,\n htmlLink,\n summary,\n startIso,\n endIso,\n hangoutLink,\n },\n events: eventId ? [{ name: 'event.created', payload: { eventId, htmlLink, summary } }] : undefined,\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport { parseAttendeesField } from './eventCreate.types';\nimport type { CalendarEventUpdateInputs } from './eventUpdate.types';\n\nexport const CALENDAR_EVENT_UPDATE_SLUG = 'GOOGLECALENDAR_UPDATE_EVENT';\nexport const CALENDAR_EVENT_GET_SLUG = 'GOOGLECALENDAR_EVENTS_GET';\n\nregisterAction<CalendarEventUpdateInputs>({\n type: 'qi/calendar.event.update',\n can: 'calendar.event/update',\n sideEffect: true,\n proof: { fields: ['eventId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: true,\n inputSchema: {\n type: 'object',\n required: ['connection', 'event_id', 'start_datetime'],\n properties: {\n connection: { type: 'object', description: 'Pinned Calendar connection with a connectedAccountId.' },\n event_id: { type: 'string', description: 'Identifier of the existing event to update.' },\n start_datetime: { type: 'string', description: 'Event start time (ISO 8601).' },\n end_datetime: { type: 'string', description: 'Optional event end time (ISO 8601).' },\n calendar_id: { type: 'string', description: 'Calendar containing the event; defaults to \"primary\".' },\n summary: { type: 'string', description: 'Optional event title.' },\n description: { type: 'string', description: 'Optional event description.' },\n location: { type: 'string', description: 'Optional event location.' },\n timezone: { type: 'string', description: 'Optional timezone for the event.' },\n send_updates: { type: 'string', description: 'Optional attendee-notification mode passed through to Calendar.' },\n attendees: { type: 'string', description: 'Optional attendees as a JSON array, newline-, or comma-separated emails.' },\n },\n },\n outputSchema: [\n { path: 'eventId', displayName: 'Event ID', type: 'string' },\n { path: 'htmlLink', displayName: 'Event link', type: 'string' },\n { path: 'summary', displayName: 'Summary', type: 'string' },\n { path: 'startIso', displayName: 'Start', type: 'string' },\n { path: 'endIso', displayName: 'End', type: 'string' },\n ],\n events: [\n {\n name: 'event.updated',\n displayName: 'Calendar event updated',\n description: 'Fired after an existing event is replaced',\n payloadSchema: [\n { path: 'eventId', displayName: 'Event ID', type: 'string' },\n { path: 'htmlLink', displayName: 'Event link', type: 'string' },\n { path: 'summary', displayName: 'Summary', type: 'string' },\n ],\n pendingDisplayFields: ['summary', 'eventId'],\n },\n ],\n run: async (inputs, ctx) => {\n const svc = ctx.services.integrations;\n if (!svc?.executeTool) {\n throw new Error('Calendar integration is not configured');\n }\n\n const connection = inputs.connection;\n if (!connection?.connectedAccountId) {\n throw new Error('Connect Calendar before running this action.');\n }\n\n const currentEntityDid = svc.getEntityDid?.();\n if (currentEntityDid && connection.entityDid && currentEntityDid !== connection.entityDid) {\n throw new Error('This block was configured for a different workspace. Reconnect Calendar to use it here.');\n }\n\n const eventId = (inputs.event_id || '').trim();\n if (!eventId) {\n throw new Error('Event ID is required to update an event.');\n }\n const start = (inputs.start_datetime || '').trim();\n if (!start) {\n throw new Error('Start time is required.');\n }\n\n const args: Record<string, unknown> = {\n event_id: eventId,\n start_datetime: start,\n calendar_id: (inputs.calendar_id || 'primary').trim() || 'primary',\n };\n\n const end = (inputs.end_datetime || '').trim();\n if (end) args.end_datetime = end;\n if (inputs.summary) args.summary = inputs.summary;\n if (inputs.description) args.description = inputs.description;\n if (inputs.location) args.location = inputs.location;\n if (inputs.timezone) args.timezone = inputs.timezone;\n if (inputs.send_updates) args.send_updates = inputs.send_updates;\n\n const attendees = parseAttendeesField(inputs.attendees || '');\n if (attendees.length > 0) args.attendees = attendees;\n\n const result = await svc.executeTool({\n toolSlug: CALENDAR_EVENT_UPDATE_SLUG,\n connectedAccountId: connection.connectedAccountId,\n arguments: args,\n });\n\n if (!result.successful) {\n throw new Error(result.error || 'Calendar event update failed');\n }\n\n const envelope = result.data as any;\n const event = envelope?.response_data || envelope?.data?.response_data || envelope || {};\n\n const outId = String(event.id || eventId);\n const htmlLink = String(event.htmlLink || envelope?.display_url || '');\n const summary = String(event.summary || inputs.summary || '');\n const startIso = String(event.start?.dateTime || event.start?.date || start);\n const endIso = String(event.end?.dateTime || event.end?.date || end || '');\n\n return {\n output: {\n eventId: outId,\n htmlLink,\n summary,\n startIso,\n endIso,\n },\n events: [{ name: 'event.updated', payload: { eventId: outId, htmlLink, summary } }],\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport type { CalendarEventListInputs } from './eventList.types';\n\nexport const CALENDAR_EVENT_LIST_SLUG = 'GOOGLECALENDAR_EVENTS_LIST';\n\nregisterAction<CalendarEventListInputs>({\n type: 'qi/calendar.event.list',\n can: 'calendar.event/list',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: false,\n inputSchema: {\n type: 'object',\n required: ['connection'],\n properties: {\n connection: { type: 'object', description: 'Pinned Calendar connection with a connectedAccountId.' },\n calendarId: { type: 'string', description: 'Calendar to list from; defaults to \"primary\".' },\n q: { type: 'string', description: 'Optional free-text search query for events.' },\n timeMin: { type: 'string', description: 'Optional lower bound for event start time (ISO 8601).' },\n timeMax: { type: 'string', description: 'Optional upper bound for event start time (ISO 8601).' },\n timeZone: { type: 'string', description: 'Optional timezone for the returned times.' },\n orderBy: { type: 'string', description: 'Optional ordering of results (e.g. startTime).' },\n singleEvents: { type: 'boolean', description: 'Optional flag to expand recurring events into single instances.' },\n maxResults: { type: 'string', description: 'Optional maximum number of events to return (parsed as an integer).' },\n },\n },\n outputSchema: [\n { path: 'items', displayName: 'Events', type: 'array', description: 'Raw event objects as returned by Calendar' },\n { path: 'count', displayName: 'Count', type: 'number' },\n { path: 'firstId', displayName: 'First event ID', type: 'string' },\n { path: 'ids', displayName: 'Event IDs', type: 'array' },\n { path: 'nextPageToken', displayName: 'Next page token', type: 'string' },\n ],\n run: async (inputs, ctx) => {\n const svc = ctx.services.integrations;\n if (!svc?.executeTool) {\n throw new Error('Calendar integration is not configured');\n }\n\n const connection = inputs.connection;\n if (!connection?.connectedAccountId) {\n throw new Error('Connect Calendar before running this action.');\n }\n\n const currentEntityDid = svc.getEntityDid?.();\n if (currentEntityDid && connection.entityDid && currentEntityDid !== connection.entityDid) {\n throw new Error('This block was configured for a different workspace. Reconnect Calendar to use it here.');\n }\n\n const args: Record<string, unknown> = {\n calendarId: (inputs.calendarId || 'primary').trim() || 'primary',\n };\n if (inputs.q) args.q = inputs.q;\n if (inputs.timeMin) args.timeMin = inputs.timeMin;\n if (inputs.timeMax) args.timeMax = inputs.timeMax;\n if (inputs.timeZone) args.timeZone = inputs.timeZone;\n if (inputs.orderBy) args.orderBy = inputs.orderBy;\n if (typeof inputs.singleEvents === 'boolean') args.singleEvents = inputs.singleEvents;\n if (inputs.maxResults) {\n const n = Number.parseInt(inputs.maxResults, 10);\n if (Number.isFinite(n) && n > 0) args.maxResults = n;\n }\n\n const result = await svc.executeTool({\n toolSlug: CALENDAR_EVENT_LIST_SLUG,\n connectedAccountId: connection.connectedAccountId,\n arguments: args,\n });\n\n if (!result.successful) {\n throw new Error(result.error || 'Calendar list failed');\n }\n\n const envelope = result.data as any;\n const list = envelope?.items ? envelope : envelope?.data || envelope;\n const items: any[] = Array.isArray(list?.items) ? list.items : [];\n const ids = items.map((e) => String(e?.id || '')).filter(Boolean);\n\n return {\n output: {\n items,\n count: items.length,\n firstId: ids[0] ?? null,\n ids,\n nextPageToken: String(list?.nextPageToken || ''),\n },\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport type { XeroContactCreateInputs } from './contactCreate.types';\n\nexport const XERO_CREATE_CONTACT_SLUG = 'XERO_CREATE_CONTACT';\n\nregisterAction<XeroContactCreateInputs>({\n type: 'qi/xero.contact.create',\n can: 'xero.contact/create',\n sideEffect: true,\n proof: { fields: ['contactId'] },\n done: doneWhenCompleted,\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: true,\n inputSchema: {\n type: 'object',\n required: ['connection', 'Name'],\n properties: {\n connection: { type: 'object', description: 'Pinned Xero connection with connectedAccountId and entityDid.' },\n tenant_id: { type: 'string', description: 'Xero org identifier; empty uses the connection default.' },\n Name: { type: 'string', description: 'Contact display name.' },\n FirstName: { type: 'string', description: 'Contact first name.' },\n LastName: { type: 'string', description: 'Contact last name.' },\n EmailAddress: { type: 'string', description: 'Contact email address.' },\n phone_number: { type: 'string', description: 'Contact phone number.' },\n mobile_number: { type: 'string', description: 'Contact mobile number.' },\n Website: { type: 'string', description: 'Contact website URL.' },\n TaxNumber: { type: 'string', description: 'Contact tax number.' },\n AccountNumber: { type: 'string', description: 'Contact account number.' },\n DefaultCurrency: { type: 'string', description: 'Default currency code for the contact.' },\n BankAccountDetails: { type: 'string', description: 'Contact bank account details.' },\n IsCustomer: { type: 'boolean', description: 'Whether the contact is a customer.' },\n IsSupplier: { type: 'boolean', description: 'Whether the contact is a supplier.' },\n },\n },\n outputSchema: [\n { path: 'contactId', displayName: 'Contact ID', type: 'string' },\n { path: 'name', displayName: 'Name', type: 'string' },\n { path: 'emailAddress', displayName: 'Email', type: 'string' },\n ],\n events: [\n {\n name: 'contact.created',\n displayName: 'Xero contact created',\n description: 'Fired after a new Xero contact is written',\n payloadSchema: [\n { path: 'contactId', displayName: 'Contact ID', type: 'string' },\n { path: 'name', displayName: 'Name', type: 'string' },\n ],\n pendingDisplayFields: ['name', 'contactId'],\n },\n ],\n run: async (inputs, ctx) => {\n const svc = ctx.services.integrations;\n if (!svc?.executeTool) {\n throw new Error('Xero integration is not configured');\n }\n\n const connection = inputs.connection;\n if (!connection?.connectedAccountId) {\n throw new Error('Connect Xero before running this action.');\n }\n\n const currentEntityDid = svc.getEntityDid?.();\n if (currentEntityDid && connection.entityDid && currentEntityDid !== connection.entityDid) {\n throw new Error('This block was configured for a different workspace. Reconnect Xero to use it here.');\n }\n\n const name = (inputs.Name || '').trim();\n if (!name) throw new Error('Name is required.');\n\n const args: Record<string, unknown> = { Name: name };\n if (inputs.tenant_id) args.tenant_id = inputs.tenant_id;\n if (inputs.FirstName) args.FirstName = inputs.FirstName;\n if (inputs.LastName) args.LastName = inputs.LastName;\n if (inputs.EmailAddress) args.EmailAddress = inputs.EmailAddress;\n if (inputs.phone_number) args.phone_number = inputs.phone_number;\n if (inputs.mobile_number) args.mobile_number = inputs.mobile_number;\n if (inputs.Website) args.Website = inputs.Website;\n if (inputs.TaxNumber) args.TaxNumber = inputs.TaxNumber;\n if (inputs.AccountNumber) args.AccountNumber = inputs.AccountNumber;\n if (inputs.DefaultCurrency) args.DefaultCurrency = inputs.DefaultCurrency;\n if (inputs.BankAccountDetails) args.BankAccountDetails = inputs.BankAccountDetails;\n if (typeof inputs.IsCustomer === 'boolean') args.IsCustomer = inputs.IsCustomer;\n if (typeof inputs.IsSupplier === 'boolean') args.IsSupplier = inputs.IsSupplier;\n\n const result = await svc.executeTool({\n toolSlug: XERO_CREATE_CONTACT_SLUG,\n connectedAccountId: connection.connectedAccountId,\n arguments: args,\n });\n\n if (!result.successful) {\n throw new Error(result.error || 'Xero contact creation failed');\n }\n\n // Xero returns Contacts in a Contacts[] array. Grab the first.\n const envelope = result.data as any;\n const contact = envelope?.Contacts?.[0] || envelope?.data?.Contacts?.[0] || envelope?.contact || envelope || {};\n const contactId = String(contact.ContactID || contact.contactID || contact.id || '');\n\n return {\n output: {\n contactId,\n name: String(contact.Name || name),\n emailAddress: String(contact.EmailAddress || inputs.EmailAddress || ''),\n },\n events: contactId ? [{ name: 'contact.created', payload: { contactId, name: String(contact.Name || name) } }] : undefined,\n };\n },\n});\n","import { registerAction, neverDone } from '../../registry';\nimport type { XeroInvoiceCreateInputs } from './invoiceCreate.types';\n\nexport const XERO_CREATE_INVOICE_SLUG = 'XERO_CREATE_INVOICE';\n\n/**\n * Runtime shape passed to `run()`. The flow detail component resolves each\n * line-item cell (including `{{item.*}}` iterator refs) before calling the\n * action, so `run()` receives a final array of finalised line-item objects.\n */\nexport interface XeroInvoiceCreateRunInputs extends Omit<XeroInvoiceCreateInputs, 'LineItems'> {\n LineItems: Array<Record<string, unknown>>;\n}\n\nregisterAction<XeroInvoiceCreateRunInputs>({\n type: 'qi/xero.invoice.create',\n can: 'xero.invoice/create',\n sideEffect: true,\n proof: { fields: ['invoiceId'] },\n done: neverDone,\n // Repeatable: many invoices are created over the flow's life. Never latches\n // to a terminal Done. See cardinality.\n cardinality: 'many',\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: true,\n inputSchema: {\n type: 'object',\n required: ['connection', 'LineItems'],\n properties: {\n connection: { type: 'object', description: 'Pinned Xero connection with connectedAccountId and entityDid.' },\n tenant_id: { type: 'string', description: 'Xero org identifier; empty uses the connection default.' },\n Type: { type: 'string', description: \"Invoice type: 'ACCREC' (sale) or 'ACCPAY' (bill); defaults to ACCREC.\" },\n Status: { type: 'string', description: 'Invoice status (e.g. DRAFT, AUTHORISED).' },\n Date: { type: 'string', description: 'Invoice date.' },\n DueDate: { type: 'string', description: 'Invoice due date.' },\n ContactID: { type: 'string', description: 'Xero contact UUID; preferred over ContactName.' },\n ContactName: { type: 'string', description: 'Contact name fallback when ContactID is absent.' },\n Reference: { type: 'string', description: 'Invoice reference text.' },\n InvoiceNumber: { type: 'string', description: 'Invoice number.' },\n CurrencyCode: { type: 'string', description: 'Invoice currency code.' },\n LineItems: { type: 'array', description: 'Finalised array of invoice line-item objects.' },\n },\n },\n outputSchema: [\n { path: 'invoiceId', displayName: 'Invoice ID', type: 'string' },\n { path: 'invoiceNumber', displayName: 'Invoice number', type: 'string' },\n { path: 'total', displayName: 'Total', type: 'number' },\n { path: 'status', displayName: 'Status', type: 'string' },\n ],\n events: [\n {\n name: 'invoice.created',\n displayName: 'Xero invoice created',\n description: 'Fired after a new Xero invoice is written',\n payloadSchema: [\n { path: 'invoiceId', displayName: 'Invoice ID', type: 'string' },\n { path: 'invoiceNumber', displayName: 'Invoice number', type: 'string' },\n { path: 'total', displayName: 'Total', type: 'number' },\n ],\n pendingDisplayFields: ['invoiceNumber', 'total'],\n },\n ],\n run: async (inputs, ctx) => {\n const svc = ctx.services.integrations;\n if (!svc?.executeTool) {\n throw new Error('Xero integration is not configured');\n }\n\n const connection = inputs.connection;\n if (!connection?.connectedAccountId) {\n throw new Error('Connect Xero before running this action.');\n }\n\n const currentEntityDid = svc.getEntityDid?.();\n if (currentEntityDid && connection.entityDid && currentEntityDid !== connection.entityDid) {\n throw new Error('This block was configured for a different workspace. Reconnect Xero to use it here.');\n }\n\n const type = (inputs.Type || '').trim().toUpperCase() || 'ACCREC';\n if (type !== 'ACCREC' && type !== 'ACCPAY') {\n throw new Error('Invoice type must be ACCREC (sale) or ACCPAY (bill).');\n }\n\n if (!Array.isArray(inputs.LineItems) || inputs.LineItems.length === 0) {\n throw new Error('At least one line item is required.');\n }\n\n const args: Record<string, unknown> = {\n Type: type,\n LineItems: inputs.LineItems,\n };\n if (inputs.tenant_id) args.tenant_id = inputs.tenant_id;\n if (inputs.Status) args.Status = inputs.Status;\n if (inputs.Date) args.Date = inputs.Date;\n if (inputs.DueDate) args.DueDate = inputs.DueDate;\n if (inputs.ContactID) args.ContactID = inputs.ContactID;\n else if (inputs.ContactName) args.ContactName = inputs.ContactName;\n if (inputs.Reference) args.Reference = inputs.Reference;\n if (inputs.InvoiceNumber) args.InvoiceNumber = inputs.InvoiceNumber;\n if (inputs.CurrencyCode) args.CurrencyCode = inputs.CurrencyCode;\n\n const result = await svc.executeTool({\n toolSlug: XERO_CREATE_INVOICE_SLUG,\n connectedAccountId: connection.connectedAccountId,\n arguments: args,\n });\n\n if (!result.successful) {\n throw new Error(result.error || 'Xero invoice creation failed');\n }\n\n const envelope = result.data as any;\n const invoice = envelope?.Invoices?.[0] || envelope?.data?.Invoices?.[0] || envelope?.invoice || envelope || {};\n const invoiceId = String(invoice.InvoiceID || invoice.invoiceID || invoice.id || '');\n const invoiceNumber = String(invoice.InvoiceNumber || inputs.InvoiceNumber || '');\n const total = typeof invoice.Total === 'number' ? invoice.Total : Number(invoice.Total) || 0;\n const status = String(invoice.Status || inputs.Status || 'DRAFT');\n\n return {\n output: {\n invoiceId,\n invoiceNumber,\n total,\n status,\n },\n events: invoiceId ? [{ name: 'invoice.created', payload: { invoiceId, invoiceNumber, total } }] : undefined,\n };\n },\n});\n","import { registerAction, doneWhenCompleted } from '../../registry';\nimport type { XeroInvoiceListInputs } from './invoiceList.types';\n\nexport const XERO_LIST_INVOICES_SLUG = 'XERO_LIST_INVOICES';\n\nregisterAction<XeroInvoiceListInputs>({\n type: 'qi/xero.invoice.list',\n can: 'xero.invoice/list',\n sideEffect: false,\n proof: 'none',\n done: doneWhenCompleted,\n defaultRequiresConfirmation: false,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: false,\n inputSchema: {\n type: 'object',\n required: ['connection'],\n properties: {\n connection: { type: 'object', description: 'Pinned Xero connection with connectedAccountId and entityDid.' },\n tenantId: { type: 'string', description: 'Xero org identifier (camelCase for the list tool).' },\n page: { type: 'string', description: 'Page number; parsed to an integer >= 1.' },\n order: { type: 'string', description: 'Sort order expression.' },\n Statuses: { type: 'string', description: 'Filter by invoice statuses.' },\n ContactIDs: { type: 'string', description: 'Filter by contact IDs.' },\n InvoiceIDs: { type: 'string', description: 'Filter by invoice IDs.' },\n where: { type: 'string', description: 'Xero where-clause filter.' },\n createdByMyApp: { type: 'boolean', description: 'Limit to invoices created by this app.' },\n includeArchived: { type: 'boolean', description: 'Include archived invoices.' },\n },\n },\n outputSchema: [\n { path: 'items', displayName: 'Invoices', type: 'array' },\n { path: 'count', displayName: 'Count', type: 'number' },\n { path: 'firstId', displayName: 'First invoice ID', type: 'string' },\n { path: 'ids', displayName: 'Invoice IDs', type: 'array' },\n ],\n run: async (inputs, ctx) => {\n const svc = ctx.services.integrations;\n if (!svc?.executeTool) {\n throw new Error('Xero integration is not configured');\n }\n\n const connection = inputs.connection;\n if (!connection?.connectedAccountId) {\n throw new Error('Connect Xero before running this action.');\n }\n\n const currentEntityDid = svc.getEntityDid?.();\n if (currentEntityDid && connection.entityDid && currentEntityDid !== connection.entityDid) {\n throw new Error('This block was configured for a different workspace. Reconnect Xero to use it here.');\n }\n\n const args: Record<string, unknown> = {};\n if (inputs.tenantId) args.tenantId = inputs.tenantId;\n if (inputs.page) {\n const p = Number.parseInt(inputs.page, 10);\n if (Number.isFinite(p) && p >= 1) args.page = p;\n }\n if (inputs.order) args.order = inputs.order;\n if (inputs.Statuses) args.Statuses = inputs.Statuses;\n if (inputs.ContactIDs) args.ContactIDs = inputs.ContactIDs;\n if (inputs.InvoiceIDs) args.InvoiceIDs = inputs.InvoiceIDs;\n if (inputs.where) args.where = inputs.where;\n if (typeof inputs.createdByMyApp === 'boolean') args.createdByMyApp = inputs.createdByMyApp;\n if (typeof inputs.includeArchived === 'boolean') args.includeArchived = inputs.includeArchived;\n\n const result = await svc.executeTool({\n toolSlug: XERO_LIST_INVOICES_SLUG,\n connectedAccountId: connection.connectedAccountId,\n arguments: args,\n });\n\n if (!result.successful) {\n throw new Error(result.error || 'Xero invoice list failed');\n }\n\n const envelope = result.data as any;\n const list = envelope?.Invoices ? envelope : envelope?.data || envelope;\n const items: any[] = Array.isArray(list?.Invoices) ? list.Invoices : Array.isArray(list?.items) ? list.items : [];\n // Remap InvoiceID → id for downstream uniformity, keep PascalCase inside items untouched.\n const ids = items.map((i) => String(i?.InvoiceID || i?.id || '')).filter(Boolean);\n\n return {\n output: {\n items,\n count: items.length,\n firstId: ids[0] ?? null,\n ids,\n },\n };\n },\n});\n","import { registerAction, neverDone } from '../../registry';\nimport { readFlowXeroBinding } from './flowBinding';\nimport type { XeroPaymentCreateInputs } from './paymentCreate.types';\n\nexport const XERO_CREATE_PAYMENT_SLUG = 'XERO_CREATE_PAYMENT';\n\n/**\n * Runtime shape passed to `run()`. Same as the storage shape — the flow\n * detail component does the resolution + numeric coercion before calling.\n *\n * `AccountID` is not part of it: the bank account comes from the flow's Xero\n * binding. In-flight work items minted before the binding existed may still\n * carry one, so it is accepted as a fallback and nothing more.\n */\nexport interface XeroPaymentCreateRunInputs extends Omit<XeroPaymentCreateInputs, 'Amount' | 'CurrencyRate'> {\n Amount: number;\n CurrencyRate?: number;\n /** @deprecated Superseded by the flow's Xero binding; read only as a fallback. */\n AccountID?: string;\n}\n\nregisterAction<XeroPaymentCreateRunInputs>({\n type: 'qi/xero.payment.create',\n can: 'xero.payment/create',\n sideEffect: true,\n proof: { fields: ['paymentId'] },\n done: neverDone,\n // Repeatable: many payments are created over the flow's life. Never latches\n // to a terminal Done. See cardinality.\n cardinality: 'many',\n defaultRequiresConfirmation: true,\n requiredCapability: 'flow/block/execute',\n eligibleForEventTrigger: true,\n // The Xero account and the bank account it debits are not inputs: they come\n // from the flow's connection binding, which is in place before a session can\n // start. Only what varies per payment is asked for here.\n inputSchema: {\n type: 'object',\n required: ['InvoiceID', 'Amount'],\n properties: {\n tenant_id: { type: 'string', description: \"Xero org identifier; empty uses the flow binding's organisation.\" },\n InvoiceID: { type: 'string', description: 'UUID of the invoice being paid.' },\n Date: { type: 'string', description: 'Payment date (YYYY-MM-DD); defaults to today if blank.' },\n Amount: { type: 'number', description: 'Payment amount; must be a positive number.' },\n Reference: { type: 'string', description: 'Free-text reference, typically the on-chain tx hash.' },\n CurrencyRate: { type: 'number', description: 'Optional currency rate for multicurrency payments.' },\n },\n },\n outputSchema: [\n { path: 'paymentId', displayName: 'Payment ID', type: 'string' },\n { path: 'invoiceId', displayName: 'Invoice ID', type: 'string' },\n { path: 'amount', displayName: 'Amount', type: 'number' },\n { path: 'date', displayName: 'Date', type: 'string' },\n { path: 'reference', displayName: 'Reference', type: 'string' },\n { path: 'status', displayName: 'Status', type: 'string' },\n ],\n events: [\n {\n name: 'payment.created',\n displayName: 'Xero payment recorded',\n description: 'Fired after a payment is recorded against a Xero invoice — settles the bill in the books.',\n payloadSchema: [\n { path: 'paymentId', displayName: 'Payment ID', type: 'string' },\n { path: 'invoiceId', displayName: 'Invoice ID', type: 'string' },\n { path: 'amount', displayName: 'Amount', type: 'number' },\n { path: 'reference', displayName: 'Reference', type: 'string' },\n ],\n pendingDisplayFields: ['invoiceId', 'amount'],\n },\n ],\n run: async (inputs, ctx) => {\n const svc = ctx.services.integrations;\n if (!svc?.executeTool) {\n throw new Error('Xero integration is not configured');\n }\n\n const binding = readFlowXeroBinding(ctx.yDoc);\n if (!binding?.connectedAccountId) {\n throw new Error(\"Connect Xero in this flow's connections before running this action.\");\n }\n\n const currentEntityDid = svc.getEntityDid?.();\n if (currentEntityDid && binding.entityDid && currentEntityDid !== binding.entityDid) {\n throw new Error('This flow was connected in a different workspace. Reconnect Xero to use it here.');\n }\n\n const invoiceId = String(inputs.InvoiceID || '').trim();\n if (!invoiceId) {\n throw new Error('InvoiceID is required; work items usually supply it from invoice.create completion.');\n }\n // The flow binding is the source; a work item minted before the binding\n // existed may still carry its own account, and settles with it.\n const accountId = (binding.bankAccountId || '').trim() || String(inputs.AccountID || '').trim();\n if (!accountId) {\n throw new Error(\"Pick the bank account in this flow's Xero connection before running this action.\");\n }\n\n if (!Number.isFinite(inputs.Amount) || inputs.Amount <= 0) {\n throw new Error('Amount must be a positive number.');\n }\n\n const date = String(inputs.Date || '').trim() || new Date().toISOString().slice(0, 10);\n\n // Composio's XERO_CREATE_PAYMENT flattens what Xero's HTTP API nests:\n // top-level `InvoiceID` / `AccountID`, not `Invoice: { InvoiceID }` /\n // `Account: { AccountID }`. See integrations-reference rule: mirror\n // Composio's arg names verbatim.\n const args: Record<string, unknown> = {\n InvoiceID: invoiceId,\n AccountID: accountId,\n Date: date,\n Amount: inputs.Amount,\n };\n // A block-level org overrides the one on the flow binding; blank uses it.\n const tenantId = String(inputs.tenant_id || '').trim() || (binding.tenantId || '').trim();\n if (tenantId) args.tenant_id = tenantId;\n if (inputs.Reference) args.Reference = inputs.Reference;\n if (typeof inputs.CurrencyRate === 'number' && Number.isFinite(inputs.CurrencyRate)) {\n args.CurrencyRate = inputs.CurrencyRate;\n }\n\n const result = await svc.executeTool({\n toolSlug: XERO_CREATE_PAYMENT_SLUG,\n connectedAccountId: binding.connectedAccountId,\n arguments: args,\n });\n\n if (!result.successful) {\n throw new Error(result.error || 'Xero payment creation failed');\n }\n\n const envelope = result.data as any;\n const payment = envelope?.Payments?.[0] || envelope?.data?.Payments?.[0] || envelope?.payment || envelope || {};\n const paymentId = String(payment.PaymentID || payment.paymentID || payment.id || '');\n const amount = typeof payment.Amount === 'number' ? payment.Amount : Number(payment.Amount) || inputs.Amount;\n const status = String(payment.Status || 'AUTHORISED');\n const reference = String(payment.Reference || inputs.Reference || '');\n\n return {\n output: {\n paymentId,\n invoiceId,\n amount,\n date,\n reference,\n status,\n },\n events: paymentId ? [{ name: 'payment.created', payload: { paymentId, invoiceId, amount, reference } }] : undefined,\n };\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\nregisterDiffResolver('bid', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n if (!inputs.surveyStarted) return [];\n\n const collectionId = String(inputs.collectionId || '').trim();\n const role = String(inputs.role || '').trim();\n const roleLabel = role === 'evaluation_agent' || role === 'ea' ? 'Evaluator' : role ? 'Contributor' : 'Selected at runtime';\n\n return [\n {\n key: 'applicationStatus',\n label: 'Application Status',\n before: 'None',\n after: 'Pending',\n changeType: 'replace',\n severity: 'info',\n },\n {\n key: 'role',\n label: 'Role',\n before: 'None',\n after: roleLabel,\n changeType: role ? 'replace' : 'unchanged',\n },\n {\n key: 'collection',\n label: 'Collection',\n before: collectionId || 'Not configured',\n after: collectionId || 'Not configured',\n changeType: 'unchanged',\n },\n {\n key: 'surveyAnswers',\n label: 'Survey Answers',\n before: 'None',\n after: 'Submitted at runtime',\n changeType: 'replace',\n },\n ];\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\nconst USDC_DENOM = 'ibc/6BBE9BD4246F8E04948D5A4EEE7164B2630263B9EBB5E7DC5F0A46C62A2FF97B';\n// maxAmounts are carried in base/micro units (6 decimals) — see\n// EvaluateBidFlowDetail.buildMaxAmounts. Divide for human display in the diff.\nconst DECIMALS = 6;\n\nfunction formatCoin(coin: { denom: string; amount: string }): string {\n const denom = coin.denom === USDC_DENOM ? 'USDC' : coin.denom === 'uixo' ? 'IXO' : coin.denom;\n const rawAmount = Number(coin.amount);\n const displayAmount = Number.isFinite(rawAmount) ? String(rawAmount / Math.pow(10, DECIMALS)) : String(coin.amount);\n return `${displayAmount} ${denom}`;\n}\n\nregisterDiffResolver('evaluateBid', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const bidId = String(inputs.bidId || '').trim();\n if (!bidId) return [];\n\n const decision = String(inputs.decision || '')\n .trim()\n .toLowerCase();\n const role = String(inputs.role || '').trim();\n const collectionId = String(inputs.collectionId || '').trim();\n const applicantDid = String(inputs.applicantDid || '').trim();\n\n const roleLower = role.toLowerCase();\n const isEvaluator = roleLower === 'evaluation_agent' || roleLower === 'ea';\n const roleLabel = isEvaluator ? 'Evaluator' : roleLower === 'service_agent' || roleLower === 'sa' ? 'Contributor' : role || 'Unknown';\n\n const isApprove = decision === 'approve';\n const isReject = decision === 'reject';\n const decisionLabel = isApprove ? 'Approve' : isReject ? 'Reject' : 'Not selected';\n const afterStatus = isApprove ? 'Approved' : isReject ? 'Rejected' : 'Pending';\n\n const results: DiffResult[] = [\n {\n key: 'bidStatus',\n label: 'Bid Status',\n before: 'Pending',\n after: afterStatus,\n changeType: decision ? 'replace' : 'unchanged',\n severity: isReject ? 'warning' : 'info',\n },\n {\n key: 'decision',\n label: 'Decision',\n before: 'None',\n after: decisionLabel,\n changeType: decision ? 'replace' : 'unchanged',\n },\n {\n key: 'applicantRole',\n label: 'Applicant Role',\n before: roleLabel,\n after: roleLabel,\n changeType: 'unchanged',\n },\n {\n key: 'bidId',\n label: 'Bid ID',\n before: bidId || 'Not selected',\n after: bidId || 'Not selected',\n changeType: 'unchanged',\n },\n {\n key: 'collection',\n label: 'Collection',\n before: collectionId || 'Not configured',\n after: collectionId || 'Not configured',\n changeType: 'unchanged',\n },\n ];\n\n if (isEvaluator) {\n let amountsLabel = 'None';\n try {\n const parsed = typeof inputs.maxAmounts === 'string' ? JSON.parse(inputs.maxAmounts) : inputs.maxAmounts;\n if (Array.isArray(parsed) && parsed.length > 0) {\n amountsLabel = parsed.map((a: any) => formatCoin(a)).join(', ');\n }\n } catch {\n /* ignore */\n }\n\n results.push({\n key: 'maxAmounts',\n label: 'Max Amounts',\n before: 'None',\n after: amountsLabel,\n changeType: amountsLabel !== 'None' ? 'replace' : 'unchanged',\n });\n }\n\n if (isReject) {\n const reason = String(inputs.rejectReason || inputs.reason || '').trim();\n results.push({\n key: 'reason',\n label: 'Rejection Reason',\n before: 'None',\n after: reason || 'Not provided',\n changeType: reason ? 'replace' : 'unchanged',\n severity: 'warning',\n });\n }\n\n if (applicantDid) {\n results.push({\n key: 'applicant',\n label: 'Applicant',\n before: applicantDid,\n after: applicantDid,\n changeType: 'unchanged',\n });\n }\n\n return results;\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\nregisterDiffResolver('claim', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n if (!inputs.claimStarted) return [];\n\n const collectionId = String(inputs.collectionId || '').trim();\n const deedDid = String(inputs.deedDid || '').trim();\n\n return [\n {\n key: 'claimStatus',\n label: 'Claim Status',\n before: 'None',\n after: 'Pending',\n changeType: 'replace',\n severity: 'info',\n },\n {\n key: 'collection',\n label: 'Collection',\n before: collectionId || 'Not configured',\n after: collectionId || 'Not configured',\n changeType: 'unchanged',\n },\n {\n key: 'deed',\n label: 'Deed',\n before: deedDid || 'Not configured',\n after: deedDid || 'Not configured',\n changeType: 'unchanged',\n },\n {\n key: 'surveyAnswers',\n label: 'Survey Answers',\n before: 'None',\n after: 'Submitted at runtime',\n changeType: 'replace',\n },\n ];\n },\n});\n","export const numberFormatter = (num: number, digits: number) => {\n const lookup = [\n { value: 1, symbol: '' },\n { value: 1e3, symbol: 'k' },\n { value: 1e6, symbol: 'M' },\n { value: 1e9, symbol: 'G' },\n { value: 1e12, symbol: 'T' },\n { value: 1e15, symbol: 'P' },\n { value: 1e18, symbol: 'E' },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n const item = lookup\n .slice()\n .reverse()\n .find((lookupItem) => num >= lookupItem.value);\n return item ? (num / item.value).toFixed(digits).replace(rx, '$1') + item.symbol : '0';\n};\n\nexport const microAmountToAmount = (microAmount: number, microUnits: number = 6) => {\n const amount = (microAmount ?? 0) / Math.pow(10, microUnits);\n return amount;\n};\n\nexport function renderNumber(value: number | undefined): string {\n if (value === 0) return '0';\n if (!value) return '';\n\n const formattedValue = value.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 6 });\n\n return formattedValue;\n}\n\nexport interface AssetDenomUnit {\n denom: string;\n exponent: number;\n aliases: string[];\n}\n\nexport interface AssetPair {\n display: string;\n base: string;\n denomUnits: AssetDenomUnit[];\n}\n\n/**\n * Format a Coin for display without an assets list. Maps the well-known\n * IXO/USDC denoms to friendly labels and divides by 10^6 when the amount\n * is in micro-units. Falls back to `${amount} ${denom}` for unknown denoms.\n */\nexport const formatCoin = (coin: { denom: string; amount: string | number }): string => {\n const USDC_DENOM = 'ibc/6BBE9BD4246F8E04948D5A4EEE7164B2630263B9EBB5E7DC5F0A46C62A2FF97B';\n const DECIMALS = 6;\n const denom = coin.denom === USDC_DENOM ? 'USDC' : coin.denom === 'uixo' ? 'IXO' : coin.denom;\n const raw = Number(coin.amount);\n const display = raw >= Math.pow(10, DECIMALS) ? raw / Math.pow(10, DECIMALS) : raw;\n return `${display} ${denom}`;\n};\n\nexport const formatCoinAmount = (coin: { denom: string; amount: string }, assetsList: AssetPair[]): string => {\n const pair = assetsList.find((item) => item.display === coin.denom || item.base === coin.denom);\n\n if (!pair) {\n return `${coin.amount} ${coin.denom}`;\n }\n\n const exponent = pair.denomUnits.find((u) => u.denom === pair.display)?.exponent ?? 0;\n const amount = Number(coin.amount) / Math.pow(10, exponent);\n const displayDenom = pair.display.toUpperCase();\n\n return `${amount.toLocaleString(undefined, { maximumFractionDigits: 6 })} ${displayDenom}`;\n};\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\nimport { formatCoin } from '@/core/utils/numbers';\n\nregisterDiffResolver('evaluateClaim', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const claimId = String(inputs.claimId || '').trim();\n if (!claimId || inputs.alreadyEvaluated) return [];\n\n const decision = String(inputs.decision || '')\n .trim()\n .toLowerCase();\n const collectionId = String(inputs.collectionId || '').trim();\n const createUdid = Boolean(inputs.createUdid);\n\n const isApprove = decision === 'approve';\n const isReject = decision === 'reject';\n const isDispute = decision === 'dispute';\n const decisionLabel = isApprove ? 'Approve' : isReject ? 'Reject' : isDispute ? 'Dispute' : 'Not selected';\n const afterStatus = isApprove ? 'Approved' : isReject ? 'Rejected' : isDispute ? 'Disputed' : 'Pending';\n\n const results: DiffResult[] = [\n {\n key: 'claimStatus',\n label: 'Claim Status',\n before: 'Pending',\n after: afterStatus,\n changeType: decision ? 'replace' : 'unchanged',\n severity: isReject || isDispute ? 'warning' : 'info',\n },\n {\n key: 'decision',\n label: 'Decision',\n before: 'None',\n after: decisionLabel,\n changeType: decision ? 'replace' : 'unchanged',\n },\n {\n key: 'claimId',\n label: 'Claim ID',\n before: claimId || 'Not selected',\n after: claimId || 'Not selected',\n changeType: 'unchanged',\n },\n {\n key: 'collection',\n label: 'Collection',\n before: collectionId || 'Not configured',\n after: collectionId || 'Not configured',\n changeType: 'unchanged',\n },\n {\n key: 'udidProof',\n label: 'UDID Proof',\n before: 'None',\n after: createUdid ? 'Will be generated' : 'Skipped',\n changeType: createUdid ? 'replace' : 'unchanged',\n },\n ];\n\n // Show payment info if configured\n let amountsLabel = 'None';\n try {\n const raw = typeof inputs.amount === 'string' ? JSON.parse(inputs.amount) : inputs.amount;\n if (Array.isArray(raw) && raw.length > 0) {\n amountsLabel = raw.map((a: any) => formatCoin(a)).join(', ');\n } else if (raw && typeof raw === 'object' && raw.denom) {\n amountsLabel = formatCoin(raw);\n }\n } catch {\n /* ignore */\n }\n results.push({\n key: 'payment',\n label: 'Payment',\n before: 'None',\n after: amountsLabel,\n changeType: amountsLabel !== 'None' ? 'replace' : 'unchanged',\n });\n\n if (isDispute) {\n const reason = String(inputs.reason || '').trim();\n results.push({\n key: 'reason',\n label: 'Dispute Reason',\n before: 'None',\n after: reason || 'Not provided',\n changeType: reason ? 'replace' : 'unchanged',\n severity: reason ? 'warning' : 'info',\n });\n }\n\n // Show outcome status if template exists\n if (inputs.outcomeComplete !== undefined) {\n results.push({\n key: 'outcome',\n label: 'Outcome Template',\n before: 'None',\n after: inputs.outcomeComplete ? 'Completed' : 'Not completed',\n changeType: inputs.outcomeComplete ? 'replace' : 'unchanged',\n severity: inputs.outcomeComplete ? 'info' : 'warning',\n });\n }\n\n return results;\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\nimport { parseAttendeesField } from './eventCreate.types';\n\n/**\n * Diff resolver for `qi/calendar.event.create`.\n *\n * Create actions have no \"before\" state — every change is an `add`.\n * See integrations-plan.md §9 for the diff pattern.\n */\nregisterDiffResolver('qi/calendar.event.create', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const attendees = parseAttendeesField(String(inputs.attendees || ''));\n const calendarId = String(inputs.calendar_id || '').trim() || 'primary';\n\n const results: DiffResult[] = [\n {\n key: 'summary',\n label: 'Title',\n before: null,\n after: String(inputs.summary || '').trim() || '(no title)',\n changeType: 'add',\n },\n {\n key: 'start_datetime',\n label: 'Start',\n before: null,\n after: String(inputs.start_datetime || '').trim() || '(required — set start time)',\n changeType: 'add',\n },\n ];\n\n const end = String(inputs.end_datetime || '').trim();\n if (end) {\n results.push({\n key: 'end_datetime',\n label: 'End',\n before: null,\n after: end,\n changeType: 'add',\n });\n }\n\n const timezone = String(inputs.timezone || '').trim();\n if (timezone) {\n results.push({\n key: 'timezone',\n label: 'Timezone',\n before: null,\n after: timezone,\n changeType: 'add',\n });\n }\n\n const location = String(inputs.location || '').trim();\n if (location) {\n results.push({\n key: 'location',\n label: 'Location',\n before: null,\n after: location,\n changeType: 'add',\n });\n }\n\n if (attendees.length > 0) {\n results.push({\n key: 'attendees',\n label: 'Attendees',\n before: null,\n after: attendees.join(', '),\n changeType: 'add',\n });\n }\n\n results.push({\n key: 'calendar_id',\n label: 'Calendar',\n before: null,\n after: calendarId,\n changeType: 'add',\n });\n\n const description = String(inputs.description || '').trim();\n if (description) {\n results.push({\n key: 'description',\n label: 'Description',\n before: null,\n after: description.length > 120 ? description.slice(0, 117) + '...' : description,\n changeType: 'add',\n });\n }\n\n return results;\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\nimport { parseAttendeesField } from './eventCreate.types';\nimport { CALENDAR_EVENT_GET_SLUG } from './eventUpdate';\n\n/**\n * Diff resolver for `qi/calendar.event.update`.\n *\n * Fetches the current event via `GOOGLECALENDAR_EVENTS_GET` to populate the\n * \"before\" column. If the fetch fails (auth, network, missing event) we fall\n * back to `before: null` and still render the intended changes — the slider\n * stays unlocked by the flow detail component, which owns validation.\n * See integrations-plan.md §9 and gotchas §5.\n */\nregisterDiffResolver('qi/calendar.event.update', {\n resolver: async (inputs: Record<string, any>, ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const connection = inputs.connection || {};\n const connectedAccountId = connection.connectedAccountId;\n const eventId = String(inputs.event_id || '').trim();\n const calendarId = String(inputs.calendar_id || '').trim() || 'primary';\n\n let before: any = null;\n if (connectedAccountId && eventId && ctx.handlers?.integrations?.fetchCurrentState) {\n try {\n const current = await ctx.handlers.integrations.fetchCurrentState({\n toolSlug: CALENDAR_EVENT_GET_SLUG,\n connectedAccountId,\n arguments: { event_id: eventId, calendar_id: calendarId },\n });\n // The GET tool wraps the event under `data` in the envelope. Some\n // transports unwrap it, so accept both shapes.\n before = current?.data || current || null;\n } catch {\n before = null;\n }\n }\n\n const results: DiffResult[] = [];\n\n const afterSummary = String(inputs.summary || '').trim();\n results.push({\n key: 'summary',\n label: 'Title',\n before: before?.summary ?? null,\n after: afterSummary || null,\n changeType: diffChange(before?.summary, afterSummary),\n });\n\n const afterStart = String(inputs.start_datetime || '').trim();\n const beforeStart = before?.start?.dateTime || before?.start?.date || null;\n results.push({\n key: 'start_datetime',\n label: 'Start',\n before: beforeStart,\n after: afterStart || null,\n changeType: diffChange(beforeStart, afterStart),\n });\n\n const afterEnd = String(inputs.end_datetime || '').trim();\n const beforeEnd = before?.end?.dateTime || before?.end?.date || null;\n if (afterEnd || beforeEnd) {\n results.push({\n key: 'end_datetime',\n label: 'End',\n before: beforeEnd,\n after: afterEnd || null,\n changeType: diffChange(beforeEnd, afterEnd),\n });\n }\n\n const afterLocation = String(inputs.location || '').trim();\n if (afterLocation || before?.location) {\n results.push({\n key: 'location',\n label: 'Location',\n before: before?.location ?? null,\n after: afterLocation || null,\n changeType: diffChange(before?.location, afterLocation),\n });\n }\n\n const afterAttendees = parseAttendeesField(String(inputs.attendees || ''));\n const beforeAttendees: string[] = Array.isArray(before?.attendees) ? before.attendees.map((a: any) => a?.email).filter(Boolean) : [];\n if (afterAttendees.length > 0 || beforeAttendees.length > 0) {\n const beforeStr = beforeAttendees.join(', ');\n const afterStr = afterAttendees.join(', ');\n results.push({\n key: 'attendees',\n label: 'Attendees',\n before: beforeStr || null,\n after: afterStr || null,\n changeType: diffChange(beforeStr, afterStr),\n });\n }\n\n const afterDescription = String(inputs.description || '').trim();\n if (afterDescription || before?.description) {\n const clip = (s: string | undefined | null) => (s && s.length > 120 ? s.slice(0, 117) + '...' : s ?? null);\n results.push({\n key: 'description',\n label: 'Description',\n before: clip(before?.description),\n after: clip(afterDescription) ?? null,\n changeType: diffChange(before?.description, afterDescription),\n });\n }\n\n return results;\n },\n});\n\nfunction diffChange(beforeVal: unknown, afterVal: unknown): DiffResult['changeType'] {\n const b = beforeVal === undefined || beforeVal === null ? '' : String(beforeVal).trim();\n const a = afterVal === undefined || afterVal === null ? '' : String(afterVal).trim();\n if (b === a) return 'unchanged';\n if (!b && a) return 'add';\n if (b && !a) return 'remove';\n return 'replace';\n}\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\n/**\n * Diff resolver for `qi/xero.contact.create` — create actions have no before state.\n */\nregisterDiffResolver('qi/xero.contact.create', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const results: DiffResult[] = [\n {\n key: 'Name',\n label: 'Name',\n before: null,\n after: String(inputs.Name || '').trim() || '(required)',\n changeType: 'add',\n },\n ];\n\n const fields: Array<[keyof typeof inputs, string]> = [\n ['EmailAddress', 'Email'],\n ['phone_number', 'Phone'],\n ['mobile_number', 'Mobile'],\n ['Website', 'Website'],\n ['TaxNumber', 'Tax number'],\n ['AccountNumber', 'Account number'],\n ['DefaultCurrency', 'Default currency'],\n ];\n\n for (const [key, label] of fields) {\n const v = String(inputs[key] || '').trim();\n if (v) {\n results.push({ key: String(key), label, before: null, after: v, changeType: 'add' });\n }\n }\n\n const roles: string[] = [];\n if (inputs.IsCustomer) roles.push('Customer');\n if (inputs.IsSupplier) roles.push('Supplier');\n if (roles.length > 0) {\n results.push({ key: 'role', label: 'Role', before: null, after: roles.join(' + '), changeType: 'add' });\n }\n\n if (inputs.tenant_id) {\n results.push({ key: 'tenant_id', label: 'Xero org', before: null, after: String(inputs.tenant_id), changeType: 'add' });\n }\n\n return results;\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\nregisterDiffResolver('qi/xero.invoice.create', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const results: DiffResult[] = [\n {\n key: 'Type',\n label: 'Type',\n before: null,\n after: String(inputs.Type || 'ACCREC').toUpperCase() === 'ACCPAY' ? 'ACCPAY (bill)' : 'ACCREC (sale)',\n changeType: 'add',\n },\n {\n key: 'Status',\n label: 'Status',\n before: null,\n after: String(inputs.Status || 'DRAFT'),\n changeType: 'add',\n },\n ];\n\n const contact = String(inputs.ContactID || '').trim() || String(inputs.ContactName || '').trim();\n if (contact) {\n results.push({\n key: 'Contact',\n label: 'Contact',\n before: null,\n after: contact,\n changeType: 'add',\n });\n }\n\n // LineItems is structured — manual rows or iterative binding. We report\n // the count and totals best-effort without resolving refs (the diff runs\n // in config context where we may not have runtime output yet).\n let lineItemSummary = '(required)';\n let totalAmount = 0;\n const lineItems = (inputs as any).LineItems;\n if (lineItems && typeof lineItems === 'object') {\n if (lineItems.mode === 'manual' && Array.isArray(lineItems.rows)) {\n lineItemSummary = `${lineItems.rows.length} item${lineItems.rows.length === 1 ? '' : 's'}`;\n totalAmount = lineItems.rows.reduce((sum: number, row: any) => {\n const qty = Number(row?.Quantity) || 0;\n const price = Number(row?.UnitAmount) || 0;\n return sum + qty * price;\n }, 0);\n } else if (lineItems.mode === 'iterative') {\n lineItemSummary = lineItems.source ? `per item from ${String(lineItems.source).slice(0, 80)}` : '(source not picked)';\n }\n }\n results.push({\n key: 'LineItems',\n label: 'Line items',\n before: null,\n after: lineItemSummary,\n changeType: 'add',\n });\n\n if (totalAmount > 0) {\n const currency = String(inputs.CurrencyCode || '').trim();\n results.push({\n key: 'Total',\n label: 'Total (est.)',\n before: null,\n after: currency ? `${totalAmount.toFixed(2)} ${currency}` : totalAmount.toFixed(2),\n changeType: 'add',\n });\n }\n\n if (inputs.DueDate) {\n results.push({ key: 'DueDate', label: 'Due', before: null, after: String(inputs.DueDate), changeType: 'add' });\n }\n if (inputs.Reference) {\n results.push({ key: 'Reference', label: 'Reference', before: null, after: String(inputs.Reference), changeType: 'add' });\n }\n if (inputs.tenant_id) {\n results.push({ key: 'tenant_id', label: 'Xero org', before: null, after: String(inputs.tenant_id), changeType: 'add' });\n }\n\n return results;\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\nregisterDiffResolver('qi/xero.payment.create', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const results: DiffResult[] = [];\n\n const invoiceId = String(inputs.InvoiceID || '').trim();\n if (invoiceId) {\n results.push({\n key: 'InvoiceID',\n label: 'Invoice',\n before: null,\n after: invoiceId,\n changeType: 'add',\n });\n }\n\n const accountId = String(inputs.AccountID || '').trim();\n if (accountId) {\n results.push({\n key: 'AccountID',\n label: 'Bank account',\n before: null,\n after: accountId,\n changeType: 'add',\n });\n }\n\n const amountRaw = String(inputs.Amount ?? '').trim();\n if (amountRaw) {\n const n = Number(amountRaw);\n results.push({\n key: 'Amount',\n label: 'Amount',\n before: null,\n after: Number.isFinite(n) ? n.toFixed(2) : amountRaw,\n changeType: 'add',\n });\n }\n\n if (inputs.Date) {\n results.push({ key: 'Date', label: 'Date', before: null, after: String(inputs.Date), changeType: 'add' });\n }\n if (inputs.Reference) {\n results.push({ key: 'Reference', label: 'Reference (tx hash)', before: null, after: String(inputs.Reference), changeType: 'add' });\n }\n if (inputs.tenant_id) {\n results.push({ key: 'tenant_id', label: 'Xero org', before: null, after: String(inputs.tenant_id), changeType: 'add' });\n }\n\n return results;\n },\n});\n","import { registerDiffResolver } from '../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../diffTypes';\n\nregisterDiffResolver('qi/wallet.fund', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const address = String(inputs.address || '').trim();\n const amount = String(inputs.amount || '250000').trim();\n const network = String(inputs.network || 'devnet').trim();\n\n const ixoAmount = (Number(amount) / 1_000_000).toFixed(6);\n\n return [\n {\n key: 'recipient',\n label: 'Recipient',\n before: 'N/A',\n after: address || 'Pending wallet generation',\n changeType: address ? 'replace' : 'unchanged',\n },\n {\n key: 'amount',\n label: 'Amount',\n before: '0 IXO',\n after: `${ixoAmount} IXO (${amount} uixo)`,\n changeType: 'replace',\n severity: 'info',\n },\n {\n key: 'network',\n label: 'Network',\n before: network,\n after: network,\n changeType: 'unchanged',\n },\n ];\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\nimport { COLLECTION_LIFECYCLE_ACTION_TYPE } from './index';\nimport { CollectionStateEnum, type CollectionIntentOptions, type CollectionOperation, type CollectionPayment, type CollectionState, type Payments } from './types';\n\n/**\n * Per-operation diff resolver for the single `qi/collection.lifecycle` block\n * (IXO-2576). Because one block performs many operations, the resolver branches\n * on the `operation` runtime input and returns the relevant `DiffResult[]` for\n * that op only.\n *\n * `before` = the current on-chain `CollectionState`. The FlowDetail (IXO-2575)\n * is responsible for merging `runtime.output` (the latest `CollectionState`,\n * per IXO-2573 `output` always holds full on-chain truth) into the inputs it\n * feeds the diff system. We read it tolerantly from a few keys so the resolver\n * is robust to the exact wiring and NEVER throws on missing/empty `output`\n * (the pre-create state, where `output` is blank).\n *\n * `after` = the proposed values (the per-op runtime inputs).\n *\n * `refresh` is read-only and returns an empty diff so it does not block the UI.\n */\n\n// ---------------------------------------------------------------------------\n// Helpers — all defensive; none throw on missing/partial data.\n// ---------------------------------------------------------------------------\n\nconst STATE_LABELS: Record<number, string> = {\n [CollectionStateEnum.OPEN]: 'Open',\n [CollectionStateEnum.PAUSED]: 'Paused',\n [CollectionStateEnum.CLOSED]: 'Closed',\n};\n\nfunction stateLabel(value: unknown): string | null {\n if (value === undefined || value === null || value === '') return null;\n const n = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(n)) return null;\n return STATE_LABELS[n] ?? `Unknown (${n})`;\n}\n\n/** Pull the current on-chain CollectionState out of the merged inputs. */\nfunction readCurrentState(inputs: Record<string, any>): Partial<CollectionState> {\n const candidate = inputs?.currentState ?? inputs?.__currentState ?? inputs?.__currentOutput ?? inputs?.currentOutput ?? inputs?.output ?? undefined;\n if (candidate && typeof candidate === 'object') return candidate as Partial<CollectionState>;\n return {};\n}\n\n/** Format a quota string for display; `0`/empty = unlimited. */\nfunction formatQuota(value: unknown): string {\n if (value === undefined || value === null || value === '') return 'Unlimited';\n const s = String(value).trim();\n if (s === '' || s === '0') return 'Unlimited';\n return s;\n}\n\nfunction toNumberOrNull(value: unknown): number | null {\n if (value === undefined || value === null || value === '') return null;\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction formatDate(value: unknown): string {\n if (value === undefined || value === null || value === '') return 'Not set';\n return String(value);\n}\n\nconst USDC_IBC_DENOM = 'ibc/6BBE9BD4246F8E04948D5A4EEE7164B2630263B9EBB5E7DC5F0A46C62A2FF97B';\n\n/**\n * Normalise a coin to display units so before/after read consistently. The\n * \"after\" side carries display denoms (IXO/USDC) straight from the editor,\n * while the \"before\" side comes from on-chain state in base denoms (uixo,\n * ibc/…) and micro amounts — map those back to IXO/USDC ÷ 1e6.\n */\nfunction formatCoin(amount: string | undefined, denom: string | undefined): string {\n const rawAmount = amount ?? '?';\n if (denom === 'uixo') {\n const n = Number(rawAmount);\n return `${Number.isFinite(n) ? n / 1_000_000 : rawAmount} IXO`;\n }\n if (denom === USDC_IBC_DENOM || (denom ?? '').startsWith('ibc/')) {\n const n = Number(rawAmount);\n return `${Number.isFinite(n) ? n / 1_000_000 : rawAmount} USDC`;\n }\n return `${rawAmount} ${denom ?? ''}`.trim();\n}\n\n/** A compact human-readable summary of a single payment leg. */\nfunction summarisePaymentLeg(leg: CollectionPayment | undefined): string {\n if (!leg || typeof leg !== 'object') return 'None';\n const parts: string[] = [];\n const coins = Array.isArray(leg.amount) ? leg.amount : [];\n if (coins.length > 0) {\n parts.push(coins.map((c) => formatCoin(c?.amount, c?.denom)).join(', '));\n }\n if (Array.isArray(leg.cw20Payment) && leg.cw20Payment.length > 0) {\n parts.push(`${leg.cw20Payment.length} CW20`);\n }\n if (leg.contract_1155Payment) {\n parts.push('1155');\n }\n if (leg.account) {\n parts.push(`→ ${leg.account}`);\n }\n if (leg.isOraclePayment) {\n parts.push('(oracle)');\n }\n return parts.length > 0 ? parts.join(' ') : 'None';\n}\n\nfunction summarisePayments(payments: Payments | undefined): { submission: string; evaluation: string; approval: string; rejection: string } {\n const p = payments && typeof payments === 'object' ? payments : ({} as Payments);\n return {\n submission: summarisePaymentLeg(p.submission),\n evaluation: summarisePaymentLeg(p.evaluation),\n approval: summarisePaymentLeg(p.approval),\n rejection: summarisePaymentLeg(p.rejection),\n };\n}\n\nfunction summariseIntents(intents: CollectionIntentOptions | undefined): { allowed: string; timeout: string; payment: string } {\n const i = intents && typeof intents === 'object' ? intents : ({} as CollectionIntentOptions);\n return {\n allowed: i.allowed === undefined ? 'Not set' : i.allowed ? 'Allowed' : 'Disallowed',\n timeout: i.timeoutNs ? String(i.timeoutNs) : 'Not set',\n payment: summarisePaymentLeg(i.payment),\n };\n}\n\nfunction changeFor<T extends string | number | null>(before: T, after: T): DiffResult['changeType'] {\n if (before === after) return 'unchanged';\n if (before === null || before === undefined || before === '') return 'add';\n if (after === null || after === undefined || after === '') return 'remove';\n if (typeof before === 'number' && typeof after === 'number') {\n if (after > before) return 'increase';\n if (after < before) return 'decrease';\n }\n return 'replace';\n}\n\n// ---------------------------------------------------------------------------\n// Per-operation builders\n// ---------------------------------------------------------------------------\n\nfunction diffCreate(inputs: Record<string, any>): DiffResult[] {\n const results: DiffResult[] = [];\n\n if (inputs.entity) {\n results.push({ key: 'entity', label: 'Entity', before: null, after: String(inputs.entity), changeType: 'add' });\n }\n if (inputs.protocol) {\n results.push({ key: 'protocol', label: 'Protocol', before: null, after: String(inputs.protocol), changeType: 'add' });\n }\n\n results.push({\n key: 'state',\n label: 'State',\n before: null,\n after: stateLabel(inputs.state) ?? STATE_LABELS[CollectionStateEnum.OPEN],\n changeType: 'add',\n });\n\n results.push({\n key: 'startDate',\n label: 'Start Date',\n before: null,\n after: inputs.startDate ? String(inputs.startDate) : 'Not set',\n changeType: inputs.startDate ? 'add' : 'unchanged',\n });\n results.push({\n key: 'endDate',\n label: 'End Date',\n before: null,\n after: inputs.endDate ? String(inputs.endDate) : 'Not set',\n changeType: inputs.endDate ? 'add' : 'unchanged',\n });\n\n // Quota: editable, but historically immutable-feeling — flag it.\n results.push({\n key: 'quota',\n label: 'Quota',\n before: null,\n after: formatQuota(inputs.quota),\n changeType: 'add',\n severity: 'warning',\n unit: formatQuota(inputs.quota) === 'Unlimited' ? undefined : 'claims',\n });\n\n if (inputs.payments) {\n const after = summarisePayments(inputs.payments as Payments);\n (['submission', 'evaluation', 'approval', 'rejection'] as const).forEach((leg) => {\n if (after[leg] !== 'None') {\n results.push({\n key: `payments.${leg}`,\n label: `Payment — ${leg.charAt(0).toUpperCase()}${leg.slice(1)}`,\n before: null,\n after: after[leg],\n changeType: 'add',\n });\n }\n });\n }\n\n if (inputs.intents) {\n const after = summariseIntents(inputs.intents as CollectionIntentOptions);\n results.push({ key: 'intents.allowed', label: 'Intents — Allowed', before: null, after: after.allowed, changeType: 'add' });\n if (after.timeout !== 'Not set') {\n results.push({ key: 'intents.timeout', label: 'Intents — Timeout (ns)', before: null, after: after.timeout, changeType: 'add' });\n }\n if (after.payment !== 'None') {\n results.push({ key: 'intents.payment', label: 'Intents — Payment', before: null, after: after.payment, changeType: 'add' });\n }\n }\n\n return results;\n}\n\nfunction diffUpdateState(inputs: Record<string, any>, current: Partial<CollectionState>): DiffResult[] {\n const before = stateLabel(current.state);\n const after = stateLabel(inputs.state);\n return [\n {\n key: 'state',\n label: 'State',\n before: before ?? 'Unknown',\n after: after ?? 'Unchanged',\n changeType: changeFor(before, after),\n severity: after === STATE_LABELS[CollectionStateEnum.CLOSED] ? 'warning' : 'info',\n },\n ];\n}\n\nfunction diffUpdateDates(inputs: Record<string, any>, current: Partial<CollectionState>): DiffResult[] {\n const results: DiffResult[] = [];\n const beforeStart = formatDate(current.startDate);\n const afterStart = inputs.startDate !== undefined ? formatDate(inputs.startDate) : beforeStart;\n results.push({\n key: 'startDate',\n label: 'Start Date',\n before: beforeStart,\n after: afterStart,\n changeType: changeFor(beforeStart === 'Not set' ? null : beforeStart, afterStart === 'Not set' ? null : afterStart),\n });\n\n const beforeEnd = formatDate(current.endDate);\n const afterEnd = inputs.endDate !== undefined ? formatDate(inputs.endDate) : beforeEnd;\n results.push({\n key: 'endDate',\n label: 'End Date',\n before: beforeEnd,\n after: afterEnd,\n changeType: changeFor(beforeEnd === 'Not set' ? null : beforeEnd, afterEnd === 'Not set' ? null : afterEnd),\n });\n\n return results;\n}\n\nfunction diffUpdateQuota(inputs: Record<string, any>, current: Partial<CollectionState>): DiffResult[] {\n const beforeQuotaStr = formatQuota(current.quota);\n const afterQuotaStr = formatQuota(inputs.quota);\n\n // Numeric comparison for increase/decrease (treat unlimited as a sentinel, not numeric).\n const beforeNum = beforeQuotaStr === 'Unlimited' ? null : toNumberOrNull(current.quota);\n const afterNum = afterQuotaStr === 'Unlimited' ? null : toNumberOrNull(inputs.quota);\n\n let changeType: DiffResult['changeType'];\n if (beforeQuotaStr === afterQuotaStr) {\n changeType = 'unchanged';\n } else if (beforeNum !== null && afterNum !== null) {\n changeType = afterNum > beforeNum ? 'increase' : afterNum < beforeNum ? 'decrease' : 'replace';\n } else {\n changeType = 'replace';\n }\n\n // Warn if the requested quota would fall below the number of claims already\n // submitted — the chain rejects this (ErrCollectionQuotaBelowCount).\n const count = toNumberOrNull(current.count);\n const belowCount = afterNum !== null && count !== null && afterNum < count;\n\n return [\n {\n key: 'quota',\n label: 'Quota',\n before: beforeQuotaStr,\n after: belowCount ? `${afterQuotaStr} (below current count ${count} — chain will reject)` : afterQuotaStr,\n changeType,\n severity: belowCount ? 'critical' : 'info',\n unit: afterQuotaStr === 'Unlimited' ? undefined : 'claims',\n },\n ];\n}\n\nfunction diffUpdatePayments(inputs: Record<string, any>, current: Partial<CollectionState>): DiffResult[] {\n const before = summarisePayments(current.payments);\n const after = summarisePayments(inputs.payments as Payments);\n return (['submission', 'evaluation', 'approval', 'rejection'] as const).map((leg) => ({\n key: `payments.${leg}`,\n label: `Payment — ${leg.charAt(0).toUpperCase()}${leg.slice(1)}`,\n before: before[leg],\n after: after[leg],\n changeType: changeFor(before[leg] === 'None' ? null : before[leg], after[leg] === 'None' ? null : after[leg]),\n }));\n}\n\nfunction diffUpdateIntents(inputs: Record<string, any>, current: Partial<CollectionState>): DiffResult[] {\n const before = summariseIntents(current.intents);\n const after = summariseIntents(inputs.intents as CollectionIntentOptions);\n return [\n {\n key: 'intents.allowed',\n label: 'Intents — Allowed',\n before: before.allowed,\n after: after.allowed,\n changeType: changeFor(before.allowed === 'Not set' ? null : before.allowed, after.allowed === 'Not set' ? null : after.allowed),\n },\n {\n key: 'intents.timeout',\n label: 'Intents — Timeout (ns)',\n before: before.timeout,\n after: after.timeout,\n changeType: changeFor(before.timeout === 'Not set' ? null : before.timeout, after.timeout === 'Not set' ? null : after.timeout),\n },\n {\n key: 'intents.payment',\n label: 'Intents — Payment',\n before: before.payment,\n after: after.payment,\n changeType: changeFor(before.payment === 'None' ? null : before.payment, after.payment === 'None' ? null : after.payment),\n },\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nregisterDiffResolver(COLLECTION_LIFECYCLE_ACTION_TYPE, {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const safeInputs = inputs && typeof inputs === 'object' ? inputs : {};\n const operation = String(safeInputs.operation || '').trim() as CollectionOperation;\n const current = readCurrentState(safeInputs);\n\n switch (operation) {\n case 'create':\n return diffCreate(safeInputs);\n case 'updateState':\n return diffUpdateState(safeInputs, current);\n case 'updateDates':\n return diffUpdateDates(safeInputs, current);\n case 'updateQuota':\n return diffUpdateQuota(safeInputs, current);\n case 'updatePayments':\n return diffUpdatePayments(safeInputs, current);\n case 'updateIntents':\n return diffUpdateIntents(safeInputs, current);\n case 'refresh':\n // Read-only; no proposed change. Empty diff must not block the UI.\n return [];\n default:\n // Unknown / not-yet-selected operation — no diff.\n return [];\n }\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\nimport { COLLECTION_USERS_ACTION_TYPE } from './index';\nimport type { CollectionUsersOp } from './types';\n\n/**\n * Per-operation diff resolver for the single `qi/collection.users` block\n * (IXO-2586). Because one block performs many operations, the resolver branches\n * on the `operation` runtime input and returns the relevant `DiffResult[]`.\n *\n * `add` → the new grant being conferred (collection, role, quota, grantee or\n * fan-out member count) — all `add` change types.\n * `revoke` → the grant being removed — a `remove` change, flagged `warning`.\n * `list` → read-only; empty diff so it does not block the UI.\n *\n * All helpers are defensive; none throw on missing/partial data.\n */\n\n// Agent quota is a finite per-agent claim/evaluation countdown the chain\n// requires to be > 0 (see x/claims/types/authz.go ValidateBasic). There is no\n// \"0 = unlimited\" sentinel for it, so we never render 0 as \"Unlimited\".\nfunction formatQuota(value: unknown): string {\n if (value === undefined || value === null) return '—';\n const s = String(value).trim();\n if (s === '') return '—';\n return s;\n}\n\nfunction roleLabel(value: unknown): string {\n const r = String(value || '')\n .trim()\n .toLowerCase();\n if (r === 'submit') return 'Submit (Contributor)';\n if (r === 'evaluate') return 'Evaluate (Evaluator)';\n return 'Unknown role';\n}\n\nconst IXO_DENOM = 'uixo';\nconst USDC_DENOM = 'ibc/6BBE9BD4246F8E04948D5A4EEE7164B2630263B9EBB5E7DC5F0A46C62A2FF97B';\n// maxAmount coins are carried in base/micro units (6 decimals) — see\n// CollectionUsersFlowDetail.buildMaxAmounts and the consumer grant handler.\n// Divide for human display in the diff.\nconst DENOM_DECIMALS = 6;\n\nfunction formatCoin(value: unknown): string {\n const coin = value as { denom?: unknown; amount?: unknown };\n const denomValue = String(coin?.denom || '');\n const denom = denomValue === IXO_DENOM ? 'IXO' : denomValue === USDC_DENOM ? 'USDC' : denomValue;\n const rawAmount = Number(coin?.amount);\n const displayAmount = Number.isFinite(rawAmount) ? String(rawAmount / Math.pow(10, DENOM_DECIMALS)) : String(coin?.amount || '');\n return `${displayAmount} ${denom}`.trim();\n}\n\nfunction diffAdd(inputs: Record<string, any>): DiffResult[] {\n const results: DiffResult[] = [];\n const kind = String(inputs.granteeKind || 'user');\n const role = String(inputs.role || '')\n .trim()\n .toLowerCase();\n\n results.push({ key: 'role', label: 'Role', before: null, after: roleLabel(inputs.role), changeType: 'add' });\n\n if (inputs.collectionId) {\n results.push({ key: 'collectionId', label: 'Collection', before: null, after: String(inputs.collectionId), changeType: 'add' });\n }\n\n if (kind === 'group-members') {\n const count = Array.isArray(inputs.members) ? inputs.members.filter((m: any) => !!String(m?.address || '').trim()).length : 0;\n results.push({\n key: 'grantees',\n label: 'Grantees (fan-out)',\n before: null,\n after: `${count} group member${count === 1 ? '' : 's'}`,\n changeType: 'add',\n severity: 'warning',\n });\n } else {\n const label = kind === 'group-account' ? 'Grantee (group account)' : 'Grantee';\n results.push({ key: 'grantee', label, before: null, after: String(inputs.granteeAddress || '—'), changeType: 'add' });\n }\n\n results.push({\n key: 'agentQuota',\n label: 'Agent Quota',\n before: null,\n after: formatQuota(inputs.agentQuota),\n changeType: 'add',\n unit: formatQuota(inputs.agentQuota) === '—' ? undefined : 'claims',\n });\n\n if (role === 'evaluate') {\n const maxAmount = Array.isArray(inputs.maxAmount) ? inputs.maxAmount : [];\n results.push({\n key: 'maxAmount',\n label: 'Max Amounts',\n before: null,\n after: maxAmount.length > 0 ? maxAmount.map(formatCoin).join(', ') : 'None',\n changeType: maxAmount.length > 0 ? 'add' : 'unchanged',\n });\n }\n\n return results;\n}\n\nfunction diffRevoke(inputs: Record<string, any>): DiffResult[] {\n const results: DiffResult[] = [];\n results.push({ key: 'role', label: 'Role', before: roleLabel(inputs.role), after: null, changeType: 'remove', severity: 'warning' });\n if (inputs.collectionId) {\n results.push({ key: 'collectionId', label: 'Collection', before: String(inputs.collectionId), after: null, changeType: 'remove', severity: 'warning' });\n }\n results.push({\n key: 'grantee',\n label: 'Grantee',\n before: String(inputs.granteeAddress || '—'),\n after: null,\n changeType: 'remove',\n severity: 'warning',\n });\n return results;\n}\n\nregisterDiffResolver(COLLECTION_USERS_ACTION_TYPE, {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const safeInputs = inputs && typeof inputs === 'object' ? inputs : {};\n const operation = String(safeInputs.operation || '').trim() as CollectionUsersOp;\n\n switch (operation) {\n case 'add':\n return diffAdd(safeInputs);\n case 'revoke':\n return diffRevoke(safeInputs);\n case 'list':\n // Read-only; no proposed change. Empty diff must not block the UI.\n return [];\n default:\n return [];\n }\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\n/**\n * Diff preview for qi/carbon.harvest. Reads the resolved selection the\n * FlowDetail pushed via registerRuntimeInputs (`selectedBatches`) and renders a\n * per-batch claimable→wallet transfer plus a roll-up. Pure derivation — no\n * network. Empty selection → empty diff (the slider stays locked anyway).\n */\nregisterDiffResolver('qi/carbon.harvest', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const selected = Array.isArray(inputs.selectedBatches) ? inputs.selectedBatches : [];\n if (selected.length === 0) return [];\n\n const rows: DiffResult[] = selected.map((b: any) => {\n const claimable = Number(b?.claimable) || 0;\n return {\n key: `batch-${b?.id}`,\n label: b?.alsoKnownAs || b?.id || 'Batch',\n before: 0,\n after: claimable,\n changeType: 'increase',\n unit: 'CARBON',\n };\n });\n\n const total = selected.reduce((s: number, b: any) => s + (Number(b?.claimable) || 0), 0);\n rows.push({\n key: 'total',\n label: 'Total harvested to wallet',\n before: 0,\n after: total,\n changeType: 'increase',\n unit: 'CARBON',\n severity: 'info',\n });\n\n return rows;\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\n/**\n * Diff preview for qi/carbon.retire. Reads the resolved selection the\n * FlowDetail pushed via registerRuntimeInputs (`selectedBatches`) and renders a\n * per-batch burn (available→retired) plus a roll-up flagged as a permanent,\n * irreversible change. Pure derivation — no network.\n */\nregisterDiffResolver('qi/carbon.retire', {\n resolver: async (inputs: Record<string, any>, _ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const selected = Array.isArray(inputs.selectedBatches) ? inputs.selectedBatches : [];\n if (selected.length === 0) return [];\n\n const rows: DiffResult[] = selected.map((b: any) => {\n const amount = Number(b?.amount) || 0;\n return {\n key: `batch-${b?.id}`,\n label: b?.alsoKnownAs || b?.id || 'Batch',\n before: amount,\n after: 0,\n changeType: 'decrease',\n unit: 'CARBON',\n severity: 'warning',\n };\n });\n\n const total = selected.reduce((s: number, b: any) => s + (Number(b?.amount) || 0), 0);\n rows.push({\n key: 'total',\n label: 'Total retired (permanent, irreversible)',\n before: total,\n after: 0,\n changeType: 'decrease',\n unit: 'CARBON',\n severity: 'critical',\n });\n\n return rows;\n },\n});\n","import { registerDiffResolver } from '../../diffRegistry';\nimport type { DiffResult, DiffResolverContext } from '../../diffTypes';\n\n/**\n * Diff preview for qi/entity.transfer. Reads the resolved selection the\n * FlowDetail pushed via registerRuntimeInputs (recipientDid + resolved\n * entityDid/ownerDid) and renders the single ownership change as a permanent,\n * irreversible replace. Pure derivation — no network.\n */\nregisterDiffResolver('qi/entity.transfer', {\n resolver: async (inputs: Record<string, any>, ctx: DiffResolverContext): Promise<DiffResult[]> => {\n const recipient = String(inputs.recipientDid || '').trim();\n if (!recipient) return [];\n\n const entityDid = String(inputs.entityDid || '').trim();\n const currentOwner = String(inputs.ownerDid || '').trim() || ctx.actorDid || 'current owner';\n\n const rows: DiffResult[] = [\n {\n key: 'owner',\n label: 'Owner',\n before: currentOwner,\n after: recipient,\n changeType: 'replace',\n severity: 'critical',\n },\n ];\n\n if (entityDid) {\n rows.push({\n key: 'entity',\n label: 'Entity',\n before: entityDid,\n after: entityDid,\n changeType: 'unchanged',\n severity: 'info',\n });\n }\n\n return rows;\n },\n});\n","import type { Doc as YDoc, Map as YMap } from 'yjs';\n\n/**\n * Top-level Y.Doc map that owns all DM notification dedup state.\n *\n * Ignition Phase A prerequisite: these records used to squat as reserved\n * `__`-prefixed keys inside the flat `runtime` map. Run adoption iterates that\n * map and copies every entry into `runs[<runId>].actions`, so leaving them\n * there manufactures phantom \"actions\" that later get quantified over as if\n * they were blocks (close folds, `actions.forEach`, block counts).\n *\n * DM dedup state is flow-scoped, not run-scoped, so it gets its own map rather\n * than moving under a run.\n *\n * ## Why this module DUAL-WRITES rather than forking one-way\n *\n * The first cut of this move wrote only the new map and kept a **read-only**\n * fallback to the legacy keys. That forks dedup in one direction and reopens\n * the bug it was meant to close:\n *\n * - Before the move both generations shared one key, so dedup worked across\n * them: whoever DM'd first, everyone saw it.\n * - After a one-way fork, an already-deployed client reads **only** the legacy\n * key. Every block a new client notified is invisible to it, so it re-DMs the\n * assignee — one duplicate per block, forever, for as long as an old tab is\n * open.\n *\n * So writes go to **both** places, in one transaction, exactly as\n * `runs.ts#writeActionState` mirrors run state into the flat `runtime` map.\n * Both generations then converge on the same dedup facts.\n *\n * **This is safe only because the legacy keys are `__`-prefixed.**\n * `adoptLegacyRuntime` (`runs.ts`) skips every key starting with\n * `RESERVED_RUNTIME_KEY_PREFIX`, so writing them back into `runtime` cannot\n * leak a phantom \"action\" into `runs[<runId>].actions`. That coupling is\n * asserted in `dmNotificationState.test.ts` — if the prefix or these key names\n * ever change, that test fails rather than the leak shipping silently.\n *\n * ## The read rule: per-record freshness, NOT blanket precedence\n *\n * Both bags must be merged (an old client only ever writes the legacy one), but\n * a naive union with a fixed winner still misfires, because a dedup record is\n * **overwritten, not accumulated**: `shouldNotify` compares `assignedDid`, so a\n * reassignment rewrites the record for that block. Give either side blanket\n * precedence and the loser's *newer* record gets shadowed by the winner's\n * *older* one — `shouldNotify` sees the previous assignee, and the client\n * re-DMs someone who was already notified.\n *\n * The rule is therefore the same shape as `runs.ts#resolveActionState`: resolve\n * **per record**, newest `notifiedAt` wins, and on a tie the new map wins as a\n * deterministic tiebreak so every peer resolves an identical pair identically.\n * `notifiedAt` is stamped at DM time by whoever sent it, which makes it the\n * natural freshness key — the direct analogue of `executedAt`.\n */\nexport const DM_NOTIFICATIONS_MAP_KEY = 'dmNotificationState';\n\n/**\n * Sub-key inside {@link DM_NOTIFICATIONS_MAP_KEY} holding {@link DMNotificationState}.\n *\n * Also the legacy key inside the flat `runtime` map. The `__` prefix is\n * load-bearing: it is what makes run adoption skip it.\n */\nexport const DM_NOTIFICATIONS_KEY = '__dm_notifications';\n\n/**\n * Sub-key inside {@link DM_NOTIFICATIONS_MAP_KEY} holding {@link PendingDMNotificationState}.\n *\n * Also the legacy key inside the flat `runtime` map. See {@link DM_NOTIFICATIONS_KEY}.\n */\nexport const DM_NOTIFICATIONS_PENDING_KEY = '__dm_notifications_pending';\n\n/**\n * The flat map these records used to live in, and still do — as the Phase A\n * compat mirror that keeps already-deployed clients deduping against the same\n * facts new clients write.\n */\nconst LEGACY_RUNTIME_MAP_KEY = 'runtime';\n\nexport interface DMNotificationRecord {\n /** DID of the assigned actor who was notified */\n assignedDid: string;\n /** Unix timestamp (ms) when the notification was sent */\n notifiedAt: number;\n /** Matrix user ID of whoever triggered the notification */\n notifiedBy: string;\n}\n\nexport interface DMNotificationState {\n [blockId: string]: DMNotificationRecord;\n}\n\n/**\n * Per-pending-invocation DM dedup state. Slice G of the events-and-triggers\n * feature. The original `DMNotificationState` is keyed by blockId only,\n * which is correct for activation-based notifications (one DM per block per\n * assignee change). Pending invocations need a finer key — each individual\n * queued invocation must produce exactly one DM, so the dedup key is\n * (blockId, pendingInvocationId).\n *\n * Stored under a separate sub-key so the existing `DMNotificationState`\n * surface stays unchanged for backward compat.\n */\nexport interface PendingDMNotificationState {\n [blockId: string]: {\n [pendingInvocationId: string]: DMNotificationRecord;\n };\n}\n\nfunction getDMMap(yDoc: YDoc): YMap<any> {\n return yDoc.getMap<any>(DM_NOTIFICATIONS_MAP_KEY);\n}\n\n/**\n * The legacy flat map.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: when nothing in this file references\n * `LEGACY_RUNTIME_MAP_KEY` (compat register item 7) — i.e. when no deployed\n * client reads or writes the `__dm_notifications*` keys any more.\n */\nfunction getLegacyMap(yDoc: YDoc): YMap<any> {\n return yDoc.getMap<any>(LEGACY_RUNTIME_MAP_KEY);\n}\n\nfunction readRecordBag(map: YMap<any> | undefined, key: string): Record<string, any> {\n return readNestedBag(map?.get(key));\n}\n\n/** `{}` unless the value is a usable plain-object bag. */\nfunction readNestedBag(value: unknown): Record<string, any> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n return value as Record<string, any>;\n}\n\n/** `undefined` unless the value is a usable dedup record. */\nfunction asRecord(value: unknown): DMNotificationRecord | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value as DMNotificationRecord;\n}\n\n/** A record with no usable timestamp sorts below every stamped one, above nothing. */\nfunction notifiedAtOf(record: DMNotificationRecord): number {\n const at = record.notifiedAt;\n return typeof at === 'number' && Number.isFinite(at) ? at : Number.NEGATIVE_INFINITY;\n}\n\n/**\n * Resolve one key's legacy-vs-current pair.\n *\n * Pure and deterministic: newer `notifiedAt` wins; on a tie (including two\n * records that both lack a usable timestamp) `current` wins. Every peer must\n * resolve a given pair identically or the two generations diverge again.\n */\nfunction resolveRecord(legacy: unknown, current: unknown): DMNotificationRecord | undefined {\n const l = asRecord(legacy);\n const c = asRecord(current);\n if (!l) return c;\n if (!c) return l;\n return notifiedAtOf(l) > notifiedAtOf(c) ? l : c;\n}\n\nfunction unionKeys(a: Record<string, unknown>, b: Record<string, unknown>): string[] {\n return Array.from(new Set([...Object.keys(a), ...Object.keys(b)]));\n}\n\n/**\n * Structural copy of a dedup bag.\n *\n * Yjs stores a plain-object value **by reference**, so handing the same object\n * to both maps would alias them: a later mutation through one silently rewrites\n * the other, and the doc records no change. Same discipline as\n * `runs.ts#writeActionState`, which builds three distinct objects for the same\n * reason.\n */\nfunction copyBag<T>(value: T): T {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value;\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n out[key] = copyBag(nested);\n }\n return out as T;\n}\n\n/**\n * Write a dedup bag to the dedicated map **and** mirror it to the legacy key,\n * in one transaction so the two can never be observed half-updated.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: the legacy mirror goes when no deployed\n * client reads the `__dm_notifications*` keys out of the flat `runtime` map\n * (compat register item 7). Until then, dropping it makes an old tab re-DM\n * every assignee a new client already notified.\n */\nfunction writeDedupBag(yDoc: YDoc, key: string, next: Record<string, unknown>): void {\n yDoc.transact(() => {\n getDMMap(yDoc).set(key, copyBag(next));\n // PHASE A COMPAT — REMOVAL TRIGGER: when no deployed client reads\n // `runtime['__dm_notifications*']` (compat register item 7). Safe to write\n // into `runtime` only because `adoptLegacyRuntime` skips `__`-prefixed keys.\n getLegacyMap(yDoc).set(key, copyBag(next));\n });\n}\n\n/**\n * Read the DM notification dedup state: the union of the dedicated map and the\n * legacy `runtime` key, resolved **per block** by {@link resolveRecord}.\n *\n * Union, because an already-deployed client only ever writes the legacy key, so\n * a whole-bag fallback would go blind to it the instant the new map became\n * non-empty. Per-record freshness rather than blanket precedence, because a\n * reassignment *overwrites* a block's record — see the module header.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: when the legacy side stops being written\n * (compat register item 7).\n */\nexport function getDMNotificationState(yDoc: YDoc): DMNotificationState {\n const legacy = readRecordBag(getLegacyMap(yDoc), DM_NOTIFICATIONS_KEY);\n const current = readRecordBag(getDMMap(yDoc), DM_NOTIFICATIONS_KEY);\n\n const merged: DMNotificationState = {};\n for (const blockId of unionKeys(legacy, current)) {\n const winner = resolveRecord(legacy[blockId], current[blockId]);\n if (winner) merged[blockId] = { ...winner };\n }\n return merged;\n}\n\n/**\n * Write a DM notification record for a block, merging with existing state.\n * Dual-writes the dedicated map and the legacy `runtime` key (one transaction),\n * so both client generations dedup against the same facts.\n */\nexport function setDMNotificationRecord(yDoc: YDoc, blockId: string, record: DMNotificationRecord): void {\n const next: DMNotificationState = {\n ...getDMNotificationState(yDoc),\n [blockId]: { ...record },\n };\n writeDedupBag(yDoc, DM_NOTIFICATIONS_KEY, next);\n}\n\n/**\n * Check whether a DM notification should be sent for a given block.\n * Returns true if:\n * - No notification was ever sent for this block, OR\n * - The assigned DID has changed since the last notification\n */\nexport function shouldNotify(state: DMNotificationState, blockId: string, currentAssignedDid: string): boolean {\n const existing = state[blockId];\n if (!existing) return true;\n return existing.assignedDid !== currentAssignedDid;\n}\n\n// ─── Pending invocation DM dedup (slice G) ──────────────────────────────────\n\n/**\n * Read the pending-invocation DM dedup state: the union of the dedicated map\n * and the legacy `runtime` key, resolved per (blockId, pendingInvocationId) by\n * {@link resolveRecord}. Same rule as {@link getDMNotificationState}, one level\n * deeper — `shouldNotifyPending` also compares `assignedDid`, so an individual\n * invocation's record can likewise be rewritten and must be resolved by\n * freshness rather than by which map it came from.\n */\nexport function getPendingDMNotificationState(yDoc: YDoc): PendingDMNotificationState {\n const legacy = readRecordBag(getLegacyMap(yDoc), DM_NOTIFICATIONS_PENDING_KEY);\n const current = readRecordBag(getDMMap(yDoc), DM_NOTIFICATIONS_PENDING_KEY);\n\n const merged: PendingDMNotificationState = {};\n for (const blockId of unionKeys(legacy, current)) {\n const legacyBlock = readNestedBag(legacy[blockId]);\n const currentBlock = readNestedBag(current[blockId]);\n const block: Record<string, DMNotificationRecord> = {};\n for (const invocationId of unionKeys(legacyBlock, currentBlock)) {\n const winner = resolveRecord(legacyBlock[invocationId], currentBlock[invocationId]);\n if (winner) block[invocationId] = { ...winner };\n }\n if (Object.keys(block).length > 0) merged[blockId] = block;\n }\n return merged;\n}\n\n/**\n * Record that a DM was sent for a specific (blockId, pendingInvocationId).\n * Dual-writes the dedicated map and the legacy `runtime` key (one transaction).\n */\nexport function setPendingDMNotificationRecord(yDoc: YDoc, blockId: string, pendingInvocationId: string, record: DMNotificationRecord): void {\n const current = getPendingDMNotificationState(yDoc);\n const blockState = current[blockId] || {};\n const next: PendingDMNotificationState = {\n ...current,\n [blockId]: {\n ...blockState,\n [pendingInvocationId]: { ...record },\n },\n };\n writeDedupBag(yDoc, DM_NOTIFICATIONS_PENDING_KEY, next);\n}\n\n/**\n * Check whether a DM should be sent for a specific pending invocation.\n * Returns true if no DM has yet been sent for this (blockId, pendingInvocationId, assigneeDid).\n *\n * Each pending invocation gets at most one DM, regardless of how many times\n * the scan runs. If the assignee on the pending invocation changes (which\n * shouldn't happen in normal flow but could via edits), a fresh DM fires.\n */\nexport function shouldNotifyPending(state: PendingDMNotificationState, blockId: string, pendingInvocationId: string, currentAssignedDid: string): boolean {\n const blockState = state[blockId];\n if (!blockState) return true;\n const existing = blockState[pendingInvocationId];\n if (!existing) return true;\n return existing.assignedDid !== currentAssignedDid;\n}\n","import * as Y from 'yjs';\nimport type { FlowNodeRuntimeState, NodeState } from '../../types/authorization';\nimport { DM_NOTIFICATIONS_MAP_KEY } from './dmNotificationState';\nimport type { FlowRuntimeStateManager } from './runtime';\nimport { getExistingYMap, isYMapLike } from '../yjsTypes';\n\n/**\n * # `runs.ts` — the narrow waist for per-action execution state\n *\n * Ignition Phase A. This is the ONLY module in the codebase that knows the\n * runs layout, the dual-write rule, or the flat-map fallback rule. Every\n * runtime read and every runtime write goes through here. Converting some call\n * sites and not others reproduces the split-brain failure described below\n * *inside a single release*, with no old client involved.\n *\n * ## Shape\n *\n * ```\n * runs: Y.Map<runId, Y.Map> ← nested container\n * └─ meta: plain object (RunMeta)\n * └─ actions: Y.Map<blockId, FlowNodeRuntimeState> ← PLAIN JS OBJECT values\n * runsTerminal: Y.Map<runId, RunTerminalRecord> ← plain objects, write-once\n * ```\n *\n * **Containers are nested Y.Maps; leaves stay plain JS objects.** Today every\n * runtime value is a plain object written whole, which gives last-writer-wins\n * *per blockId*. Storing a leaf as a nested `Y.Map` would silently change that\n * to per-field LWW — a merge-semantics change masquerading as a relocation —\n * and would break every `{...stored}` spread and every `stored.output` read in\n * the repo by returning `undefined` rather than throwing. Phase A changes\n * *where* state lives and nothing about *how it merges*.\n *\n * ## Why the dual-write exists\n *\n * Already-deployed clients cannot be told to stand down: `getVersionPolicy`\n * falls back to the latest known policy for unrecognised doc versions, so an\n * old client meeting a doc from the future writes anyway. Old and new clients\n * therefore write the same doc concurrently, and CRDT merge preserves both\n * writes. If the two generations read different shapes, each concludes the\n * block never ran, and a side-effecting action fires twice — a double claim\n * submission, a double payment.\n *\n * Every write mirrors the full merged object into the flat `runtime` map, and\n * **every read resolves the run entry against the flat entry through one shared\n * freshness predicate** ({@link resolveActionState}). The two generations do\n * *not* automatically agree, and nothing here assumes they do: at any moment\n * either side may hold the more advanced value, and the predicate is what\n * decides. A mirror that could only fill a *hole* would be no safety net at all\n * — `initializeRuntime` seeds `{state:'idle'}` for every block, so after the\n * first adoption there are no holes left, and an absence-based rule would be\n * dead code. The mirror is a net precisely because a read can *correct* a stale\n * run entry, and because adoption *materialises* the corrected value back into\n * the run so the doc converges.\n *\n * ## Phase A compat register (this file's entries)\n *\n * | # | Scaffolding | Removal trigger |\n * | - | ------------------------------------ | ------------------------------------------------------------------ |\n * | 1 | flat-map mirror write (write/reset/delete/clear) | Phase B: dual-write and multi-run are mutually exclusive |\n * | 2 | flat-map read resolution | Phase B, after (1), and only after adoption ran on every live room |\n * | 3 | `adoptLegacyRuntime` | Phase B, after (1) |\n * | 4 | version 1 branch + `UNSESSIONED_RUN_ID` | when `flow-manager` stops ticking legacy, unmigrated flows |\n *\n * Adoption itself is additionally **flag-gated and default OFF** until every\n * writer of flow runtime state — in this repo *and* in `flow-manager` and\n * `flow-agent` — routes through this file. See\n * {@link isLegacyRuntimeAdoptionEnabled} and §9.3 The adoption gate.\n */\n\n/** Top-level Y.Doc map owning every run. */\nexport const RUNS_MAP_KEY = 'runs';\n\n/** Top-level Y.Doc map owning the write-once terminal (closed/cancelled) latch per run. */\nexport const RUNS_TERMINAL_MAP_KEY = 'runsTerminal';\n\n/**\n * The pre-runs flat map, keyed by blockId. Still a live write target for\n * already-deployed clients, which is why every write mirrors into it and every\n * read falls back to it.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: when `writeActionState` no longer mirrors\n * and `readActionState` no longer falls back (compat register items 1 and 2).\n */\nexport const LEGACY_RUNTIME_MAP_KEY = 'runtime';\n\n/**\n * The run id `resolveRunIdForExecution` hands back for a **legacy, unmigrated**\n * document — one that predates sessions and has no run container at all.\n *\n * It addresses nothing. Under version 1 with no container, reads resolve to the\n * flat map and writes go flat-only, so this value is never used as a key in the\n * doc. It exists because the execution boundary's signature returns a `string`\n * and `flow-manager`'s `resolveSessionRunId` calls it on every tick of every\n * legacy flow.\n *\n * **Deliberately not exported.** Its predecessor (`LEGACY_RUN_ID`) was a public\n * constant, and other repos built ownership semantics on it — `sessionRunId ??\n * LEGACY_RUN_ID` — which made a document-shaped question answerable by a\n * hard-coded string. Ownership now lives in the data: migration stamps a real\n * run id onto every previously-untagged record.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: when `flow-manager` stops ticking legacy\n * flows, the version 1 branch of `resolveRunIdForExecution` loses its last\n * caller and this goes with it (compat register item 4).\n */\nconst UNSESSIONED_RUN_ID = '__unsessioned__';\n\n/**\n * Whether a record written with `recordRunId` belongs to `sessionRunId`.\n *\n * Records written before sessions existed carry no `sessionRunId` at all. They\n * belong to the unsessioned document, so they match only while the flow is\n * still unmigrated — migration stamps the real run id onto every one of them,\n * after which this is a plain equality test and no record is ownerless.\n *\n * Every \"does this record belong to this session\" test goes through here, so\n * the answer cannot drift between the readers of commands, leases, ledger\n * entries and invocations.\n */\nexport function isRecordInRun(recordRunId: string | undefined, sessionRunId: string): boolean {\n return (recordRunId ?? UNSESSIONED_RUN_ID) === sessionRunId;\n}\n\n/**\n * The run id to report for a record whose own `sessionRunId` may be absent.\n *\n * Readers hand back types that require the field, so an untagged record needs\n * *some* answer. When the caller asked for a specific session the record has\n * already matched it, so that is the honest owner; otherwise it is unsessioned.\n * Callers must not substitute a literal here — the sentinel stays private so it\n * cannot become load-bearing outside this file again.\n */\nexport function resolveRecordRunId(recordRunId: string | undefined, requestedRunId?: string): string {\n return recordRunId ?? requestedRunId ?? UNSESSIONED_RUN_ID;\n}\n\n/**\n * The container id that pre-migration builds created on every connect.\n *\n * Never an addressing constant — the only code allowed to name it is\n * {@link collectPhantomLegacyRun}, which deletes it. A phantom's action states\n * are also in the flat map by the version 1 dual-write, so deleting the\n * container loses nothing.\n */\nconst PHANTOM_LEGACY_RUN_ID = 'r-0000-legacy';\n\n/**\n * Root metadata key describing which runtime layout is authoritative.\n *\n * Version 1 is the Phase A coexistence layout: one legacy run plus the flat\n * `runtime` mirror. Version 2 is the multi-run layout: every caller supplies a\n * run id and the flat map is neither read nor written.\n */\nexport const RUN_STORAGE_VERSION_KEY = 'runStorageVersion';\n\nexport type RunStorageVersion = 1 | 2;\n\n/**\n * The Phase A layout. Inferred for a document that carries pre-session history,\n * or declared by one that pins the key — never a fallback for a document whose\n * key is simply absent. Production writes only version 2 (migration and\n * `startRun`); the declared form exists so a caller that must pin the\n * coexistence layout, chiefly a test exercising the flat-map mirror, can say so\n * instead of relying on a default that no longer points that way.\n */\nexport const LEGACY_RUN_STORAGE_VERSION: RunStorageVersion = 1;\n\n/** The Phase B layout used by explicit, parallel runs. */\nexport const MULTI_RUN_STORAGE_VERSION: RunStorageVersion = 2;\n\n/**\n * Keys that live in the flat `runtime` map but are not blocks. Never adopted.\n *\n * DM notification dedup state used to squat here as `__dm_notifications` and\n * `__dm_notifications_pending`; it now has its own map, but already-deployed\n * clients still write the legacy keys. Adopting them would manufacture phantom\n * \"actions\" that later get quantified over as if they were blocks.\n */\nexport const RESERVED_RUNTIME_KEY_PREFIX = '__';\n\n// ─── The adoption gate ──────────────────────────────────────────────────────\n\n/**\n * **The one switch controlling whether adoption materialises. Default OFF.**\n *\n * ## The flip condition — it is CROSS-REPO, and that is not a detail\n *\n * > **Every writer of flow runtime state in `editor`, `flow-manager` AND\n * > `flow-agent` routes through this waist. Not most writers. Every one, in\n * > every repo.**\n *\n * A grep of `editor/src` is **not** that condition and never was. §9.6 of the\n * design doc names both orchestrators as live writers of flow runtime state.\n * `flow-agent` lives in this repo and is converted. `flow-manager` does not and\n * is not: it is pinned to a pre-runs editor version and still carries\n *\n * 1. a private duplicate of `createYDocRuntimeManager` over `doc.getMap('runtime')`,\n * 2. a raw `_yRuntime: doc.getMap('runtime')` synthetic editor, and\n * 3. a flat-only **downgrade** — `{ state: 'failed', … }` with no `executedAt`.\n *\n * (3) is the strand, end to end: a browser dual-writes `awaiting_readback` to\n * both sides, flow-manager writes flat-only `failed`, and\n * {@link resolveActionState} then abstains at rule (a) (both started), skips\n * rule (b) (no `executedAt` on the flat side), and rule (c) ranks\n * `awaiting_readback` **above** `failed` — so the run entry wins and a genuine\n * failure verdict is invisible forever. CRDT history is immutable: no\n * convergence path, no repair possible in code.\n *\n * Converting flow-manager needs a published editor version whose exported\n * managers are run-scoped, so the sequence is **publish → bump → convert → then\n * flip**. Do not flip before the third arrow.\n *\n * ## Why a switch at all\n *\n * Adoption is a **writer**: it materialises the freshness predicate's winner\n * into `runs[…].actions`, in every live room, the moment it runs. The predicate\n * is deliberately **non-downgrading** — rule (a) of {@link resolveActionState},\n * \"a started side beats an unstarted side\" — which is what stops an old tab's\n * completed payment reading as `idle`.\n *\n * The corollary is the trap. A legitimate transition to a **lower** state — a\n * user pressing \"Reset\", a checkbox being unchecked, a read-back returning a\n * proof *failure* — that is written **flat-only** can never be materialised into\n * the run, because the predicate refuses the downgrade. The run entry then keeps\n * the stale higher state **forever**.\n *\n * That failure inverts the bug the predicate fixed. With a stale `completed`\n * run entry, a legitimate reset-then-re-run resolves `prev.state === 'completed'`,\n * so the completion guard `prev.state !== 'completed'` is false, `step.completed`\n * is never emitted, and downstream listeners never queue. Instead of\n * double-firing, the flow **stalls**. Same root cause, opposite symptom.\n *\n * ## Why BOTH a flag and a guard — do not delete this again\n *\n * This flag was once deleted on the argument that \"a tripwire satisfiable by\n * editing one constant is not a gate\". That argument is **correct about flags\n * and wrong about the conclusion.** A flag alone is weak, so it is not alone:\n *\n * - the **guard** (`no-runtime-writer-outside-waist.test.ts`) is what makes the\n * condition *checkable* inside this repo, and it can only ever see this repo;\n * - the **flag** is what keeps adoption inert for the part of the condition no\n * test in this repo can check — another repo's writers — and what makes the\n * flip a single, reviewable, attributable line rather than a side effect of\n * whichever PR happened to convert the last local call site.\n *\n * Deleting either one leaves the other covering a hole it structurally cannot\n * reach. Both stay until the cross-repo condition above is actually met.\n *\n * ## Where it is enforced\n *\n * Inside {@link adoptLegacyRuntime} itself, so no call site can forget it, and\n * a future third call site inherits the gate for free. The two known call sites\n * (the adopt effect in `useCollaborativeIxoEditor`, and the headless one in\n * `flowCompiler/setup.ts`) also check {@link isLegacyRuntimeAdoptionEnabled}\n * explicitly, so the gate is visible where the decision is read.\n *\n * `ensureRun` is deliberately **not** gated: creating an empty run container is\n * harmless and idempotent, and doing it now means the container already exists\n * when the flag flips. It is *materialising stale winners* that must wait.\n */\nconst LEGACY_RUNTIME_ADOPTION_DEFAULT = false;\n\nlet legacyRuntimeAdoptionEnabled = LEGACY_RUNTIME_ADOPTION_DEFAULT;\n\n/**\n * Whether {@link adoptLegacyRuntime} may materialise. Read it; never cache it.\n *\n * See {@link LEGACY_RUNTIME_ADOPTION_DEFAULT} for the flip condition.\n */\nexport function isLegacyRuntimeAdoptionEnabled(): boolean {\n return legacyRuntimeAdoptionEnabled;\n}\n\n/**\n * **Test seam only.** Tests need adoption ON to test adoption at all; production\n * must never be able to reach that state by accident.\n *\n * Three things keep this honest:\n * 1. `runs.ts` is not re-exported from `src/index.ts` or `src/core/index.ts`, so\n * this function is not reachable from the published package surface at all;\n * 2. the name says what it is;\n * 3. it throws outside a test runner, so a stray call in app code fails loudly\n * at the call rather than silently switching a writer on in a live room.\n *\n * Always restore the previous value in an `afterEach` — module state is shared\n * across tests in a file.\n */\nexport function __setLegacyRuntimeAdoptionEnabledForTests(enabled: boolean): void {\n if (!isTestRunner()) {\n throw new Error('[runs] __setLegacyRuntimeAdoptionEnabledForTests is a test-only seam — see §9.3 The adoption gate');\n }\n legacyRuntimeAdoptionEnabled = enabled;\n}\n\n/**\n * True only under a test runner (vitest sets both of these). Read through\n * `globalThis` because this package is bundled for the browser, where `process`\n * may not exist at all.\n */\nfunction isTestRunner(): boolean {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env;\n return !!env && (env.NODE_ENV === 'test' || !!env.VITEST);\n}\n\nexport interface RunMeta {\n /** Monotonic per-flow sequence number, for humans and ordering. */\n seq: number;\n startedAt: number;\n startedByDid?: string;\n label?: string;\n /**\n * How this run came to exist. `'migrated'` marks the single session that\n * absorbed a legacy document's pre-session history; it is an ordinary session\n * in every other respect.\n */\n origin?: 'started' | 'migrated';\n /**\n * Frozen when the run is created: the sequenced action block ids in this run\n * plus a hash of the compiled graph.\n *\n * **A run without one is not a session.** It is a phantom from a build that\n * created containers on connect, and the lifecycle refuses to close it rather\n * than computing a summary against the live document.\n */\n manifest?: { blockIds: string[]; defHash: string };\n}\n\nexport interface RunTerminalRecord {\n status: 'closed' | 'cancelled';\n at: number;\n by?: string;\n closeInvocationCid?: string;\n /** Matrix event that won the terminal transition. */\n terminalEventId?: string;\n /** Per-block `isDone` snapshotted at close time. Phase B populates it. */\n summary?: Record<string, boolean>;\n}\n\nconst META_KEY = 'meta';\nconst ACTIONS_KEY = 'actions';\nconst PENDING_INVOCATIONS_KEY = 'pendingInvocations';\nconst BARRIER_STATE_KEY = 'barrierState';\n\n// ─── The freshness predicate ────────────────────────────────────────────────\n//\n// Everything below returns a defensive copy, matching the flat map's historical\n// `{ ...stored }` contract. Callers mutate what they read (`runtime.output.x = …`\n// happens in FlowDetails), so nothing may ever hand out a reference into the doc.\n\n/**\n * Progress rank over the real {@link NodeState} union. Higher = more advanced.\n *\n * This is only ever consulted as a tiebreak *within* a started/unstarted class\n * (see {@link resolveActionState} rule (a)), so the exact ordering matters far\n * less than it being total and identical on every peer. Where the ordering is\n * genuinely arguable it is resolved by asking **which direction of downgrade is\n * dangerous**:\n *\n * - `cancelled` above `running` — a deliberate stop must not be reanimated into\n * an in-flight execution.\n * - `awaiting_readback` and `needs_verification` above `failed` — both mean the\n * side effect may already have happened. `failed` is retryable; downgrading\n * into it re-arms the auto-execute gate and double-executes. Downgrading the\n * other way merely leaves a block waiting, which is inert.\n * - `retry_scheduled` above `failed`, and `awaiting_human` above both: a\n * headless writer already owns the next transition. Replacing either wait\n * with a generic failure can queue duplicate work.\n * - `completed` highest — the resolved terminal state, including the\n * `manuallyVerified` path out of `needs_verification`.\n */\nconst NODE_STATE_RANK: Record<NodeState, number> = {\n idle: 0,\n pending: 1,\n running: 2,\n cancelled: 3,\n failed: 4,\n retry_scheduled: 5,\n awaiting_readback: 6,\n awaiting_human: 7,\n needs_verification: 8,\n completed: 9,\n};\n\n/** Rank of a possibly-absent state. An absent state sorts below `idle`. */\nfunction rankOf(state: NodeState | undefined): number {\n if (!state) return -1;\n const rank = NODE_STATE_RANK[state];\n return typeof rank === 'number' ? rank : -1;\n}\n\n/** Whether a string is a state this build understands. Keyed off the rank table\n * so a new `NodeState` can never be known to one and unknown to the other. */\nfunction isKnownNodeState(state: string): state is NodeState {\n return Object.prototype.hasOwnProperty.call(NODE_STATE_RANK, state);\n}\n\n/**\n * \"Unstarted\" = the block has not been acted on: no `state` at all, or the\n * `idle` that `initializeRuntime` seeds. Everything else means *something\n * happened* — including `failed` and `cancelled`.\n */\nfunction isStarted(entry: FlowNodeRuntimeState): boolean {\n return !!entry.state && entry.state !== 'idle';\n}\n\n/**\n * Deep copy of an action-state value.\n *\n * A **shallow** `{ ...value }` is not enough, and the difference is a lost\n * payment proof rather than a style point. Yjs stores a plain object *by\n * reference*, so with a shallow copy the nested `output` / `error` / `readBack`\n * objects are shared between the run entry, the flat mirror and the value handed\n * back to the caller. Then:\n *\n * ```ts\n * const { next } = writeActionState(doc, runId, blockId, { output: { transactionHash: '0xA' } });\n * next.output.transactionHash = '0xB';\n * ```\n *\n * silently rewrites **both** stored values with **no Yjs transaction, no update\n * event and no observer** — so every remote peer stays on `0xA` forever and\n * nothing anywhere reports a problem. Deep-copying at the boundary makes the\n * stored state unreachable except through a real write.\n */\nfunction cloneState<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value;\n try {\n return structuredClone(value);\n } catch {\n // Non-cloneable payload (a function, a symbol, a live Y type). Fall back to\n // a JSON round-trip, which is lossy in exactly the cases that must not be in\n // action state anyway, and never returns a shared reference.\n try {\n return JSON.parse(JSON.stringify(value)) as T;\n } catch {\n return value;\n }\n }\n}\n\n/**\n * `undefined` unless the value is a usable action-state object.\n *\n * **Total by contract.** The parameter is `unknown`, so this is the only place\n * hostile input can be rejected, and {@link resolveActionState}'s determinism\n * depends on it: a value that is truthy but not a real state object would count\n * as \"started\" under rule (a) and win against a genuine entry, and a `NaN`\n * `executedAt` makes rule (b)'s comparison **asymmetric** — `NaN > x` and\n * `x > NaN` are both false — so two clients could resolve the same pair\n * differently and the generations would diverge again.\n */\nfunction asStateObject(value: unknown): FlowNodeRuntimeState | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n // Only a plain object. A live Y.Map (or any class instance) that found its way\n // in is not action state and must not be treated as one.\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) return undefined;\n\n const entry = value as FlowNodeRuntimeState;\n const state = entry.state;\n const at = entry.executedAt;\n const stateUsable = state === undefined || (typeof state === 'string' && isKnownNodeState(state));\n const atUsable = at === undefined || (typeof at === 'number' && Number.isFinite(at));\n if (stateUsable && atUsable) return entry;\n\n // Normalise rather than discard: the rest of the entry (output, error) is\n // still the only record of what happened. Drop only the unusable fields, so\n // an unknown state reads as unstarted and a non-finite timestamp is absent.\n const normalised: FlowNodeRuntimeState = { ...entry };\n if (!stateUsable) delete normalised.state;\n if (!atUsable) delete normalised.executedAt;\n return normalised;\n}\n\n/** Which generation's entry won the resolution. `'neither'` = both absent. */\nexport type ActionStateWinner = 'run' | 'flat' | 'neither';\n\nexport interface ResolvedActionState {\n /** Defensive copy of the winning entry; `{}` when both sides are absent. */\n value: FlowNodeRuntimeState;\n winner: ActionStateWinner;\n}\n\n/**\n * **The one freshness predicate.** Given a run entry and a flat `runtime` entry\n * — either or both may be absent — return the more advanced one.\n *\n * Pure, synchronous, deterministic, no I/O, no doc access. Every peer resolves\n * a given pair identically; if it did not, the two generations would diverge\n * again and the whole dual-write scheme would be pointless.\n *\n * The rule this replaces was **absence-based**: \"use the flat entry only when\n * the run has none.\" That is dead code in practice — `initializeRuntime` seeds\n * `{state:'idle'}` into the flat map for *every* block at flow setup, so the\n * first adoption creates a run entry for every block and there is never a hole\n * again. Every later flat write (an old tab completing a payment, a\n * not-yet-upgraded flow-manager finishing a claim, or the flat mirror of a\n * container that lost the concurrent-create race) would be invisible forever:\n * the block reads `idle`, the auto-execute gate re-arms, and the side effect\n * fires a **second time**.\n *\n * Resolution order:\n *\n * 1. **A started side beats an unstarted side.** This is the anti-double-\n * execution rule and it dominates every other consideration — a stale `idle`\n * must never win against evidence that something ran, no matter how new its\n * timestamp or how it ranks.\n * 2. Else, if both carry an `executedAt` and they differ, the newer wins.\n * 3. Else, if the state ranks differ, the higher rank wins ({@link NODE_STATE_RANK}).\n * 4. Else the run entry wins — a deterministic tiebreak that preserves the\n * local write and makes adoption idempotent (a materialised value resolves\n * back to `'run'` on the next pass, so nothing is rewritten).\n *\n * ## The sharp edge in rule (d) — known, bounded, and deliberately not \"fixed\"\n *\n * Rules (b) and (c) can both abstain: (b) needs a numeric `executedAt` on BOTH\n * sides, (c) needs the ranks to differ. So two entries that are both started, at\n * the same rank, with no numeric `executedAt` on either side, fall through to\n * (d) — and the run entry wins **even though the two carry different payloads**.\n * A flat entry `{state:'completed', output:{txHash:'0xB'}}` written by an\n * already-deployed client is then shadowed by a run entry\n * `{state:'completed', output:{txHash:'0xA'}}`, permanently, and adoption\n * reports nothing to converge.\n *\n * Three things bound it:\n *\n * 1. Every writer in this repo goes through {@link writeActionState}, which\n * dual-writes the *identical* object, so the run and flat entries of a\n * same-generation write are never different-but-equal-rank.\n * 2. Divergence therefore needs an already-deployed client writing flat-only,\n * AND both sides landing on the same rank, AND neither side carrying a\n * numeric `executedAt`. The kernel's success path (`actionExecutor`) and the\n * read-back completion path both stamp `executedAt`, which is what makes (b)\n * fire for the realistic completion race.\n * 3. The residue is genuinely ambiguous — two peers claiming the same state with\n * no ordering information between them. Any rule here is arbitrary; what is\n * NOT optional is that the rule be **total and identical on every peer**, or\n * the two generations diverge again. (d) buys that, and it is what makes\n * adoption idempotent.\n *\n * ### The one reachable instance, found by probing (severity: payload, not state)\n *\n * The *failure* writes do not stamp `executedAt` — deliberately, since\n * `executedAt` means \"timestamp of last completion\":\n * `actionExecutor#updateRuntimeFailure` (`{state:'failed', error}`), its\n * `PROOF_MISSING` sibling (`{state:'needs_verification'|'failed', output,\n * error}`), and `readBackReconciler`'s failure branch. If an already-deployed\n * client independently fails the same block flat-only, both sides land on the\n * same rank with no numeric `executedAt` on the flat side, and (d) keeps the run\n * entry's `error`/`output`.\n *\n * What that costs is bounded and worth stating exactly: **the two sides always\n * agree on the state**, so neither the auto-execute gate nor the\n * `prev.state !== 'completed'` completion guard can behave differently — no\n * double execution, no stall. What can be shadowed is the `error.message`, the\n * retained `output`, and the `readBack` metadata. For `needs_verification` that\n * payload is the evidence a human verifier reads, so it is a real if minor\n * correctness cost.\n *\n * It is **not** patched here. Stamping `executedAt` on failure would redefine\n * the field (CLAUDE.md: \"timestamp of last completion\") for every consumer,\n * including TTL logic and both orchestrators — a behaviour change that must be\n * made deliberately, not smuggled in under a predicate fix.\n *\n * And do not \"improve\" (d) with a deep-equality or field-count comparison:\n * those are not total orders, they differ under key insertion order, and they\n * would cost adoption its idempotence. Where a payload genuinely matters, the\n * fix is to make **that writer** carry an ordering key, never to loosen the\n * predicate.\n */\nexport function resolveActionState(runEntry: unknown, flatEntry: unknown): ResolvedActionState {\n const run = asStateObject(runEntry);\n const flat = asStateObject(flatEntry);\n\n if (!run && !flat) return { value: {}, winner: 'neither' };\n if (!run) return { value: cloneState(flat as FlowNodeRuntimeState), winner: 'flat' };\n if (!flat) return { value: cloneState(run), winner: 'run' };\n\n const runWins = (): ResolvedActionState => ({ value: cloneState(run), winner: 'run' });\n const flatWins = (): ResolvedActionState => ({ value: cloneState(flat), winner: 'flat' });\n\n // (a) Started beats unstarted. Dominates everything below.\n const runStarted = isStarted(run);\n const flatStarted = isStarted(flat);\n if (runStarted !== flatStarted) return runStarted ? runWins() : flatWins();\n\n // (b) Newer execution wins, when both sides claim one.\n const runAt = typeof run.executedAt === 'number' ? run.executedAt : undefined;\n const flatAt = typeof flat.executedAt === 'number' ? flat.executedAt : undefined;\n if (runAt !== undefined && flatAt !== undefined && runAt !== flatAt) {\n return runAt > flatAt ? runWins() : flatWins();\n }\n\n // (c) More advanced state wins.\n const runRank = rankOf(run.state);\n const flatRank = rankOf(flat.state);\n if (runRank !== flatRank) return runRank > flatRank ? runWins() : flatWins();\n\n // (d) Otherwise prefer the better-evidenced side: when exactly one carries a\n // usable `executedAt`, take it. Without this, the rule (e) tiebreak discards\n // whichever side happens to be the flat one, so a genuine timestamp is lost\n // to a bare duplicate of the same state — and the resolved VALUE depends on\n // which map the entry sat in rather than on what it says. That asymmetry is\n // invisible in production (callers always pass run first) which is precisely\n // why it survived review; a symmetry test over hostile pairs caught it.\n if (runAt !== undefined && flatAt === undefined) return runWins();\n if (flatAt !== undefined && runAt === undefined) return flatWins();\n\n // (e) Deterministic tiebreak: the run entry.\n return runWins();\n}\n\n/** The runs container. Re-resolve on every call; never cache the result. */\nexport function getRunsMap(yDoc: Y.Doc): Y.Map<Y.Map<unknown>> {\n return yDoc.getMap<Y.Map<unknown>>(RUNS_MAP_KEY);\n}\n\n/** Existing runs container, without materialising it on a read-only document. */\nexport function getExistingRunsMap(yDoc: Y.Doc): Y.Map<Y.Map<unknown>> | undefined {\n return getExistingYMap<Y.Map<unknown>>(yDoc, RUNS_MAP_KEY);\n}\n\n/** The write-once terminal latch map. Re-resolve on every call. */\nexport function getRunsTerminalMap(yDoc: Y.Doc): Y.Map<RunTerminalRecord> {\n return yDoc.getMap<RunTerminalRecord>(RUNS_TERMINAL_MAP_KEY);\n}\n\n/** Existing terminal container, without materialising it during inspection. */\nexport function getExistingRunsTerminalMap(yDoc: Y.Doc): Y.Map<RunTerminalRecord> | undefined {\n return getExistingYMap<RunTerminalRecord>(yDoc, RUNS_TERMINAL_MAP_KEY);\n}\n\n/**\n * The legacy flat runtime map.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: when nothing in this file references\n * `LEGACY_RUNTIME_MAP_KEY` (compat register items 1, 2 and 3).\n */\nfunction getLegacyRuntimeMap(yDoc: Y.Doc): Y.Map<FlowNodeRuntimeState> {\n return yDoc.getMap<FlowNodeRuntimeState>(LEGACY_RUNTIME_MAP_KEY);\n}\n\nfunction getExistingLegacyRuntimeMap(yDoc: Y.Doc): Y.Map<FlowNodeRuntimeState> | undefined {\n return getExistingYMap<FlowNodeRuntimeState>(yDoc, LEGACY_RUNTIME_MAP_KEY);\n}\n\n/**\n * Read the document's runtime layout without mutating it.\n *\n * **Sessions are the default; the Phase A layout is not a fallback.** A missing\n * version key is not evidence of a legacy document — it is the state of every\n * document nobody has latched yet, including ones created moments ago by paths\n * that copy a doc rather than compile one (template instantiation, protocol\n * import). Treating the absent key as version 1 made those flows demand a\n * migration that would move nothing.\n *\n * So the discriminator is the *presence of pre-session history*, the same\n * predicate the compiler latches on. Version 1 is reported only for a document\n * that actually has flat-map history to migrate; everything else is version 2,\n * whether or not it carries the key. An explicit key always wins — that is what\n * `migrateFlowToSessions` writes to make the transition permanent, and it is\n * what keeps a migrated document on version 2 after its history is seeded into\n * the first session.\n */\nexport function getRunStorageVersion(yDoc: Y.Doc): RunStorageVersion {\n assertDoc(yDoc, 'getRunStorageVersion');\n const declared = getExistingYMap(yDoc, 'root')?.get(RUN_STORAGE_VERSION_KEY);\n if (declared === MULTI_RUN_STORAGE_VERSION) return MULTI_RUN_STORAGE_VERSION;\n if (declared === LEGACY_RUN_STORAGE_VERSION) return LEGACY_RUN_STORAGE_VERSION;\n return hasLegacyRuntimeHistory(yDoc) ? LEGACY_RUN_STORAGE_VERSION : MULTI_RUN_STORAGE_VERSION;\n}\n\n/** Whether flat-map compatibility is still part of this document's interface. */\nexport function usesLegacyRuntimeCompatibility(yDoc: Y.Doc): boolean {\n return getRunStorageVersion(yDoc) === LEGACY_RUN_STORAGE_VERSION;\n}\n\nexport class ExplicitRunRequiredError extends Error {\n constructor(message = 'Multi-run execution requires an explicit session run id.') {\n super(message);\n this.name = 'ExplicitRunRequiredError';\n }\n}\n\nexport class UnknownRunError extends Error {\n constructor(public readonly runId: string) {\n super(`Unknown session run \"${runId}\".`);\n this.name = 'UnknownRunError';\n }\n}\n\nexport class TerminalRunExecutionError extends Error {\n constructor(\n public readonly runId: string,\n public readonly blockId: string\n ) {\n super(`Run \"${runId}\" is terminal; sequenced action \"${blockId}\" cannot execute.`);\n this.name = 'TerminalRunExecutionError';\n }\n}\n\n/** Definition flag shared by manifest construction, execution guards and UI. */\nexport function isBelowTheLineBlock(\n block:\n | {\n props?: Record<string, unknown>;\n }\n | null\n | undefined\n): boolean {\n const props = block?.props || {};\n return props.belowTheLine === true || props.sequenced === false || props.runScope === 'below-the-line' || props.executionLane === 'below-the-line';\n}\n\n/**\n * Resolve an execution target without turning the advisory active-run pointer\n * into authority. Version 2 requires a real, named run supplied by the caller.\n *\n * Version 1 is a legacy, unmigrated document. It has no run container and never\n * gains one from a write: the returned {@link UNSESSIONED_RUN_ID} addresses\n * nothing, reads resolve to the flat map, and writes go flat-only. That is the\n * pre-session behaviour, preserved exactly, until the flow is migrated.\n */\nexport function resolveRunIdForExecution(yDoc: Y.Doc, requestedRunId?: string): string {\n assertDoc(yDoc, 'resolveRunIdForExecution');\n if (usesLegacyRuntimeCompatibility(yDoc)) {\n return requestedRunId || resolveActiveRunId(yDoc) || UNSESSIONED_RUN_ID;\n }\n if (!requestedRunId) throw new ExplicitRunRequiredError();\n if (!getExistingRunsMap(yDoc)?.has(requestedRunId)) {\n throw new UnknownRunError(requestedRunId);\n }\n return requestedRunId;\n}\n\n/**\n * Ordinary sequenced actions stop with the run. Explicit below-the-line\n * actions remain available for post-close work and continue appending history.\n */\nexport function assertRunActionExecutionAllowed(yDoc: Y.Doc, runId: string, block: { id?: string; props?: Record<string, unknown> }): void {\n if (!getExistingRunsMap(yDoc)?.has(runId) && !usesLegacyRuntimeCompatibility(yDoc)) {\n throw new UnknownRunError(runId);\n }\n if (getExistingRunsTerminalMap(yDoc)?.has(runId) && !isBelowTheLineBlock(block)) {\n throw new TerminalRunExecutionError(runId, block.id || 'unknown');\n }\n}\n\nfunction assertDoc(yDoc: Y.Doc | null | undefined, fn: string): asserts yDoc is Y.Doc {\n if (!yDoc || typeof (yDoc as Y.Doc).getMap !== 'function') {\n throw new Error(`[runs] ${fn} requires a Y.Doc — refusing to fall back to non-persistent state`);\n }\n}\n\n/**\n * Create the run container if it is missing. Transactional, idempotent, and\n * safe against the concurrent-create race.\n *\n * **The race:** two clients concurrently doing `runs.get(id) ?? new Y.Map()`\n * produce two detached `Y.Map`s. The merge keeps one and *silently discards\n * everything ever written into the loser*, with no error. Phase A aggravates\n * this whenever two clients start or migrate the same flow at once.\n * The in-transaction re-check closes the local window; the flat mirror written\n * by {@link writeActionState} is the second net that makes the remote window\n * survivable.\n *\n * Returns the LIVE container. **Never cache it across a tick** — a losing merge\n * orphans the reference and subsequent writes vanish with no error.\n */\nexport function ensureRun(yDoc: Y.Doc, runId: string, meta?: Partial<RunMeta>): Y.Map<unknown> {\n assertDoc(yDoc, 'ensureRun');\n let run = getRunsMap(yDoc).get(runId);\n if (!run) {\n yDoc.transact(() => {\n // Re-resolve and re-check INSIDE the transaction: another local writer may\n // have created it between the read above and here.\n const runs = getRunsMap(yDoc);\n if (!runs.get(runId)) {\n const created = new Y.Map<unknown>();\n created.set(META_KEY, { seq: 0, startedAt: Date.now(), ...meta } satisfies RunMeta);\n created.set(ACTIONS_KEY, new Y.Map<FlowNodeRuntimeState>());\n runs.set(runId, created);\n }\n });\n // Re-read from the doc rather than returning the local object: after a\n // losing merge the object we constructed is not the one in the doc.\n run = getRunsMap(yDoc).get(runId)!;\n }\n return run;\n}\n\n/**\n * The run's actions map, re-resolved from the doc on every call.\n * Returns `undefined` if the run does not exist — this is a pure read and must\n * never write (a read-only viewer calls it).\n */\nexport function getRunActionsMap(yDoc: Y.Doc, runId: string): Y.Map<FlowNodeRuntimeState> | undefined {\n assertDoc(yDoc, 'getRunActionsMap');\n const run = getExistingRunsMap(yDoc)?.get(runId);\n if (!run) return undefined;\n const actions = run.get(ACTIONS_KEY);\n return isYMapLike<FlowNodeRuntimeState>(actions) ? actions : undefined;\n}\n\n/**\n * Read a named run-scoped CRDT container without creating it.\n *\n * Execution-adjacent state such as pending invocations and barrier progress\n * belongs beside `actions` in Phase B. Keeping the container lookup in this\n * waist prevents callers from learning or duplicating the nested runs layout.\n */\nexport function getRunScopedMap<T = unknown>(yDoc: Y.Doc, runId: string, key: string): Y.Map<T> | undefined {\n assertDoc(yDoc, 'getRunScopedMap');\n const value = getExistingRunsMap(yDoc)?.get(runId)?.get(key);\n return isYMapLike<T>(value) ? value : undefined;\n}\n\n/** Resolve a named run-scoped CRDT container, creating it when absent. */\nexport function ensureRunScopedMap<T = unknown>(yDoc: Y.Doc, runId: string, key: string): Y.Map<T> {\n assertDoc(yDoc, 'ensureRunScopedMap');\n const run = ensureRun(yDoc, runId);\n const existing = run.get(key);\n if (isYMapLike<T>(existing)) return existing;\n run.set(key, new Y.Map<T>());\n return getRunScopedMap<T>(yDoc, runId, key)!;\n}\n\n/** Read a run's `meta`. Returns `undefined` when the run does not exist. */\nexport function getRunMeta(yDoc: Y.Doc, runId: string): RunMeta | undefined {\n assertDoc(yDoc, 'getRunMeta');\n const run = getExistingRunsMap(yDoc)?.get(runId);\n const meta = run?.get(META_KEY);\n if (!meta || typeof meta !== 'object') return undefined;\n return { ...(meta as RunMeta) };\n}\n\n/**\n * Resolve the run's actions map, creating the run (and the `actions` container\n * on a run written by a client that did not create one) if needed.\n * Callers must already be inside — or be about to open — a transaction.\n */\n/**\n * The actions container a write should land in, or `undefined` when the write\n * belongs only in the flat map.\n *\n * **This is what keeps an unstarted flow sessionless.** Materialising a run\n * because someone wrote to it is how a document that never had a session grew\n * one on first execution — and a container created that way has no manifest, so\n * it can never be closed. A write therefore never creates a run:\n *\n * - version 1 (legacy, unmigrated): no container, so `undefined` → flat-only,\n * which is exactly the pre-session behaviour;\n * - version 2: a run id that names nothing is a caller bug, so it throws.\n *\n * Runs are created in exactly two places, both deliberate and both carrying a\n * frozen manifest: `startRun` and `migrateFlowToSessions`.\n */\nfunction resolveActionsForWrite(yDoc: Y.Doc, runId: string): Y.Map<FlowNodeRuntimeState> | undefined {\n if (!getExistingRunsMap(yDoc)?.has(runId)) {\n if (usesLegacyRuntimeCompatibility(yDoc)) return undefined;\n throw new UnknownRunError(runId);\n }\n return ensureRunActions(yDoc, runId);\n}\n\nfunction ensureRunActions(yDoc: Y.Doc, runId: string): Y.Map<FlowNodeRuntimeState> {\n ensureRun(yDoc, runId);\n const existing = getRunActionsMap(yDoc, runId);\n if (existing) return existing;\n // Defensive: a run container that lost the `actions` sub-map (a peer created\n // the container differently, or a merge dropped it). Re-resolve after writing.\n const run = getRunsMap(yDoc).get(runId)!;\n run.set(ACTIONS_KEY, new Y.Map<FlowNodeRuntimeState>());\n return getRunActionsMap(yDoc, runId)!;\n}\n\nexport interface MultiRunMigrationResult {\n actionStates: number;\n pendingInvocations: number;\n barrierEntries: number;\n}\n\nfunction copyNestedMapIntoRun(yDoc: Y.Doc, runId: string, key: string): number {\n const source = yDoc.getMap<Y.Map<unknown>>(key);\n const target = ensureRunScopedMap<Y.Map<unknown>>(yDoc, runId, key);\n let copied = 0;\n source.forEach((sourceInner, outerKey) => {\n if (!isYMapLike(sourceInner)) return;\n let targetInner = target.get(outerKey);\n if (!isYMapLike(targetInner)) {\n targetInner = new Y.Map<unknown>();\n target.set(outerKey, targetInner);\n }\n sourceInner.forEach((value, innerKey) => {\n if (!targetInner!.has(innerKey)) {\n targetInner!.set(innerKey, cloneState(value));\n copied += 1;\n }\n });\n });\n return copied;\n}\n\n/**\n * Whether this document carries pre-session execution history.\n *\n * True means the flat `runtime` map holds at least one real action state, so\n * migrating produces a session with something in it. Reserved `__`-prefixed\n * keys (DM dedup) are not history: a flow that only ever sent a notification has\n * never executed anything.\n */\nexport function hasLegacyRuntimeHistory(yDoc: Y.Doc): boolean {\n assertDoc(yDoc, 'hasLegacyRuntimeHistory');\n const flat = getExistingLegacyRuntimeMap(yDoc);\n if (!flat) return false;\n let found = false;\n flat.forEach((value, key) => {\n if (found || key.startsWith(RESERVED_RUNTIME_KEY_PREFIX)) return;\n if (asStateObject(value)) found = true;\n });\n return found;\n}\n\n/**\n * Delete the container that pre-migration builds created on every connect.\n *\n * Such a container is not a session — it has no frozen manifest, so the\n * lifecycle cannot close it, yet it is enumerated by every surface that lists\n * runs and therefore shows up as a phantom the user can neither finish nor\n * remove. Returns whether anything was deleted.\n *\n * Collected when deleting it provably loses nothing:\n *\n * - it holds no action states of its own — there is no copy to destroy; or\n * - the document is version 1, where the dual-write guarantees every state in\n * the phantom is also in the flat map.\n *\n * Under version 2 a container that does hold states is the only copy of them,\n * so it is left alone regardless of how it got its name. A run bearing a\n * manifest is a real session and is never touched.\n *\n * The empty case is not hypothetical: a pre-session build created this\n * container on *every connect*, so a flow that was opened but never executed\n * has a phantom and no flat history — and with sessions as the default that\n * document is version 2, where the version gate alone would strand the phantom\n * as an unfinishable, unremovable session.\n */\nexport function collectPhantomLegacyRun(yDoc: Y.Doc): boolean {\n assertDoc(yDoc, 'collectPhantomLegacyRun');\n if (!getExistingRunsMap(yDoc)?.has(PHANTOM_LEGACY_RUN_ID)) return false;\n if (getRunMeta(yDoc, PHANTOM_LEGACY_RUN_ID)?.manifest) return false;\n const phantomActions = getRunActionsMap(yDoc, PHANTOM_LEGACY_RUN_ID);\n if (phantomActions && phantomActions.size > 0 && !usesLegacyRuntimeCompatibility(yDoc)) return false;\n yDoc.transact(() => {\n getRunsMap(yDoc).delete(PHANTOM_LEGACY_RUN_ID);\n getRunsTerminalMap(yDoc).delete(PHANTOM_LEGACY_RUN_ID);\n const root = getExistingYMap(yDoc, 'root');\n if (root?.get('activeRunId') === PHANTOM_LEGACY_RUN_ID) root.delete('activeRunId');\n });\n return true;\n}\n\n/**\n * Seed a newly created run with the document's pre-session history: the\n * freshness winner for every legacy action, plus pending invocations and\n * partial barriers.\n *\n * **Cannot downgrade anything.** The run is created by migration immediately\n * before this call, so every block resolves with no run entry — rule (a) of\n * {@link resolveActionState} makes the flat side the winner every time, and\n * there is nothing on the run side to lose. That is what lets a legacy document\n * be seeded while the global adoption gate remains closed.\n *\n * Does **not** write the version latch: the caller flips it at the end of the\n * same transaction, after every part of the migration has succeeded.\n */\nexport function seedRunFromLegacyRuntime(yDoc: Y.Doc, runId: string): MultiRunMigrationResult {\n assertDoc(yDoc, 'seedRunFromLegacyRuntime');\n const result: MultiRunMigrationResult = { actionStates: 0, pendingInvocations: 0, barrierEntries: 0 };\n\n yDoc.transact(() => {\n const actions = ensureRunActions(yDoc, runId);\n const flat = getLegacyRuntimeMap(yDoc);\n const keys = new Set<string>();\n actions.forEach((_, key) => keys.add(key));\n flat.forEach((_, key) => {\n if (!key.startsWith(RESERVED_RUNTIME_KEY_PREFIX)) keys.add(key);\n });\n for (const key of keys) {\n const resolved = resolveActionState(actions.get(key), flat.get(key)).value;\n actions.set(key, cloneState(resolved));\n result.actionStates += 1;\n }\n\n result.pendingInvocations = copyNestedMapIntoRun(yDoc, runId, PENDING_INVOCATIONS_KEY);\n result.barrierEntries = copyNestedMapIntoRun(yDoc, runId, BARRIER_STATE_KEY);\n });\n return result;\n}\n\n/** Latch the document onto the multi-run layout. */\nexport function setMultiRunStorage(yDoc: Y.Doc): void {\n assertDoc(yDoc, 'setMultiRunStorage');\n yDoc.getMap('root').set(RUN_STORAGE_VERSION_KEY, MULTI_RUN_STORAGE_VERSION);\n}\n\n/**\n * Mark a document as multi-run without migrating anything.\n *\n * For newly created documents, which have no legacy history to carry over, and\n * for tests that build runs explicitly.\n */\nexport function enableMultiRunStorage(yDoc: Y.Doc): void {\n setMultiRunStorage(yDoc);\n}\n\n/**\n * Read a block's action state for a run.\n *\n * **Resolves** the run entry against the flat `runtime[blockId]` through\n * {@link resolveActionState} — it does not merely fall back when the run entry\n * is missing. A run entry that exists but is *staler* than the flat mirror (an\n * old tab or a not-yet-upgraded orchestrator finished the block; or the run\n * entry is the `idle` seed left by `initializeRuntime`) must read as the\n * advanced value, or the auto-execute gate re-arms and the side effect fires\n * twice.\n *\n * Always returns a fresh copy, never a reference into the doc. Never writes —\n * safe on a read-only viewer and before the doc has connected. (Convergence is\n * `adoptLegacyRuntime`'s job, and it is a writer; reads only correct what they\n * hand back.)\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: the flat resolution goes when dual-write\n * goes (compat register item 2), and only after `adoptLegacyRuntime` has run\n * against every live room.\n */\nexport function readActionState(yDoc: Y.Doc, runId: string, blockId: string): FlowNodeRuntimeState {\n assertDoc(yDoc, 'readActionState');\n const runEntry = getRunActionsMap(yDoc, runId)?.get(blockId);\n if (!usesLegacyRuntimeCompatibility(yDoc)) {\n const state = asStateObject(runEntry);\n return state ? cloneState(state) : {};\n }\n const flatEntry = getExistingLegacyRuntimeMap(yDoc)?.get(blockId);\n return resolveActionState(runEntry, flatEntry).value;\n}\n\n/**\n * Enumerate one run through the same interface as {@link readActionState}.\n *\n * During Phase A this iterates the union of run and flat keys and resolves each\n * value through the freshness predicate. During Phase B it reads only the named\n * run. Consumers use this instead of touching either storage container.\n */\nexport function readActionStates(yDoc: Y.Doc, runId: string): Record<string, FlowNodeRuntimeState> {\n assertDoc(yDoc, 'readActionStates');\n const keys = new Set<string>();\n getRunActionsMap(yDoc, runId)?.forEach((_, key) => keys.add(key));\n if (usesLegacyRuntimeCompatibility(yDoc)) {\n getExistingLegacyRuntimeMap(yDoc)?.forEach((_, key) => {\n if (!key.startsWith(RESERVED_RUNTIME_KEY_PREFIX)) keys.add(key);\n });\n }\n const states: Record<string, FlowNodeRuntimeState> = {};\n for (const key of keys) {\n states[key] = readActionState(yDoc, runId, key);\n }\n return states;\n}\n\n/**\n * Merge `updates` into a block's action state.\n *\n * **ONE transaction, ONE `prev` read.** The returned `prev` is the single\n * pre-write snapshot the caller must use for completion guards. Two separate\n * read-modify-write calls (one for the run, one for the mirror) would evaluate\n * `prev.state !== 'completed'` twice → two run records → two pending\n * invocations on every downstream listener → **double execution of a\n * side-effecting action**. That is the single most likely way this project\n * causes a real double payment, so the contract is enforced here rather than\n * left to call sites.\n *\n * `prev` is the **resolved** value ({@link resolveActionState}), not the raw\n * run entry. This is load-bearing for the same guard: if an old tab already\n * completed the block in the flat map while the run still holds the `idle`\n * seed, a raw `prev` would read `idle`, the guard would fire, and\n * `step.completed` would be emitted a second time — one pending invocation per\n * downstream listener, all over again.\n */\nexport function writeActionState(yDoc: Y.Doc, runId: string, blockId: string, updates: Partial<FlowNodeRuntimeState>): { prev: FlowNodeRuntimeState; next: FlowNodeRuntimeState } {\n assertDoc(yDoc, 'writeActionState');\n let prev: FlowNodeRuntimeState = {};\n let next: FlowNodeRuntimeState = {};\n yDoc.transact(() => {\n const actions = resolveActionsForWrite(yDoc, runId);\n const legacyCompatible = usesLegacyRuntimeCompatibility(yDoc);\n const flat = legacyCompatible ? getLegacyRuntimeMap(yDoc) : undefined;\n // PHASE A COMPAT — REMOVAL TRIGGER: same as the read resolution (compat\n // register item 2). Resolve-on-read at the point of write, so a block an\n // old client already advanced is merged into rather than overwritten — and\n // so the returned `prev` cannot understate progress and re-fire a\n // completion guard.\n prev = legacyCompatible ? resolveActionState(actions?.get(blockId), flat?.get(blockId)).value : readActionState(yDoc, runId, blockId);\n next = cloneState({ ...prev, ...updates });\n // Three DEEPLY distinct objects: Yjs stores a plain-object value by\n // reference, so sharing any part of one between the run entry, the mirror\n // and the returned `next` lets a caller mutating the result silently\n // rewrite the doc with no transaction, no update event and no observer —\n // see {@link cloneState}. A shallow spread here shares every nested\n // `output`/`error`, which is the payment-proof case.\n actions?.set(blockId, cloneState(next));\n // PHASE A DUAL-WRITE. Mirrors the FULL merged object so an old client's\n // read-modify-write LWWs against complete state, exactly as it does today.\n // REMOVAL TRIGGER: Phase B, when multi-run is enabled. Dual-write and\n // multi-run are mutually exclusive by construction — with N runs the\n // question \"which run does runtime[blockId] represent?\" has no answer.\n flat?.set(blockId, cloneState(next));\n });\n return { prev, next };\n}\n\n/**\n * **Replace** a block's action state in the run AND the flat mirror, in one\n * transaction. The opposite of {@link writeActionState}: nothing is merged, the\n * previous value is discarded on both sides.\n *\n * This is the primitive every *reset* path must use — flow rebuild, per-node\n * re-initialisation, the user's \"Reset\" affordance. A reset that touches only\n * the flat map is the most dangerous write in Phase A: {@link resolveActionState}\n * rule (a) makes a surviving `completed` run entry beat the fresh `idle` flat\n * entry, so the block reads **pre-completed** — a rebuilt flow shows green ticks\n * for work nobody did in it, and a \"Reset\" button appears to do nothing. Because\n * CRDT history is immutable, that wrong state is permanent in a live room.\n *\n * Writing the *identical* object to both sides is what makes the pair converge:\n * the two entries are then indistinguishable, so the predicate falls through to\n * the deterministic tiebreak and {@link adoptLegacyRuntime} has nothing to\n * materialise.\n */\nexport function resetActionState(yDoc: Y.Doc, runId: string, blockId: string, value: FlowNodeRuntimeState = { state: 'idle' }): void {\n assertDoc(yDoc, 'resetActionState');\n yDoc.transact(() => {\n const actions = resolveActionsForWrite(yDoc, runId);\n // Deeply distinct objects, for the same aliasing reason as `writeActionState`.\n actions?.set(blockId, cloneState(value));\n // PHASE A DUAL-WRITE — REMOVAL TRIGGER: compat register item 1.\n if (usesLegacyRuntimeCompatibility(yDoc)) {\n getLegacyRuntimeMap(yDoc).set(blockId, cloneState(value));\n }\n });\n}\n\n/**\n * Delete a block's action state from the run AND the flat mirror, in one\n * transaction. Used when the block itself is removed from the flow.\n *\n * Deleting only the flat entry leaves the run holding the deleted block's last\n * state; a block re-added under the same id (block ids are deterministic —\n * `flow_block_<nodeId>`) then reads as already-executed.\n *\n * **Never creates the run container.** A delete on a doc that has no run yet is\n * a no-op on the run side, not a reason to materialise `runs` — a doc that has\n * never been adopted must not gain a container from a removal.\n *\n * Phase A has exactly one run, but this deletes from the *named* run only,\n * never every run: in Phase B removing a block must not rewrite the history of\n * runs that already executed it.\n */\nexport function deleteActionState(yDoc: Y.Doc, runId: string, blockId: string): void {\n assertDoc(yDoc, 'deleteActionState');\n yDoc.transact(() => {\n getRunActionsMap(yDoc, runId)?.delete(blockId);\n // PHASE A DUAL-WRITE — REMOVAL TRIGGER: compat register item 1.\n if (usesLegacyRuntimeCompatibility(yDoc)) {\n getLegacyRuntimeMap(yDoc).delete(blockId);\n }\n });\n}\n\n/**\n * Drop **all** per-action execution state: every run container, the write-once\n * terminal latch, and the flat `runtime` map. One transaction.\n *\n * This is the full-rebuild wipe. It deletes every run, not just the active one:\n * a rebuild replaces the definition wholesale, so no run's state is meaningful\n * against it any more.\n *\n * Deliberately narrower than `clearRuntimeForTemplateClone` — it does not touch\n * `auditTrail`, `invocations`, `pendingInvocations` or `barrierState`, matching\n * exactly what the rebuild path cleared before runs existed. Widening it further\n * is a separate behaviour change.\n *\n * ## Why the DM dedup map is in scope, and is NOT a widening\n *\n * Wiping the flat map wipes the `__dm_notifications` / `__dm_notifications_pending`\n * keys along with everything else, because those records used to *live* there.\n * Clearing the flat map and not the dedicated map does not preserve DM state —\n * it **forks** it, in the one direction that is loudest:\n *\n * - an already-deployed client reads only the legacy keys, sees an empty bag,\n * and re-DMs the assignee of every block in the rebuilt flow;\n * - a new client reads the union, still sees the pre-rebuild records, and stays\n * silent.\n *\n * So the two generations disagree about who has been notified, which is the\n * exact split `dmNotificationState`'s dual-write exists to prevent. Clearing\n * both restores the pre-runs behaviour byte for byte: a full rebuild resets DM\n * dedup, and both generations agree that it did. `clearRuntimeForTemplateClone`\n * already clears both for the same reason.\n */\nexport function clearAllActionState(yDoc: Y.Doc): void {\n assertDoc(yDoc, 'clearAllActionState');\n yDoc.transact(() => {\n const runs = getRunsMap(yDoc);\n runs.forEach((_, key) => runs.delete(key));\n const terminal = getRunsTerminalMap(yDoc);\n terminal.forEach((_, key) => terminal.delete(key));\n // PHASE A DUAL-WRITE — REMOVAL TRIGGER: compat register item 1.\n // This also drops the `__dm_notifications*` mirrors, which is why the\n // dedicated map below must go with it or the two generations fork.\n const flat = getLegacyRuntimeMap(yDoc);\n flat.forEach((_, key) => flat.delete(key));\n const dmState = yDoc.getMap<unknown>(DM_NOTIFICATIONS_MAP_KEY);\n dmState.forEach((_, key) => dmState.delete(key));\n });\n}\n\n/**\n * Resolve every flat `runtime` entry against its run entry and **materialise\n * the winner into the run**. Returns the number of entries actually written.\n *\n * This is the writer half of the freshness contract, and the reason the doc\n * *converges* rather than merely reading correctly on each peer. Adoption is\n * **not absent-only**: skipping any key the run already has would make it dead\n * code the moment `initializeRuntime` seeds `{state:'idle'}` for every block,\n * and would strand every later flat write — an old tab completing a payment, a\n * not-yet-upgraded flow-manager finishing a claim, or the mirror of a container\n * that lost the concurrent-create race — outside the run forever.\n *\n * It is still **never a downgrade**: {@link resolveActionState}'s rule (a) means\n * a staler flat entry (an old tab re-seeding `idle` after a new tab completed\n * the block) loses, so nothing here can resurrect a pre-execution state on top\n * of a completed one and re-arm the auto-execute gate.\n *\n * **Idempotent by construction.** A materialised value is a copy of the flat\n * entry, so the next pass resolves the pair via the deterministic tiebreak\n * (rule (d)) back to `'run'` — no write, and a reported count of zero.\n *\n * ## THE ADOPTION GATE (§9.3) — **NOT discharged**\n *\n * **Gated, default OFF** — see {@link isLegacyRuntimeAdoptionEnabled} for the\n * full, cross-repo flip condition. While the gate is closed this is a pure no-op\n * returning `0`: it does not read, does not open a transaction, and does not\n * create the `actions` container. The gate is enforced here rather than at the\n * call sites so that no call site — present or future — can forget it.\n *\n * It was once declared discharged on the strength of a grep over `editor/src`.\n * That is the wrong scope: `flow-manager` is a live writer of flow runtime state\n * (§9.6), is pinned to a pre-runs editor, and still writes a flat-only `failed`\n * with no `executedAt` — which this predicate can never materialise. The two\n * things that keep the gate honest, and why neither alone is enough, are written\n * out at {@link isLegacyRuntimeAdoptionEnabled}: the flag covers the repos no\n * test here can see, the guard covers this one.\n *\n * - `no-runtime-writer-outside-waist.test.ts` greps the whole of `src/` and\n * fails on any runtime-map write outside this file's allowlist. Its allowlist\n * is per-line where feasible, and it must never gain an entry without a §9.3\n * argument.\n * - `adoption-live.repro.test.ts` pins the four originally-reproduced defects\n * (checkbox uncheck, reset-after-failed, read-back proof failure, 50 idempotent\n * passes) plus the stall — all with the gate explicitly **opened**, because\n * that is the only configuration in which they are reachable.\n *\n * `ensureRun` was never gated: an empty run container is harmless and\n * idempotent. It is *materialising stale winners* that has to wait.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: Phase B, once `writeActionState` no longer\n * mirrors to the flat map (compat register item 3).\n */\nexport function adoptLegacyRuntime(yDoc: Y.Doc, runId: string): number {\n assertDoc(yDoc, 'adoptLegacyRuntime');\n // THE ADOPTION GATE (§9.3). Materialising a stale winner into the run is\n // irreversible in a live room; nothing below may run until every runtime\n // writer — in this repo, in flow-manager, and in flow-agent — routes through\n // this waist.\n if (!legacyRuntimeAdoptionEnabled) return 0;\n let adopted = 0;\n yDoc.transact(() => {\n const actions = ensureRunActions(yDoc, runId);\n const flat = getLegacyRuntimeMap(yDoc);\n flat.forEach((value, key) => {\n if (key.startsWith(RESERVED_RUNTIME_KEY_PREFIX)) return; // not a block\n if (!asStateObject(value)) return; // not an action state\n const resolved = resolveActionState(actions.get(key), value);\n // 'run' (or 'neither') → the run already holds the more advanced value.\n // Writing anyway would churn the doc and break idempotence.\n if (resolved.winner !== 'flat') return;\n actions.set(key, cloneState(resolved.value));\n adopted += 1;\n });\n });\n return adopted;\n}\n\n/**\n * Subscribe to every change that can alter what {@link readActionState} returns\n * for any block. Returns the unsubscribe function.\n *\n * **Two sources, not one — this is the \"block completed but UI still spinning\"\n * trap.** The flat map is a *flat* `Y.Map`, so a shallow `observe` on it sees\n * every per-block write. `runs` is a *nested* container, so a shallow `observe`\n * on it fires only when a whole run is added or replaced — a change to\n * `runs[runId].actions[blockId]` would never reach the handler at all. That\n * failure presents as a block that completed in the doc while its UI keeps\n * spinning, which reads as a Matrix sync problem rather than a code bug, so it\n * is subscribed here in the waist instead of at each call site.\n *\n * - `observeDeep` on `runs` covers per-block action writes **and** the container\n * replacement that follows a losing concurrent-create merge.\n * - `observe` on the flat map covers an already-deployed client's write, so it\n * is visible immediately rather than waiting for an adoption pass.\n *\n * Both fire for a dual-write, so handlers must be cheap and idempotent — the\n * `shallowEqual` gate in `useNodeRuntime` is what keeps the extra fanout free.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: the flat-map subscription goes with the\n * mirror write and the read resolution (compat register items 1 and 2).\n */\nexport function subscribeToActionState(yDoc: Y.Doc, handler: () => void): () => void {\n assertDoc(yDoc, 'subscribeToActionState');\n // Top-level maps have stable identity per doc, so the same handles are valid\n // for `unobserve` later. Nested containers must never be captured this way.\n const runs = getRunsMap(yDoc);\n runs.observeDeep(handler);\n const flat = usesLegacyRuntimeCompatibility(yDoc) ? getLegacyRuntimeMap(yDoc) : undefined;\n flat?.observe(handler);\n return () => {\n runs.unobserveDeep(handler);\n flat?.unobserve(handler);\n };\n}\n\n/**\n * The session a surface should show, or `undefined` when the flow has none.\n *\n * `undefined` is a real answer, not a failure: a new flow has no session until\n * an actor starts one, and a legacy flow has none until it is migrated. Read\n * surfaces must render that state rather than substituting a run id — a\n * fabricated id is what made an unstarted flow display a phantom session.\n *\n * The pointer is advisory and is only honoured when it names a run that\n * actually exists, so a stale pointer (a cloned template, a deleted run) reads\n * as \"no session\" rather than as a missing container.\n */\nexport function resolveActiveRunId(yDoc?: Y.Doc): string | undefined {\n if (yDoc && typeof yDoc.getMap === 'function') {\n const advisory = getExistingYMap(yDoc, 'root')?.get('activeRunId');\n if (typeof advisory === 'string' && advisory.length > 0 && getExistingRunsMap(yDoc)?.has(advisory)) {\n return advisory;\n }\n }\n return undefined;\n}\n\n/**\n * The run id a **read** should resolve against, or `undefined` when there is\n * nothing to read.\n *\n * The read-side counterpart to {@link resolveRunIdForExecution}, which throws\n * rather than returning nothing — right for a write, wrong for a status panel\n * or a reference resolver, where \"this flow has no session yet\" is an ordinary\n * thing to render.\n *\n * A legacy, unmigrated document still has state to show: it lives in the flat\n * map, and the unsessioned id reaches it.\n */\nexport function resolveRunIdForRead(yDoc: Y.Doc, requestedRunId?: string): string | undefined {\n assertDoc(yDoc, 'resolveRunIdForRead');\n if (requestedRunId) return requestedRunId;\n return resolveActiveRunId(yDoc) ?? (usesLegacyRuntimeCompatibility(yDoc) ? UNSESSIONED_RUN_ID : undefined);\n}\n\n/**\n * `FlowRuntimeStateManager` over a run. Drop-in for `createYDocRuntimeManager`.\n *\n * **Throws rather than degrading.** `createRuntimeStateManager` silently\n * returns an in-memory `Map` when it cannot resolve a doc; under runs that\n * means the action executes, the side effect happens, and nothing persists — so\n * the next reader sees an un-run block and executes it again. A throw surfaces\n * as a failed block, which is recoverable; a silent memory manager is not.\n */\nexport function createRunScopedRuntimeManager(yDoc: Y.Doc, runId: string): FlowRuntimeStateManager {\n assertDoc(yDoc, 'createRunScopedRuntimeManager');\n if (!runId) {\n throw new Error('[runs] createRunScopedRuntimeManager requires a runId');\n }\n return {\n get: (nodeId: string) => readActionState(yDoc, runId, nodeId),\n update: (nodeId: string, updates: Partial<FlowNodeRuntimeState>) => {\n writeActionState(yDoc, runId, nodeId, updates);\n },\n };\n}\n\n/**\n * Duck-typed `{ get(blockId) }` shim for `referenceResolver`'s `options.yRuntime`,\n * which only ever calls `.get(blockId)`. Returns `undefined` for an unknown\n * block, exactly as the flat `Y.Map` it replaces does, so every existing\n * `stored?.output` read behaves identically.\n *\n * Resolves from the doc on every `get` — the reader object may safely be\n * memoised, but the container it reads must not be.\n *\n * Uses the same {@link resolveActionState} predicate as {@link readActionState}:\n * a reference like `{{block.output.txHash}}` must see the same value the block's\n * own UI does, or a downstream action signs against a run entry that a stale\n * `idle` seed is hiding.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: compat register item 2.\n */\nexport function createRunRuntimeReader(yDoc: Y.Doc, runId: string): { get(blockId: string): FlowNodeRuntimeState | undefined } {\n assertDoc(yDoc, 'createRunRuntimeReader');\n return {\n get(blockId: string): FlowNodeRuntimeState | undefined {\n const runEntry = getRunActionsMap(yDoc, runId)?.get(blockId);\n if (!usesLegacyRuntimeCompatibility(yDoc)) {\n const state = asStateObject(runEntry);\n return state ? cloneState(state) : undefined;\n }\n const flatEntry = getLegacyRuntimeMap(yDoc).get(blockId);\n const resolved = resolveActionState(runEntry, flatEntry);\n // `undefined` for an unknown block, exactly as the flat `Y.Map` does.\n return resolved.winner === 'neither' ? undefined : resolved.value;\n },\n };\n}\n\n/**\n * {@link createRunRuntimeReader} plus the `.doc` handle, for the `_yRuntime`\n * slot of a **synthetic editor** — the `{ _yDoc, _yRuntime, document }` object\n * `actionExecutor` and `readBackReconciler` fabricate when they are driven\n * headlessly from a Y.Doc.\n *\n * Two properties matter:\n *\n * 1. **Read-only.** There is no `set`. The headless write path goes through\n * {@link writeActionState} directly, so there is exactly one duck-typed\n * handle in the system and it cannot write. A synthetic `_yRuntime` that\n * was the raw flat `Y.Map` (what these call sites used before Ignition) is a\n * writer outside this waist by construction.\n * 2. **`.doc` is present**, because `editor._yRuntime?.doc` is an established\n * way to reach the Y.Doc in this repo (`useEntities.ts`, `DebugButton.tsx`),\n * and the shim must not be the thing that breaks it.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: compat register item 2, with the reader.\n */\nexport function createRunRuntimeReaderWithDoc(yDoc: Y.Doc, runId: string): { get(blockId: string): FlowNodeRuntimeState | undefined; doc: Y.Doc } {\n return Object.assign(createRunRuntimeReader(yDoc, runId), { doc: yDoc });\n}\n","import type * as Y from 'yjs';\n\n/**\n * Resolve an existing top-level Y.Map without creating an absent shared type.\n *\n * A remote update may leave `Doc.share` holding an unspecialized\n * `AbstractType` until `getMap` is called locally. Checking `share.has` first\n * distinguishes that harmless local specialization from creating a brand-new\n * shared map on an otherwise empty document.\n */\nexport function getExistingYMap<T = unknown>(yDoc: Y.Doc, key: string): Y.Map<T> | undefined {\n if (!yDoc.share.has(key)) return undefined;\n return yDoc.getMap<T>(key);\n}\n\n/**\n * Structural Y.Map guard.\n *\n * Yjs is a peer dependency and local multi-repo development can legitimately\n * load two compatible package instances. `instanceof Y.Map` then rejects a\n * real map created by the consumer's instance. Shared-state boundaries use\n * this guard so behavior follows the CRDT shape rather than constructor\n * identity.\n */\nexport function isYMapLike<T = unknown>(value: unknown): value is Y.Map<T> {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as {\n get?: unknown;\n set?: unknown;\n has?: unknown;\n forEach?: unknown;\n };\n return typeof candidate.get === 'function' && typeof candidate.set === 'function' && typeof candidate.has === 'function' && typeof candidate.forEach === 'function';\n}\n","// ─── Base UCAN Flow Plan ────────────────────────────────────────────────────\n// A structured, capability-shaped planning document that borrows UCAN semantics.\n// The AI generates this plan; the compiler turns it into blocks + graph + Yjs state.\n\n/** Condition that gates when a capability activates. */\nexport interface ConditionRef {\n /** ID of the upstream capability whose output is checked. */\n sourceId: string;\n /** Output field path to inspect, e.g., \"decision\". */\n field: string;\n /** Comparison operator. */\n operator: 'eq' | 'neq' | 'gt' | 'lt' | 'in' | 'exists';\n /** Value to compare against (omit for 'exists'). */\n value?: unknown;\n /** What happens when the condition is (not) met. */\n effect?: {\n action: 'enable' | 'disable' | 'hide' | 'show';\n message?: string;\n };\n}\n\n/** Authorization constraint for a capability. */\nexport interface ActorConstraint {\n /** Whitelisted actor DIDs. */\n authorisedActors?: string[];\n /** Parent capability URI for delegation chain. */\n parentCapability?: string;\n}\n\n/** Time-to-live constraint for a capability. */\nexport interface TTLConstraint {\n /** Hard deadline (ISO 8601 date string). */\n absoluteDueDate?: string;\n /** Duration from when the block becomes enabled (ISO 8601 duration, e.g., \"P7D\"). */\n fromEnablement?: string;\n /** Duration from when an actor commits (ISO 8601 duration, e.g., \"PT2H\"). */\n fromCommitment?: string;\n}\n\n/**\n * A single capability in a Base UCAN flow plan.\n *\n * UCAN semantics:\n * can = the action\n * with = the resource or scope\n * nb = typed caveats, inputs, parameters\n *\n * Workflow semantics (kept separate from nb):\n * condition, trigger, parallelGroup, phase\n */\nexport interface FlowCapability {\n /** Stable node identifier for this step. */\n id: string;\n /** UCAN-style ability string, e.g., \"bid/submit\", \"email/send\". */\n can: string;\n /** Resource URI, e.g., \"ixo:flow:{flowId}\" or \"ixo:flow:{flowId}:{nodeId}\". */\n with: string;\n /** Typed caveats / input parameters. Shape is dictated by the action registry. */\n nb?: Record<string, unknown>;\n\n // ── Workflow topology ──\n /** Condition that must be met for this capability to activate. */\n condition?: ConditionRef;\n /** Capabilities sharing a parallelGroup run concurrently. */\n parallelGroup?: string;\n /** Semantic grouping for layout lanes. */\n phase?: string;\n\n // ── Authorization ──\n /** Who can execute this step. */\n actor?: ActorConstraint;\n\n // ── TTL ──\n /** Time-to-live constraints. */\n ttl?: TTLConstraint;\n\n // ── Trigger ──\n /**\n * When and how this block fires. Defaults to `{ type: 'manual' }` if absent\n * (i.e. block runs only when a user explicitly invokes it).\n *\n * `block.event` triggers turn this block into a listener: when the source\n * block emits an event matching `eventName`, a pending invocation is\n * queued on this block and the assigned actor is DM'd to invoke it. See\n * `docs/flow-engine/events-and-triggers-plan.md` §3.7 and §18 for the full model.\n *\n * Triggers are a NEW sibling field on FlowCapability (decided in eng review\n * pass 2 phase 0 #1). They are NOT an extension of `condition`. The decompile\n * branch's author needs to add `props.trigger` parsing when their work merges.\n */\n trigger?: TriggerSpec;\n\n // ── Human-facing metadata ──\n /** Display title (falls back to can statement). */\n title?: string;\n /** Description of what this step does. */\n description?: string;\n /** Icon identifier. */\n icon?: string;\n}\n\n/**\n * Trigger declaration for a block. When and how it fires.\n */\n/** A single event source in a barrier trigger. */\nexport interface TriggerSource {\n /** ID of the block that emits the event. */\n sourceBlockId: string;\n /** Name of the event (must match an event declared on the source action's `events` vocabulary). */\n eventName: string;\n /** Namespace alias for payload access: `trigger.payload.<alias>.*` */\n alias: string;\n /**\n * When `true`, this source does NOT block queuing — the barrier fires once all\n * *required* (non-optional) sources have fired. If an optional source fired before\n * the barrier completes, its payload is merged in; if it never fires, it's skipped.\n * Defaults to `false` (required) for backward compatibility.\n */\n optional?: boolean;\n}\n\nexport interface TriggerSpec {\n /**\n * - `manual`: block runs only when a user explicitly invokes it (default).\n * - `flow.start`: block runs when the flow execution begins.\n * - `block.event`: block runs each time another block emits a matching event.\n * - `block.event.all`: block runs once ALL listed sources have emitted (barrier/join).\n */\n type: 'manual' | 'flow.start' | 'block.event' | 'block.event.all';\n /** Required when `type === 'block.event'`. ID of the block that emits the event. */\n sourceBlockId?: string;\n /** Required when `type === 'block.event'`. Name of the event (must match an event declared on the source action's `events` vocabulary). */\n eventName?: string;\n /** Required when `type === 'block.event.all'`. Array of event sources — ALL must fire before the listener is queued. */\n sources?: TriggerSource[];\n}\n\n/**\n * The Base UCAN flow plan — the intermediate representation between\n * user intent and the compiled flow graph.\n *\n * capabilities is an ordered list. Each capability carries its own stable `id`.\n */\nexport interface BaseUcanFlow {\n kind: 'qi.flow.base-ucan';\n version: '1.0';\n flowId: string;\n title: string;\n goal?: string;\n meta?: {\n entityDid?: string;\n flowUri?: string;\n rootIssuer?: string;\n };\n /** Ordered capabilities, each with its own stable node ID. */\n capabilities: FlowCapability[];\n}\n\n// ─── Runtime References ─────────────────────────────────────────────────────\n// Used in nb values to reference outputs from upstream capabilities.\n// Resolved at execution time, serialized as-is at compile time.\n\n/** A reference to an upstream node's output field. Format: \"nodeId.output.fieldPath\" */\nexport interface RuntimeRef {\n $ref: string;\n}\n\nexport function isRuntimeRef(value: unknown): value is RuntimeRef {\n return typeof value === 'object' && value !== null && '$ref' in value && typeof (value as Record<string, unknown>).$ref === 'string';\n}\n\n// ─── Compiled Flow Output ───────────────────────────────────────────────────\n// Produced by the compiler, consumed by hydration.\n\n/** A single block ready for insertion into BlockNote. */\nexport interface CompiledBlock {\n /** Pre-generated stable block ID. */\n id: string;\n /** BlockNote block type (e.g., \"action\"). */\n type: string;\n /** Block props — all values are strings per BlockNote convention. */\n props: Record<string, string>;\n}\n\n/**\n * An edge in the flow graph. Currently only `kind: 'trigger'` edges are\n * synthesized — they come from `block.event` triggers and represent the\n * source → listener relationship visually on the canvas.\n */\nexport interface CompiledEdge {\n id: string;\n source: string;\n target: string;\n kind: 'trigger';\n condition?: ConditionRef;\n}\n\n/** A compiled flow node stored in qi.flow.nodes. */\nexport interface CompiledFlowNode {\n id: string;\n blockId: string;\n can: string;\n with: string;\n registryType: string;\n title: string;\n description: string;\n props: Record<string, string>;\n phase?: string;\n parallelGroup?: string;\n actor?: ActorConstraint;\n}\n\n/** The complete compiled output from the Base UCAN compiler. */\nexport interface CompiledFlow {\n /** Flow metadata for qi.flow.meta and Y.Map('root'). */\n meta: {\n flowId: string;\n title: string;\n goal?: string;\n version: string;\n flowOwnerDid: string;\n flowUri?: string;\n compiledAt: string;\n compiledFrom: 'BaseUcanFlow';\n };\n /** Blocks to insert into BlockNote, in topological order. */\n blocks: CompiledBlock[];\n /** Flow graph nodes, keyed by node ID. */\n nodes: Record<string, CompiledFlowNode>;\n /** Dependency edges. */\n edges: CompiledEdge[];\n /** Topological order of node IDs. */\n order: string[];\n /** nodeId → blockId mapping. */\n blockIndex: Record<string, string>;\n}\n\n/** Strategy for how a compiled flow is applied to an existing document. */\nexport type FlowStrategy = 'full' | 'merge' | 'patch';\n","/**\n * Reference Resolver — the single engine for `{{blockId.propPath}}` string\n * references.\n *\n * Handles resolution of block property references in the format:\n * {{blockId.propKey}} or {{blockId.nestedProp.key}}\n *\n * Example:\n * Input: \"User email: {{user-block-123.email}}\"\n * Output: \"User email: john@example.com\"\n *\n * This lives in core (framework-free) so both the React layer\n * (`src/mantine/utils/referenceResolver.ts` re-exports it) and headless\n * consumers share one implementation. The structured `{ $ref }` resolver\n * (`flowCompiler/resolveRefs.ts`) is a separate data model that shares\n * `getNestedValue` from here.\n *\n * Behavioral contract (things consumers depend on — do not change):\n * - Unresolved references become `fallback` (default `''`); every\n * FlowDetail `inputsReady` gate relies on empty-string-when-unresolved.\n * - Objects stringify by default (`stringifyObjects: true`).\n * - `:` is allowed in property paths (JSON-LD field names).\n * - `output.*` paths fall back to `output.data.*` and legacy\n * `output.http.data.*`.\n */\n\nimport { warnOnce } from '../warnOnce';\n\n/**\n * Represents a parsed reference from a string\n */\nexport interface ParsedReference {\n /** Full reference string including delimiters: {{blockId.propKey}} */\n fullMatch: string;\n /** Block ID portion */\n blockId: string;\n /** Property path (can be nested): propKey or nested.prop.key */\n propPath: string;\n /** Start index in the original string */\n startIndex: number;\n /** End index in the original string */\n endIndex: number;\n}\n\n/**\n * Regular expression to match references in format: {{blockId.propKey}}\n * Captures: blockId and propPath (including nested paths)\n */\n// propPath allows `:` so JSON-LD field names (e.g. `schema:amount`,\n// `umuzi:paymentCurrency`) round-trip through the resolver without\n// truncation. Without it, `{{evaluation.outcomeResponses.schema:amount}}`\n// silently fails to match and resolves to '' — which then casts to 0 in\n// any downstream number field.\nconst REFERENCE_REGEX = /\\{\\{([a-zA-Z0-9_-]+)\\.([a-zA-Z0-9_.:]+)\\}\\}/g;\n\n/**\n * Parse all references from a string\n */\nexport function parseReferences(input: string): ParsedReference[] {\n const references: ParsedReference[] = [];\n const regex = new RegExp(REFERENCE_REGEX);\n let match;\n\n while ((match = regex.exec(input)) !== null) {\n references.push({\n fullMatch: match[0],\n blockId: match[1],\n propPath: match[2],\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n });\n }\n\n return references;\n}\n\n/**\n * Get a nested property value from an object using dot notation.\n * Shared by the `{{...}}` resolver, the structured `$ref` resolver, and\n * ref snapshotting — keep the loose `current?.[key]` semantics.\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => {\n return current?.[key];\n }, obj);\n}\n\nexport type UnresolvedReferenceReason = 'unknown-block' | 'missing-value' | 'response-parse-error';\n\nexport interface UnresolvedReference {\n /** The full `{{...}}` reference text. */\n ref: string;\n blockId: string;\n propPath: string;\n reason: UnresolvedReferenceReason;\n}\n\ninterface SingleResolution {\n value: any;\n reason?: UnresolvedReferenceReason;\n}\n\nfunction resolveSingleReferenceDetailed(blockId: string, propPath: string, editorDocument: any[], yRuntime?: any, scope?: Record<string, any>): SingleResolution {\n // Scope bindings take precedence over any same-named editor block.\n if (scope && Object.prototype.hasOwnProperty.call(scope, blockId)) {\n const root = scope[blockId];\n if (root == null) return { value: undefined, reason: 'missing-value' };\n const value = getNestedValue(root, propPath);\n return { value, reason: value === undefined ? 'missing-value' : undefined };\n }\n\n if (!editorDocument || !Array.isArray(editorDocument)) {\n return { value: undefined, reason: 'unknown-block' };\n }\n\n // Find the block by ID\n const block = editorDocument.find((b) => b.id === blockId);\n\n if (!block) {\n return { value: undefined, reason: 'unknown-block' };\n }\n\n // Runtime output paths (e.g., \"output.customer.email\") — read from _yRuntime\n // Any block type that stores runtime output (action, apiRequest, email, etc.)\n if (propPath.startsWith('output.')) {\n if (!yRuntime) return { value: undefined, reason: 'missing-value' };\n\n const runtimeState = yRuntime.get(blockId);\n if (!runtimeState?.output) return { value: undefined, reason: 'missing-value' };\n\n const innerPath = propPath.substring('output.'.length);\n const direct = getNestedValue(runtimeState.output, innerPath);\n if (direct !== undefined) return { value: direct };\n\n // Fallback: some actions (e.g. http.request) nest the response payload\n // under output.data, but the user-defined schema references paths\n // relative to the payload (e.g. \"customer.email\" not \"data.customer.email\").\n if (runtimeState.output.data !== undefined) {\n const value = getNestedValue(runtimeState.output.data, innerPath);\n return { value, reason: value === undefined ? 'missing-value' : undefined };\n }\n\n // Legacy fallback: older http.request flow executor stored payload\n // under output.http.data.\n if (runtimeState.output.http?.data !== undefined) {\n const value = getNestedValue(runtimeState.output.http.data, innerPath);\n return { value, reason: value === undefined ? 'missing-value' : undefined };\n }\n\n return { value: undefined, reason: 'missing-value' };\n }\n\n // Special handling for API Request response paths (e.g., \"response.data.user.email\")\n if (propPath.startsWith('response.')) {\n const responseData = block.props.response;\n\n if (!responseData) {\n return { value: undefined, reason: 'missing-value' };\n }\n\n // Parse response JSON if it's a string\n try {\n const parsedResponse = typeof responseData === 'string' ? JSON.parse(responseData) : responseData;\n\n // Extract the path after \"response.\" (e.g., \"data.user.email\")\n const innerPath = propPath.substring('response.'.length);\n\n // Navigate into the parsed response using the inner path\n const value = getNestedValue(parsedResponse, innerPath);\n\n return { value, reason: value === undefined ? 'missing-value' : undefined };\n } catch {\n warnOnce(`ref-response-parse:${blockId}`, `[flow-config] block ${blockId}: props.response is not valid JSON; {{${blockId}.${propPath}}} cannot resolve`);\n return { value: undefined, reason: 'response-parse-error' };\n }\n }\n\n // Default behavior for other properties: direct prop access\n const value = getNestedValue(block.props, propPath);\n\n return { value, reason: value === undefined ? 'missing-value' : undefined };\n}\n\n/**\n * Resolve a single reference by finding the block and extracting the property value\n */\nexport function resolveSingleReference(blockId: string, propPath: string, editorDocument: any[], yRuntime?: any, scope?: Record<string, any>): any {\n return resolveSingleReferenceDetailed(blockId, propPath, editorDocument, yRuntime, scope).value;\n}\n\nexport interface ResolveReferencesOptions {\n /** String to use when a reference cannot be resolved */\n fallback?: string;\n /** Whether to return objects as JSON strings */\n stringifyObjects?: boolean;\n /** Yjs runtime map for resolving action block output paths */\n yRuntime?: any;\n /**\n * Local scope bindings for iterative contexts. When provided, a reference\n * like `{{item.foo}}` resolves against `scope.item.foo` before falling\n * back to editor blocks. Use this in iterative mappers (e.g. Xero\n * invoice LineItems iterative mode).\n */\n scope?: Record<string, any>;\n /**\n * Diagnostic context: when set, unresolved references are logged once per\n * (context, ref). Pass the consuming block's id so a typo'd reference is\n * visible in the console instead of silently becoming ''.\n */\n warnContext?: string;\n}\n\nexport interface DetailedResolution {\n value: string;\n /** References that resolved to the fallback, with the reason. */\n unresolved: UnresolvedReference[];\n}\n\n/**\n * Resolve all references in a string, returning the resolved string plus\n * structured diagnostics for every reference that fell back.\n */\nexport function resolveReferencesDetailed(input: string | null | undefined, editorDocument: any[], options: ResolveReferencesOptions = {}): DetailedResolution {\n const { fallback = '', stringifyObjects = true, yRuntime, scope, warnContext } = options;\n const unresolved: UnresolvedReference[] = [];\n\n // Handle null/undefined input\n if (input == null) {\n return { value: '', unresolved };\n }\n\n // Convert to string if not already\n const inputStr = String(input);\n\n // Parse all references\n const references = parseReferences(inputStr);\n\n // If no references found, return original string\n if (references.length === 0) {\n return { value: inputStr, unresolved };\n }\n\n // Resolve each reference and build the result string\n let result = inputStr;\n\n // Process in reverse order to maintain correct string indices\n for (let i = references.length - 1; i >= 0; i--) {\n const ref = references[i];\n const resolution = resolveSingleReferenceDetailed(ref.blockId, ref.propPath, editorDocument, yRuntime, scope);\n const resolvedValue = resolution.value;\n\n // Convert resolved value to string\n let replacementStr: string;\n\n if (resolvedValue === undefined || resolvedValue === null) {\n replacementStr = fallback;\n unresolved.push({ ref: ref.fullMatch, blockId: ref.blockId, propPath: ref.propPath, reason: resolution.reason || 'missing-value' });\n } else if (typeof resolvedValue === 'object') {\n // Handle objects/arrays\n replacementStr = stringifyObjects ? JSON.stringify(resolvedValue) : fallback;\n } else {\n replacementStr = String(resolvedValue);\n }\n\n // Replace the reference with the resolved value\n result = result.substring(0, ref.startIndex) + replacementStr + result.substring(ref.endIndex);\n }\n\n if (warnContext && unresolved.length > 0) {\n for (const entry of unresolved) {\n warnOnce(`ref-unresolved:${warnContext}:${entry.ref}`, `[flow-config] ${warnContext}: reference ${entry.ref} did not resolve (${entry.reason}); using fallback '${fallback}'`);\n }\n }\n\n return { value: result, unresolved };\n}\n\n/**\n * Resolve all references in a string and return the resolved string\n */\nexport function resolveReferences(input: string | null | undefined, editorDocument: any[], options: ResolveReferencesOptions = {}): string {\n return resolveReferencesDetailed(input, editorDocument, options).value;\n}\n\n/**\n * Check if a string contains any references\n */\nexport function hasReferences(input: string | null | undefined): boolean {\n if (input == null) return false;\n return parseReferences(String(input)).length > 0;\n}\n\n/**\n * Create a reference string for a block property\n */\nexport function createReference(blockId: string, propPath: string): string {\n return `{{${blockId}.${propPath}}}`;\n}\n\n/**\n * Resolve references in an object's values recursively\n * Useful for resolving references in API request bodies, headers, etc.\n */\nexport function resolveObjectReferences<T extends Record<string, any>>(obj: T, editorDocument: any[], options?: ResolveReferencesOptions): T {\n const result: any = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n result[key] = resolveReferences(value, editorDocument, options);\n } else if (typeof value === 'object' && value !== null) {\n result[key] = resolveObjectReferences(value, editorDocument, options);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n","import * as Y from 'yjs';\nimport type { RuntimeRef } from '../../types/baseUcan';\nimport { isRuntimeRef } from '../../types/baseUcan';\nimport { getNestedValue } from './referenceResolver';\nimport { getExistingYMap } from '../yjsTypes';\nimport { ensureRunScopedMap, getRunScopedMap, isRecordInRun, resolveActiveRunId, resolveRunIdForExecution, usesLegacyRuntimeCompatibility } from './runs';\n\n/**\n * Run record stored in the audit trail as `type: 'block.run'`.\n *\n * Per Phase 0 #2 (eng review pass 2), run records are NOT a parallel\n * `_yRunHistory` structure — they ride on the existing `auditTrail` Y.Map\n * via `useAuditTrail.addEvent`. The shape below is what goes into the\n * audit trail event's `details` field.\n *\n * See `docs/flow-engine/events-and-triggers-plan.md` §3.4, §18, §19.\n */\nexport interface RunRecordDetails {\n /**\n * Stable identifier for **this execution**, deterministic from invocation\n * context (`run-<ts>-<rand>` / `readback-<ts>-<rand>`).\n *\n * D2 — **NOT the session run, and never renamed.** This is persisted data in\n * live rooms and it is the `sourceRunId` component of\n * `computePendingInvocationId`; renaming it forks that join and the same\n * logical event queues twice. New code calls this the *execution* id and\n * uses {@link RunRecordDetails.sessionRunId} for the session run.\n */\n runId: string;\n /**\n * The session run (`runs.ts`) this execution belonged to. Phase A writes it\n * additively and **nothing reads it** — it exists so Phase B's per-run\n * history attribution is free, and it deliberately does not participate in\n * `computePendingInvocationId` (moving the id space is Phase B, together with\n * `pendingInvocations` and `barrierState`).\n */\n sessionRunId?: string;\n /** Action's output. */\n output: Record<string, unknown>;\n /**\n * Events the action emitted on this run. Persisted as part of the run\n * record so the reconciliation loop can process them idempotently — even\n * across page refreshes and across multiple clients.\n */\n events: Array<{ name: string; payload: Record<string, unknown> }>;\n /** ISO timestamp when the action started. */\n startedAt: string;\n /** ISO timestamp when the action completed (success or failure). */\n completedAt: string;\n /** DID of the actor who signed the invocation that produced this run. */\n actorDid: string;\n /** UCAN invocation CID when execution produced one. */\n invocationCid?: string;\n /** Capability/proof CID used when no invocation CID was produced. */\n capabilityId?: string;\n /** Optional error if the run failed. */\n error?: { message: string; code?: string };\n /** External read-back metadata associated with this run or reconciliation. */\n readBack?: Record<string, unknown>;\n /** True when this audit entry was written by external read-back reconciliation. */\n reconciled?: boolean;\n /**\n * If this run was triggered by a pending invocation (i.e. it's a listener\n * run), the id of that pending invocation. Used to dedup replays and trace\n * causality back through `triggeredBy`.\n */\n fromPendingInvocationId?: string;\n /**\n * If this run is a listener run, the (sourceBlockId, eventName) that\n * caused it. Used by the failure visibility surface to attribute failures\n * back to the source block (CP-1).\n */\n triggeredBy?: { sourceBlockId: string; eventName: string };\n /** Source run id for listener runs, stored explicitly for failure lookups. */\n sourceRunId?: string;\n}\n\nexport const RUN_RECORD_AUDIT_TYPE = 'block.run';\n\n/**\n * Pending invocation queued on a listener block.\n *\n * Stored in `_yPendingInvocations: Y.Map<blockId, Y.Map<id, PendingInvocation>>`.\n *\n * The id is deterministic — derived from\n * `(sourceBlockId, sourceRunId, listenerBlockId, eventName, eventIndex)` —\n * so the reconciliation loop can run idempotently from multiple clients\n * without producing duplicates.\n *\n * See `docs/flow-engine/events-and-triggers-plan.md` §3.4, §3.5.1, §18.\n */\nexport interface PendingInvocation {\n /** Deterministic id, see `computePendingInvocationId`. */\n id: string;\n /** Block that emitted the event. */\n triggeringBlockId: string;\n /** Run id of the triggering source run, used for the deterministic id. */\n sourceRunId: string;\n /** Session run that owns this queue entry. Required by Phase B writers. */\n sessionRunId?: string;\n /** Event name from the source action's vocabulary. */\n eventName: string;\n /** Event index within the source run's `events` array (a single run can emit multiple). */\n eventIndex: number;\n /**\n * The frozen event payload, captured by value at emission time. The\n * assignee invokes the listener against this payload, not against the\n * source block's current state. This is the property that makes the\n * Sally → Mike scenario produce 10 distinct emails even when Mike acts\n * on them all hours later.\n */\n payload: Record<string, unknown>;\n /**\n * Snapshots of `nodeId.output.*` ref values that the listener's inputs\n * reference, captured at queue time. Keyed by the full ref string.\n *\n * §3.5.1: ref snapshots are the load-bearing fix for the lag-time\n * overwrite scenario. If a listener references a non-trigger block's\n * output (e.g. `evaluateBlock.output.claimId`), that value is captured\n * here at queue time. Resolution at invocation time prefers the snapshot\n * over current state, so multiple queued invocations don't drift when\n * the source re-runs.\n */\n refSnapshots: Record<string, unknown>;\n /** DID of the assigned actor who must invoke this listener. Resolved from `props.assignment.assignedActor.did`. */\n assigneeDid: string;\n /** ISO timestamp when the source emission happened. */\n emittedAt: string;\n /** ISO timestamp after which this pending invocation is considered expired. Resolved from `FlowCapability.ttl` at queue time. */\n expiresAt: string;\n}\n\n/**\n * Compute a deterministic id for a pending invocation from its content.\n *\n * The same (sourceBlockId, sourceRunId, listenerBlockId, eventName,\n * eventIndex) tuple always produces the same id. This is the property that\n * makes the reconciliation loop idempotent — re-running it from a different\n * client, or after a page refresh, produces the same `Y.Map.set` operation\n * with the same key, which Yjs converges to a single entry.\n *\n * Implementation: simple deterministic string concatenation, hashed via a\n * 32-bit FNV-1a. The id is short and stable; collision risk within a single\n * flow is negligible because the inputs are scoped (block ids are unique\n * within a flow, run ids are unique within a block).\n */\nexport function computePendingInvocationId(args: {\n sourceBlockId: string;\n sourceRunId: string;\n listenerBlockId: string;\n eventName: string;\n eventIndex: number;\n sessionRunId?: string;\n}): string {\n const { sourceBlockId, sourceRunId, listenerBlockId, eventName, eventIndex, sessionRunId } = args;\n const input = `${sessionRunId ? `${sessionRunId}:` : ''}${sourceBlockId}:${sourceRunId}:${listenerBlockId}:${eventName}:${eventIndex}`;\n return `pi-${fnv1a32(input)}`;\n}\n\n/**\n * Walk an inputs object and collect every RuntimeRef of the form\n * `nodeId.output.fieldPath`. Returns a map of `{refString: resolvedValue}`\n * suitable for storing as `PendingInvocation.refSnapshots`.\n *\n * The walker mirrors `resolveRuntimeRefs` in `flowCompiler/resolveRefs.ts`\n * but reads instead of resolving — it captures the current value of each\n * ref so the listener can later resolve against the snapshot rather than\n * against current state.\n *\n * See `docs/flow-engine/events-and-triggers-plan.md` §3.5.1.\n */\nexport function snapshotInputRefs(inputs: unknown, getNodeOutput: (nodeId: string) => Record<string, unknown> | undefined): Record<string, unknown> {\n const snapshots: Record<string, unknown> = {};\n walkRefs(inputs, (ref) => {\n // Skip trigger.* refs — those resolve from the pending invocation's payload, not snapshots\n if (ref.$ref.startsWith('trigger.')) return;\n const parsed = parseOutputRef(ref.$ref);\n if (!parsed) return;\n const output = getNodeOutput(parsed.nodeId);\n if (!output) return;\n snapshots[ref.$ref] = getNestedValue(output, parsed.fieldPath);\n });\n return snapshots;\n}\n\n/**\n * Recursively walk a value and invoke the visitor on every RuntimeRef found.\n * Mirrors the recursion shape of `resolveValue` in `resolveRefs.ts`.\n */\nfunction walkRefs(value: unknown, visit: (ref: RuntimeRef) => void): void {\n if (isRuntimeRef(value)) {\n visit(value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) walkRefs(item, visit);\n return;\n }\n if (typeof value === 'object' && value !== null) {\n for (const v of Object.values(value)) walkRefs(v, visit);\n }\n}\n\n/** Parse `\"nodeId.output.fieldPath\"` into its parts. Returns null if not a node output ref. */\nfunction parseOutputRef(ref: string): { nodeId: string; fieldPath: string } | null {\n const outputIndex = ref.indexOf('.output.');\n if (outputIndex === -1) return null;\n return {\n nodeId: ref.slice(0, outputIndex),\n fieldPath: ref.slice(outputIndex + '.output.'.length),\n };\n}\n\n/**\n * 32-bit FNV-1a hash. Returns a hex string. Used for deterministic\n * pending-invocation ids — not cryptographic, just stable across clients.\n */\nfunction fnv1a32(input: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\n// ─── Yjs storage helpers ────────────────────────────────────────────────────\n\nexport const PENDING_INVOCATIONS_MAP_KEY = 'pendingInvocations';\n\n/**\n * Get the top-level pending invocations Y.Map from the editor's yDoc.\n * Lazily creates it if missing.\n *\n * Shape: `Y.Map<blockId, Y.Map<pendingInvocationId, PendingInvocation>>`.\n * The outer map is keyed by listener block id; the inner map is keyed by\n * deterministic pending invocation id (see `computePendingInvocationId`).\n */\nexport function getPendingInvocationsMap(yDoc: Y.Doc, sessionRunId?: string): Y.Map<Y.Map<unknown>> {\n if (usesLegacyRuntimeCompatibility(yDoc)) {\n return yDoc.getMap<Y.Map<unknown>>(PENDING_INVOCATIONS_MAP_KEY);\n }\n return ensureRunScopedMap<Y.Map<unknown>>(yDoc, resolveRunIdForExecution(yDoc, sessionRunId), PENDING_INVOCATIONS_MAP_KEY);\n}\n\n/**\n * Read-only lookup for the pending-invocation container.\n *\n * Unlike {@link getPendingInvocationsMap}, this never creates a top-level map,\n * run, or nested run map. Status/history surfaces must use this path so merely\n * inspecting an empty run cannot mutate the shared document.\n */\nfunction readPendingInvocationsMap(yDoc: Y.Doc, sessionRunId?: string): Y.Map<Y.Map<unknown>> | undefined {\n if (usesLegacyRuntimeCompatibility(yDoc)) {\n return getExistingYMap<Y.Map<unknown>>(yDoc, PENDING_INVOCATIONS_MAP_KEY);\n }\n const runId = sessionRunId || resolveActiveRunId(yDoc);\n if (!runId) return undefined;\n return getRunScopedMap<Y.Map<unknown>>(yDoc, runId, PENDING_INVOCATIONS_MAP_KEY);\n}\n\n/**\n * Count all pending invocations in one session run without materialising any\n * missing CRDT containers.\n */\nexport function countPendingInvocations(yDoc: Y.Doc, sessionRunId?: string): number {\n const outer = readPendingInvocationsMap(yDoc, sessionRunId);\n if (!outer) return 0;\n let count = 0;\n outer.forEach((inner) => {\n if (inner && typeof inner.forEach === 'function') {\n inner.forEach(() => {\n count += 1;\n });\n }\n });\n return count;\n}\n\n/**\n * Get the inner pending-invocations map for a specific listener block.\n * Lazily creates it if missing. Caller is responsible for being inside a\n * Yjs transaction if atomic creation matters.\n */\nexport function getOrCreateBlockPendingMap(yDoc: Y.Doc, blockId: string, sessionRunId?: string): Y.Map<unknown> {\n const outer = getPendingInvocationsMap(yDoc, sessionRunId);\n let inner = outer.get(blockId);\n if (!inner) {\n inner = new Y.Map();\n outer.set(blockId, inner);\n }\n return inner;\n}\n\n/**\n * Read all pending invocations for a block as plain JS objects.\n * Returns an array sorted by `emittedAt` ascending (oldest first).\n */\nexport function readPendingInvocations(yDoc: Y.Doc, blockId: string, sessionRunId?: string): PendingInvocation[] {\n const outer = readPendingInvocationsMap(yDoc, sessionRunId);\n if (!outer) return [];\n const inner = outer.get(blockId);\n if (!inner) return [];\n const items: PendingInvocation[] = [];\n inner.forEach((value) => {\n if (value && typeof value === 'object') {\n items.push(value as PendingInvocation);\n }\n });\n items.sort((a, b) => a.emittedAt.localeCompare(b.emittedAt));\n return items;\n}\n\n/**\n * Idempotently write a pending invocation under its deterministic id.\n *\n * Returns true if a new entry was created, false if the id already\n * existed (meaning another client or a previous reconciliation pass\n * already queued this invocation). This is the property that makes\n * `reconcilePendingInvocations` safe to run from multiple clients\n * simultaneously and across page refreshes — see plan §18.\n *\n * Wraps the write in a Yjs transaction so the existence check and the\n * subsequent set are atomic from the local client's perspective. Concurrent\n * clients each computing the same id will all converge to a single entry\n * because Y.Map.set with the same key is last-writer-wins on identical\n * content.\n */\nexport function queuePendingInvocation(yDoc: Y.Doc, listenerBlockId: string, invocation: PendingInvocation, sessionRunId?: string): boolean {\n let created = false;\n yDoc.transact(() => {\n const inner = getOrCreateBlockPendingMap(yDoc, listenerBlockId, sessionRunId || invocation.sessionRunId);\n if (inner.has(invocation.id)) return;\n inner.set(invocation.id, invocation);\n created = true;\n });\n return created;\n}\n\n/**\n * Remove a pending invocation by id. Used when the assignee completes the\n * invocation (transitioning to a `block.run` audit trail entry) or when\n * the expiration sweep marks it as expired.\n */\nexport function removePendingInvocation(yDoc: Y.Doc, listenerBlockId: string, pendingInvocationId: string, sessionRunId?: string): boolean {\n const outer = readPendingInvocationsMap(yDoc, sessionRunId);\n if (!outer) return false;\n const inner = outer.get(listenerBlockId);\n if (!inner) return false;\n if (!inner.has(pendingInvocationId)) return false;\n inner.delete(pendingInvocationId);\n return true;\n}\n\n/**\n * Collect the ids of pending invocations this listener has already consumed:\n * every run record the listener wrote carries `fromPendingInvocationId`.\n * The reconciliation loop skips these ids so a consumed invocation is not\n * resurrected from the (immutable) source run record on the next pass.\n * Joining on run records needs no extra tombstone state and converges\n * across clients like everything else in the audit trail.\n */\nexport function readConsumedPendingInvocationIds(yDoc: Y.Doc, listenerBlockId: string, sessionRunId?: string): Set<string> {\n const consumed = new Set<string>();\n for (const record of readRunRecords(yDoc, listenerBlockId, sessionRunId)) {\n if (record.fromPendingInvocationId) consumed.add(record.fromPendingInvocationId);\n }\n return consumed;\n}\n\n/**\n * Physically delete expired pending invocations across all listeners.\n * Safe against resurrection because the reconciliation loop refuses to\n * queue an invocation whose computed expiry is already in the past.\n * Returns the number of entries removed.\n */\nexport function sweepExpiredPendingInvocations(yDoc: Y.Doc, now: number = Date.now(), sessionRunId?: string): number {\n const outer = readPendingInvocationsMap(yDoc, sessionRunId);\n if (!outer) return 0;\n let removed = 0;\n outer.forEach((inner, listenerBlockId) => {\n const innerMap = inner as Y.Map<unknown>;\n if (!innerMap || typeof innerMap.forEach !== 'function') return;\n const expiredIds: string[] = [];\n innerMap.forEach((value, id) => {\n const expiresAt = (value as PendingInvocation | undefined)?.expiresAt;\n if (expiresAt && Date.parse(expiresAt) < now) expiredIds.push(id);\n });\n for (const id of expiredIds) {\n innerMap.delete(id);\n removed += 1;\n }\n void listenerBlockId;\n });\n return removed;\n}\n\n// ─── Barrier state helpers (block.event.all) ──────────────────────────────────\n\n/**\n * Top-level Y.Doc map owning partial barrier completion for `block.event.all`\n * listeners. Exported so `clearRuntimeForTemplateClone` can clear it without\n * duplicating the literal — a barrier that survives a template clone can be\n * satisfied in the clone by entries emitted in the source flow.\n */\nexport const BARRIER_STATE_MAP_KEY = 'barrierState';\n\n/**\n * A single source event recorded toward a barrier trigger's completion.\n */\nexport interface BarrierEntry {\n sourceBlockId: string;\n eventName: string;\n alias: string;\n runId: string;\n sessionRunId?: string;\n payload: Record<string, unknown>;\n emittedAt: string;\n}\n\n/** Get the top-level barrier state Y.Map. Shape: `Y.Map<listenerBlockId, Y.Map<sourceKey, BarrierEntry>>`. */\nexport function getBarrierStateMap(yDoc: Y.Doc, sessionRunId?: string): Y.Map<Y.Map<unknown>> {\n if (usesLegacyRuntimeCompatibility(yDoc)) {\n return yDoc.getMap<Y.Map<unknown>>(BARRIER_STATE_MAP_KEY);\n }\n return ensureRunScopedMap<Y.Map<unknown>>(yDoc, resolveRunIdForExecution(yDoc, sessionRunId), BARRIER_STATE_MAP_KEY);\n}\n\nfunction readBarrierStateMap(yDoc: Y.Doc, sessionRunId?: string): Y.Map<Y.Map<unknown>> | undefined {\n if (usesLegacyRuntimeCompatibility(yDoc)) {\n return getExistingYMap<Y.Map<unknown>>(yDoc, BARRIER_STATE_MAP_KEY);\n }\n const runId = sessionRunId || resolveActiveRunId(yDoc);\n if (!runId) return undefined;\n return getRunScopedMap<Y.Map<unknown>>(yDoc, runId, BARRIER_STATE_MAP_KEY);\n}\n\nfunction getOrCreateListenerBarrierMap(yDoc: Y.Doc, listenerBlockId: string, sessionRunId?: string): Y.Map<unknown> {\n const outer = getBarrierStateMap(yDoc, sessionRunId);\n let inner = outer.get(listenerBlockId);\n if (!inner) {\n inner = new Y.Map();\n outer.set(listenerBlockId, inner);\n }\n return inner;\n}\n\n/** Record one source event firing toward a barrier. Idempotent — skips write if same runId already recorded. */\nexport function recordBarrierEvent(yDoc: Y.Doc, listenerBlockId: string, entry: BarrierEntry, sessionRunId?: string): boolean {\n let written = false;\n yDoc.transact(() => {\n const inner = getOrCreateListenerBarrierMap(yDoc, listenerBlockId, sessionRunId || entry.sessionRunId);\n const key = `${entry.sourceBlockId}::${entry.eventName}`;\n const existing = inner.get(key) as BarrierEntry | undefined;\n // Skip if same runId already recorded — prevents Yjs observer re-trigger loop\n if (existing && typeof existing === 'object' && (existing as BarrierEntry).runId === entry.runId) return;\n inner.set(key, entry);\n written = true;\n });\n return written;\n}\n\n/** Read all barrier entries for a listener block. */\nexport function readBarrierState(yDoc: Y.Doc, listenerBlockId: string, sessionRunId?: string): BarrierEntry[] {\n const outer = readBarrierStateMap(yDoc, sessionRunId);\n if (!outer) return [];\n const inner = outer.get(listenerBlockId);\n if (!inner) return [];\n const entries: BarrierEntry[] = [];\n inner.forEach((value) => {\n if (value && typeof value === 'object') {\n entries.push(value as BarrierEntry);\n }\n });\n return entries;\n}\n\n/** Clear barrier state after an invocation is queued (resets for next cycle). */\nexport function clearBarrierState(yDoc: Y.Doc, listenerBlockId: string, sessionRunId?: string): void {\n const outer = readBarrierStateMap(yDoc, sessionRunId);\n if (!outer) return;\n yDoc.transact(() => {\n outer.delete(listenerBlockId);\n });\n}\n\n/**\n * Compute a deterministic id for a barrier invocation from all contributing\n * source run IDs. Sorted to ensure order-independence — whichever source\n * completes last, the same ID is produced.\n */\nexport function computeBarrierInvocationId(entries: BarrierEntry[], listenerBlockId: string, sessionRunId?: string): string {\n const sorted = [...entries].sort((a, b) => a.sourceBlockId.localeCompare(b.sourceBlockId));\n const input = `${sessionRunId ? `${sessionRunId}|` : ''}${sorted.map((e) => `${e.sourceBlockId}:${e.runId}:${e.eventName}`).join('|')}|>${listenerBlockId}`;\n return `bi-${fnv1a32(input)}`;\n}\n\n/**\n * Merge barrier entries into a namespaced payload object keyed by alias.\n * E.g. { governance: { groupName, groupType }, members: { memberCount }, preview: { domainCardData } }\n */\nexport function mergeBarrierPayloads(entries: BarrierEntry[]): Record<string, unknown> {\n const merged: Record<string, unknown> = {};\n for (const entry of entries) {\n if (entry.alias) {\n merged[entry.alias] = entry.payload;\n } else {\n Object.assign(merged, entry.payload);\n }\n }\n return merged;\n}\n\n// ─── Run record helpers (audit trail integration, Phase 0 #2) ───────────────\n\n/**\n * Append a run record to the audit trail for a block. Run records are\n * stored as audit trail events with `type: 'block.run'` and the structured\n * data in `details`. Per Phase 0 #2 of eng review pass 2, this avoids\n * inventing a parallel `_yRunHistory` storage system.\n *\n * Y.Array.push from concurrent clients merges correctly — verified by the\n * existing `useAuditTrail` shipping in production.\n */\nexport function appendRunRecord(yDoc: Y.Doc, blockId: string, details: RunRecordDetails, userId: string): void {\n const auditMap = yDoc.getMap<Y.Array<unknown>>('auditTrail');\n\n yDoc.transact(() => {\n let arr = auditMap.get(blockId);\n if (!arr) {\n arr = new Y.Array<unknown>();\n auditMap.set(blockId, arr);\n }\n const event = {\n id: `${details.runId}`,\n blockId,\n type: RUN_RECORD_AUDIT_TYPE,\n details,\n message: undefined,\n meta: {\n timestamp: details.completedAt,\n userId,\n editable: false,\n },\n };\n arr.push([event]);\n });\n}\n\n/**\n * Read all run records for a block from the audit trail. Filters audit\n * trail entries to only those with `type: 'block.run'`.\n */\nexport function readRunRecords(yDoc: Y.Doc, blockId: string, sessionRunId?: string): RunRecordDetails[] {\n const auditMap = getExistingYMap<Y.Array<unknown>>(yDoc, 'auditTrail');\n if (!auditMap) return [];\n const arr = auditMap.get(blockId);\n if (!arr) return [];\n const records: RunRecordDetails[] = [];\n arr.forEach((entry) => {\n if (!entry || typeof entry !== 'object') return;\n const e = entry as { type?: string; details?: RunRecordDetails };\n if (e.type === RUN_RECORD_AUDIT_TYPE && e.details) {\n if (sessionRunId && !isRecordInRun(e.details.sessionRunId, sessionRunId)) {\n return;\n }\n records.push(e.details);\n }\n });\n return records;\n}\n\n// ─── Failure visibility (slice L: CP-1 + CP-2) ──────────────────────────────\n\n/**\n * A failed listener run, attributed to the source block emission that\n * triggered it. Used by the failure visibility surface (CP-1) on source\n * blocks: the source block can show \"N listeners failed for your last run\".\n */\nexport interface FailedListenerRun {\n /** Block id of the listener whose run failed. */\n listenerBlockId: string;\n /** The full RunRecordDetails of the failed listener invocation. */\n record: RunRecordDetails;\n}\n\n/**\n * Find all failed listener runs that were triggered by a specific source\n * block run. Walks every block's audit trail, filters to listener runs\n * triggered by (sourceBlockId, sourceRunId), and returns the ones with an\n * error set.\n *\n * Used by the source block UI to show a failure badge linked to a specific\n * run — if Sally evaluates 10 claims and 2 of Mike's emails fail, Sally\n * sees \"2 failed listeners on claim-G\" rather than discovering it days\n * later in the email service logs.\n */\nexport function findFailedListenersForSourceRun(yDoc: Y.Doc, sourceBlockId: string, sourceRunId: string, listenerBlockIds: string[]): FailedListenerRun[] {\n const failures: FailedListenerRun[] = [];\n for (const listenerBlockId of listenerBlockIds) {\n const records = readRunRecords(yDoc, listenerBlockId);\n for (const record of records) {\n if (!record.error) continue;\n if (record.triggeredBy?.sourceBlockId !== sourceBlockId) continue;\n if (record.fromPendingInvocationId == null) continue;\n // The fromPendingInvocationId encodes the source run; we match on\n // triggeredBy + the listener's record actually being a listener run\n // for THIS source block. The plan's deterministic id includes\n // sourceRunId, so failures from a specific source run are findable\n // by joining on the audit trail's stored sourceRunId reference.\n const sourceRunIdField = (record as { sourceRunId?: string }).sourceRunId;\n if (sourceRunIdField && sourceRunIdField !== sourceRunId) continue;\n failures.push({ listenerBlockId, record });\n }\n }\n return failures;\n}\n\n/**\n * Replay a previously failed listener run by re-queueing a pending\n * invocation with the same content. Reuses the original frozen payload\n * and ref snapshots from the failed run record's audit trail entry, so the\n * replay sees exactly the same data the original invocation saw.\n *\n * CP-2 from the plan. Used by the replay button in the failure visibility\n * surface. Returns true if a new pending invocation was queued.\n *\n * Note: replay does NOT re-derive the deterministic id from the original\n * source emission, because the original pending invocation's id is already\n * present (or removed) in the pendingInvocations Y.Map. Instead, replay\n * generates a fresh id by appending a `:replay-N` suffix to the original.\n * This means the replay creates a NEW pending invocation that the assignee\n * can act on, separate from any history of the original.\n */\nexport function replayFailedListenerRun(\n yDoc: Y.Doc,\n failedRecord: RunRecordDetails,\n listenerBlockId: string,\n originalPayload: Record<string, unknown>,\n originalRefSnapshots: Record<string, unknown>,\n assigneeDid: string,\n sessionRunId?: string\n): boolean {\n if (!failedRecord.triggeredBy) return false;\n const replayId = `${failedRecord.runId}:replay-${Date.now().toString(36)}`;\n const now = new Date().toISOString();\n const replay: PendingInvocation = {\n id: replayId,\n triggeringBlockId: failedRecord.triggeredBy.sourceBlockId,\n sourceRunId: (failedRecord as { sourceRunId?: string }).sourceRunId || failedRecord.runId,\n sessionRunId: sessionRunId || failedRecord.sessionRunId,\n eventName: failedRecord.triggeredBy.eventName,\n eventIndex: 0,\n payload: originalPayload,\n refSnapshots: originalRefSnapshots,\n assigneeDid,\n emittedAt: now,\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n };\n return queuePendingInvocation(yDoc, listenerBlockId, replay, sessionRunId || failedRecord.sessionRunId);\n}\n","/**\n * Flow Version Manifest\n *\n * Single source of truth for what each schema version requires.\n * Blocks and components read policy hints rather than checking version strings directly.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type FlowVersionString = '0.3' | '1.0.0';\n\nexport interface VersionPolicyUi {\n /** Show the delegation management panel in block config */\n showDelegationPanel: boolean;\n /** Show the whitelist (specific actors) option in authorization config */\n showWhitelistConfig: boolean;\n /** Show the \"anyone with flow access\" option in authorization config */\n showAnyoneConfig: boolean;\n /** Show a banner when a newer version is available */\n showMigrationBanner: boolean;\n /** Require PIN entry for block execution (invocation signing) */\n requirePinForExecution: boolean;\n}\n\nexport interface VersionPolicy {\n /** Semver-style version identifier */\n version: FlowVersionString;\n /** Human-readable label */\n label: string;\n /** Whether UCAN delegation chains are required for all executions */\n ucanRequired: boolean;\n /** Whether a root delegation must exist before any execution */\n delegationRootRequired: boolean;\n /** Whether whitelist-only authorization (no parentCapability) is acceptable */\n whitelistOnlyAllowed: boolean;\n /** Whether unrestricted access (no authorisedActors, no parentCapability) is acceptable */\n unrestrictedAllowed: boolean;\n /** Which execution path to use */\n executionPath: 'legacy' | 'invocation';\n /** Which authorization function to use */\n authorizationFn: 'v1' | 'v2';\n /** Allowed authorization modes in the UI */\n allowedAuthModes: Array<'anyone' | 'actors' | 'capability'>;\n /** UI rendering hints — blocks query these instead of checking version strings */\n ui: VersionPolicyUi;\n /** Human-readable description of this version */\n description: string;\n}\n\n// ---------------------------------------------------------------------------\n// Manifest\n// ---------------------------------------------------------------------------\n\nexport const VERSION_MANIFEST: Record<FlowVersionString, VersionPolicy> = {\n '0.3': {\n version: '0.3',\n label: 'Legacy',\n ucanRequired: false,\n delegationRootRequired: false,\n whitelistOnlyAllowed: true,\n unrestrictedAllowed: true,\n executionPath: 'legacy',\n authorizationFn: 'v1',\n allowedAuthModes: ['anyone', 'actors', 'capability'],\n ui: {\n showDelegationPanel: false,\n showWhitelistConfig: true,\n showAnyoneConfig: true,\n showMigrationBanner: true,\n requirePinForExecution: false,\n },\n description: 'Legacy version. UCAN optional, whitelist-only authorization accepted.',\n },\n '1.0.0': {\n version: '1.0.0',\n label: 'UCAN Required',\n ucanRequired: true,\n delegationRootRequired: true,\n whitelistOnlyAllowed: false,\n unrestrictedAllowed: false,\n executionPath: 'invocation',\n authorizationFn: 'v2',\n allowedAuthModes: ['capability'],\n ui: {\n showDelegationPanel: true,\n showWhitelistConfig: false,\n showAnyoneConfig: false,\n showMigrationBanner: false,\n requirePinForExecution: true,\n },\n description: 'UCAN-enforced. Every block execution requires a valid delegation chain.',\n },\n};\n\n/** The version stamped on newly created flows */\nexport const LATEST_VERSION: FlowVersionString = '1.0.0';\n\n// ---------------------------------------------------------------------------\n// TEMPORARY: UCAN enforcement kill switch\n// ---------------------------------------------------------------------------\n\n/**\n * TEMPORARY — while `true`, capability enforcement is disabled across the two\n * places a flow can be gated. It is deliberately **one** switch: two would mean\n * restoring enforcement in one place and silently leaving it off in the other.\n *\n * 1. **Block execution.** `getVersionPolicy` reports versions that declare\n * `ucanRequired` (i.e. 1.0.0) with `ucanRequired: false`,\n * `delegationRootRequired: false` and `ui.requirePinForExecution: false`, so\n * blocks execute without a delegation chain, reconciliation trusts run\n * records without invocations, and no PIN is requested.\n * 2. **Run lifecycle.** `runLifecycle.ts#requireAuthorization` skips the\n * injected authorizer, so starting, migrating, closing and cancelling a\n * session are not gated. Consumers inject their own authorizer there — in\n * the Portal a Matrix power-level check — and that is what this bypasses.\n *\n * The manifest itself is untouched, and nothing else is: the run timeline is\n * still appended, the proof guard still refuses a completion without evidence,\n * and terminal state is still write-once. This removes the *permission* check,\n * not any of the correctness machinery.\n *\n * To restore enforcement: set the default back to `false`, and revert the\n * kill-switch assertions in `ucanEnforcement.test.ts` and\n * `runLifecycleAuthorization.test.ts`.\n */\nlet tempUcanEnforcementDisabled = true;\n\n/** Read the current state of the temporary kill switch above. */\nexport function isTempUcanEnforcementDisabled(): boolean {\n return tempUcanEnforcementDisabled;\n}\n\n/** Toggle the temporary kill switch (test hook / consumer escape hatch). */\nexport function setTempUcanEnforcementDisabled(disabled: boolean): void {\n tempUcanEnforcementDisabled = disabled;\n}\n\n/** Ordered migration path — each flow must step through versions sequentially */\nexport const MIGRATION_PATH: FlowVersionString[] = ['0.3', '1.0.0'];\n\n// ---------------------------------------------------------------------------\n// Utility functions\n// ---------------------------------------------------------------------------\n\n/**\n * Get the policy for a given schema version.\n * Unknown versions fall back to the strictest (latest) policy.\n */\nexport function getVersionPolicy(version: string): VersionPolicy {\n const policy = VERSION_MANIFEST[version as FlowVersionString] ?? VERSION_MANIFEST[LATEST_VERSION];\n // TEMPORARY: see the kill switch above — soften UCAN-enforcing policies.\n if (tempUcanEnforcementDisabled && policy.ucanRequired) {\n return {\n ...policy,\n ucanRequired: false,\n delegationRootRequired: false,\n ui: { ...policy.ui, requirePinForExecution: false },\n };\n }\n return policy;\n}\n\n/**\n * Check whether `current` is at least `minimum` in the migration path.\n */\nexport function isVersionAtLeast(current: string, minimum: FlowVersionString): boolean {\n const currentIdx = MIGRATION_PATH.indexOf(current as FlowVersionString);\n const minimumIdx = MIGRATION_PATH.indexOf(minimum);\n // Unknown versions are treated as latest (highest index)\n const effectiveCurrent = currentIdx === -1 ? MIGRATION_PATH.length : currentIdx;\n return effectiveCurrent >= minimumIdx;\n}\n\n/**\n * Get the next version in the migration path, or null if already at latest.\n */\nexport function getNextVersion(current: string): FlowVersionString | null {\n const idx = MIGRATION_PATH.indexOf(current as FlowVersionString);\n if (idx === -1 || idx >= MIGRATION_PATH.length - 1) {\n return null;\n }\n return MIGRATION_PATH[idx + 1];\n}\n\n/**\n * Get the chain of versions needed to migrate from `from` to `to`.\n * Returns the intermediate and target versions (excludes the `from` version).\n * Returns empty array if no migration needed or path is invalid.\n */\nexport function getMigrationChain(from: string, to: string): FlowVersionString[] {\n const fromIdx = MIGRATION_PATH.indexOf(from as FlowVersionString);\n const toIdx = MIGRATION_PATH.indexOf(to as FlowVersionString);\n\n if (fromIdx === -1 || toIdx === -1 || fromIdx >= toIdx) {\n return [];\n }\n\n return MIGRATION_PATH.slice(fromIdx + 1, toIdx + 1);\n}\n","import * as Y from 'yjs';\nimport type { IxoEditorType } from '../../types/editor';\nimport type { TriggerSpec } from '../../types/baseUcan';\nimport { getAction } from '../actionRegistry/registry';\nimport { getVersionPolicy } from './versionManifest';\nimport { warnOnce } from '../warnOnce';\nimport { readActionState, resolveRunIdForExecution, writeActionState } from './runs';\nimport {\n computePendingInvocationId,\n computeBarrierInvocationId,\n mergeBarrierPayloads,\n queuePendingInvocation,\n readConsumedPendingInvocationIds,\n readRunRecords,\n readBarrierState,\n recordBarrierEvent,\n clearBarrierState,\n snapshotInputRefs,\n sweepExpiredPendingInvocations,\n type PendingInvocation,\n type RunRecordDetails,\n} from './triggers';\n\n/**\n * Reconciliation loop — turns persisted run records into pending invocations\n * idempotently, so the trigger system survives page refreshes and works\n * across multiple connected clients.\n *\n * See `docs/flow-engine/events-and-triggers-plan.md` §18 for the full design rationale.\n *\n * Called from:\n * - The editor lifecycle on open (alongside performDMNotificationScan)\n * - The yDoc observer when remote run records arrive\n * - Immediately after a local action completes\n *\n * Idempotency comes from `computePendingInvocationId` producing the same id\n * for the same (sourceBlockId, sourceRunId, listenerBlockId, eventName,\n * eventIndex) tuple. Both ends of a sync compute the same id, both call\n * `Y.Map.set` on the same key, Yjs converges to one entry.\n *\n * The loop is intentionally write-only-on-new — it never deletes pending\n * invocations. Removal happens elsewhere (assignee invokes, expiration sweep).\n */\nconst activeReconciliations = new WeakMap<Y.Doc, Set<string>>();\n\nfunction flattenBlocks(blocks: any[]): any[] {\n const flattened: any[] = [];\n const visit = (block: any) => {\n flattened.push(block);\n if (Array.isArray(block?.children)) block.children.forEach(visit);\n };\n blocks.forEach(visit);\n return flattened;\n}\n\nexport function reconcilePendingInvocations(editor: IxoEditorType, runId?: string): void {\n const yDoc = (editor as unknown as { _yDoc?: Y.Doc })._yDoc;\n if (!yDoc) return;\n const sessionRunId = resolveRunIdForExecution(yDoc, runId);\n let activeRuns = activeReconciliations.get(yDoc);\n if (!activeRuns) {\n activeRuns = new Set();\n activeReconciliations.set(yDoc, activeRuns);\n }\n // Re-entrancy guard: barrier state writes trigger Yjs observers which\n // re-invoke reconciliation synchronously. Without this guard, cascading\n // re-entrant calls process different source blocks, each writing a new\n // barrier entry that triggers yet another observer. The guard ensures the\n // outer call completes all blocks before any observer-triggered call runs.\n if (activeRuns.has(sessionRunId)) return;\n activeRuns.add(sessionRunId);\n try {\n _reconcilePendingInvocationsInner(editor, yDoc, sessionRunId);\n } finally {\n activeRuns.delete(sessionRunId);\n }\n}\n\nfunction _reconcilePendingInvocationsInner(editor: IxoEditorType, yDoc: Y.Doc, runId: string): void {\n const blocks = flattenBlocks((editor as unknown as { document?: any[] }).document || []);\n if (blocks.length === 0) return;\n\n // Build a map of (sourceBlockId, eventName) → listenerBlocks[]\n // by walking every block's parsed trigger.\n const listenersBySource = new Map<string, Array<{ block: any; trigger: TriggerSpec }>>();\n const barrierListenersBySource = new Map<string, Array<{ block: any; trigger: TriggerSpec; source: { sourceBlockId: string; eventName: string; alias: string } }>>();\n\n for (const block of blocks) {\n const trigger = parseTrigger(block);\n if (!trigger) continue;\n\n if (trigger.type === 'block.event') {\n if (!trigger.sourceBlockId || !trigger.eventName) continue;\n const key = `${trigger.sourceBlockId}::${trigger.eventName}`;\n if (!listenersBySource.has(key)) listenersBySource.set(key, []);\n listenersBySource.get(key)!.push({ block, trigger });\n } else if (trigger.type === 'block.event.all' && trigger.sources) {\n for (const source of trigger.sources) {\n if (!source.sourceBlockId || !source.eventName) continue;\n const key = `${source.sourceBlockId}::${source.eventName}`;\n if (!barrierListenersBySource.has(key)) barrierListenersBySource.set(key, []);\n barrierListenersBySource.get(key)!.push({ block, trigger, source });\n }\n }\n }\n\n if (listenersBySource.size === 0 && barrierListenersBySource.size === 0) return;\n\n // Compaction: physically drop expired pending invocations. Re-queue is\n // prevented below (queue-time expiry check), so the sweep cannot fight\n // the write-only-on-new loop.\n const now = Date.now();\n sweepExpiredPendingInvocations(yDoc, now, runId);\n\n // Consumed-invocation dedup, computed lazily per listener: a listener's\n // own run records carry fromPendingInvocationId, and those ids must never\n // be re-queued from the immutable source run record.\n const consumedByListener = new Map<string, Set<string>>();\n const isConsumed = (listenerBlockId: string, pendingId: string): boolean => {\n let consumed = consumedByListener.get(listenerBlockId);\n if (!consumed) {\n consumed = readConsumedPendingInvocationIds(yDoc, listenerBlockId, runId);\n consumedByListener.set(listenerBlockId, consumed);\n }\n return consumed.has(pendingId);\n };\n\n // On UCAN-enforced flows, only run records that reference a resolvable\n // invocation may fire triggers — a hand-written run record (or one from a\n // permissive-era client) must not advance the flow.\n const schemaVersionRaw = yDoc.getMap('root').get('schema_version');\n const ucanRequired = typeof schemaVersionRaw === 'string' ? !!getVersionPolicy(schemaVersionRaw)?.ucanRequired : false;\n const invocationsMap = yDoc.getMap('invocations');\n\n // IGNITION PHASE A: the session run every read and write below is scoped to.\n // Constant in Phase A. Resolved from the doc, never from `editor._yRuntime` —\n // that handle is the flat map (or, on the headless path, a read-only shim),\n // and reading it directly would make `refSnapshots` see a *stale* output\n // whenever the run entry is the fresher side. Snapshots are frozen into\n // pending invocations, so a stale read here is signed against later.\n const getNodeOutput = (nodeId: string): Record<string, unknown> | undefined => {\n const out = readActionState(yDoc, runId, nodeId).output;\n return out && typeof out === 'object' && !Array.isArray(out) ? out : undefined;\n };\n\n // For each block that has subscribed listeners, walk its run records and\n // queue pending invocations for any (run, event) pairs not yet queued.\n for (const block of blocks) {\n const sourceBlockId = block?.id;\n if (!sourceBlockId) continue;\n\n // Quick check — does any listener subscribe to this block at all?\n let hasAnyListener = false;\n for (const key of listenersBySource.keys()) {\n if (key.startsWith(`${sourceBlockId}::`)) {\n hasAnyListener = true;\n break;\n }\n }\n for (const key of barrierListenersBySource.keys()) {\n if (key.startsWith(`${sourceBlockId}::`)) {\n hasAnyListener = true;\n break;\n }\n }\n if (!hasAnyListener) continue;\n\n const records = readRunRecords(yDoc, sourceBlockId, runId);\n for (const record of records) {\n if (!isTrustedRunRecord(record, ucanRequired, invocationsMap)) continue;\n processRunRecord(yDoc, runId, sourceBlockId, record, listenersBySource, getNodeOutput, isConsumed, now);\n processBarrierRunRecord(yDoc, runId, sourceBlockId, record, barrierListenersBySource, getNodeOutput, isConsumed, now);\n }\n }\n}\n\n/**\n * Materialize `trigger: flow.start` as durable pending invocations in the new\n * run. The run.started Matrix event is the source fact; deterministic ids make\n * reconnect/retry safe without keeping a second history log in the Y.Doc.\n */\nexport function dispatchFlowStartTriggers(params: { yDoc: Y.Doc; runId: string; blocks: any[]; startedAt: number; sourceEventId?: string }): number {\n const blocks = flattenBlocks(params.blocks);\n const sourceRunId = params.sourceEventId || `${params.runId}:run.started`;\n const emittedAt = new Date(params.startedAt).toISOString();\n const getNodeOutput = (nodeId: string): Record<string, unknown> | undefined => {\n const output = readActionState(params.yDoc, params.runId, nodeId).output;\n return output && typeof output === 'object' && !Array.isArray(output) ? output : undefined;\n };\n let queued = 0;\n\n for (const block of blocks) {\n const trigger = parseTrigger(block);\n if (trigger?.type !== 'flow.start' || !block?.id) continue;\n const id = computePendingInvocationId({\n sourceBlockId: '__flow_start__',\n sourceRunId,\n listenerBlockId: block.id,\n eventName: 'flow.start',\n eventIndex: 0,\n sessionRunId: params.runId,\n });\n const inputs = parseInputs(block);\n const refSnapshots = snapshotInputRefs(inputs, getNodeOutput);\n const invocation: PendingInvocation = {\n id,\n triggeringBlockId: '__flow_start__',\n sourceRunId,\n sessionRunId: params.runId,\n eventName: 'flow.start',\n eventIndex: 0,\n payload: {\n runId: params.runId,\n startedAt: params.startedAt,\n ...(params.sourceEventId ? { eventId: params.sourceEventId } : {}),\n },\n refSnapshots,\n assigneeDid: resolveAssignee(block) || 'unassigned',\n emittedAt,\n expiresAt: computeExpiry(block, emittedAt),\n };\n if (queuePendingInvocation(params.yDoc, block.id, invocation, params.runId)) {\n queued += 1;\n }\n writeActionState(params.yDoc, params.runId, block.id, {\n pendingPayload: { ...invocation.payload, ...refSnapshots },\n });\n }\n return queued;\n}\n\n/**\n * Decide whether a run record may act as a trigger source.\n *\n * Legacy flows trust every record (room-level access control). On\n * UCAN-enforced flows a record must reference an invocation that resolves in\n * the doc's `invocations` map — INCLUDING read-back reconciliation records.\n *\n * H3: read-back records (`reconciled: true`) used to be trusted\n * unconditionally, so any room member could write a record with that flag set\n * and fire downstream triggers on a UCAN-enforced flow. They now chain to the\n * same evidence as every other record: `writeReconciliationRunRecord` carries\n * the original execution's `invocationCid` forward (from the read-back\n * metadata), and that CID must resolve here. A hand-written `reconciled: true`\n * with no resolvable invocation is no longer trusted.\n *\n * TRUST BOUNDARY (still open, tracked as the remaining part of H3): this is a\n * store-level presence check. The invocation's CAR signature was verified when\n * it was minted, but it is NOT re-verified here. A room member with write\n * access can still forge BOTH a run record and a matching invocation entry.\n * Fully closing forgery requires re-verifying the stored CAR signature against\n * the delegation chain at read time — a 1.0.0 trust-model decision, not a\n * presence tweak. Do not describe this check as making completions\n * unforgeable.\n */\nfunction isTrustedRunRecord(record: RunRecordDetails, ucanRequired: boolean, invocationsMap: Y.Map<unknown>): boolean {\n if (!ucanRequired) return true;\n if (!record.invocationCid) return false;\n return invocationsMap.get(record.invocationCid) !== undefined;\n}\n\n/**\n * Process a single run record: for each event it emitted, queue a pending\n * invocation on every subscribed listener if not already queued.\n */\nfunction processRunRecord(\n yDoc: Y.Doc,\n runId: string,\n sourceBlockId: string,\n record: RunRecordDetails,\n listenersBySource: Map<string, Array<{ block: any; trigger: TriggerSpec }>>,\n getNodeOutput: (nodeId: string) => Record<string, unknown> | undefined,\n isConsumed: (listenerBlockId: string, pendingId: string) => boolean,\n now: number\n): void {\n if (!Array.isArray(record.events)) return;\n\n record.events.forEach((event, eventIndex) => {\n if (!event?.name) return;\n const key = `${sourceBlockId}::${event.name}`;\n const listeners = listenersBySource.get(key);\n if (!listeners || listeners.length === 0) return;\n\n for (const { block: listenerBlock } of listeners) {\n const listenerBlockId = listenerBlock.id;\n if (!listenerBlockId) continue;\n\n const id = computePendingInvocationId({\n sourceBlockId,\n sourceRunId: record.runId,\n listenerBlockId,\n eventName: event.name,\n eventIndex,\n sessionRunId: runId,\n });\n\n // A pending invocation the listener already ran must not resurrect\n // from the immutable source run record after its removal-on-invoke.\n if (isConsumed(listenerBlockId, id)) continue;\n\n const assigneeDid = resolveAssignee(listenerBlock) || 'unassigned';\n\n // Snapshot every nodeId.output.* ref the listener references at this\n // moment. This is the §3.5.1 fix that makes the Sally → Mike scenario\n // produce frozen values per pending invocation.\n const inputs = parseInputs(listenerBlock);\n const refSnapshots = snapshotInputRefs(inputs, getNodeOutput);\n\n const expiresAt = computeExpiry(listenerBlock, record.completedAt);\n\n // Never (re-)queue an invocation that is already past its expiry —\n // this is what lets the expiration sweep physically delete entries\n // without the write-only-on-new loop restoring them.\n if (expiresAt && Date.parse(expiresAt) < now) continue;\n\n const invocation: PendingInvocation = {\n id,\n triggeringBlockId: sourceBlockId,\n sourceRunId: record.runId,\n sessionRunId: runId,\n eventName: event.name,\n eventIndex,\n payload: event.payload as Record<string, unknown>,\n refSnapshots,\n assigneeDid,\n emittedAt: record.completedAt,\n expiresAt,\n };\n\n queuePendingInvocation(yDoc, listenerBlockId, invocation, runId);\n\n // Write the payload into the listener's runtime so the FlowDetail\n // can read it without depending on React state. Through the waist:\n // run entry + flat mirror, one transaction, merged onto the resolved\n // previous value (a raw flat read-modify-write here would drop whatever\n // the run entry holds).\n writeActionState(yDoc, runId, listenerBlockId, {\n pendingPayload: { ...(event.payload as Record<string, unknown>), ...refSnapshots },\n });\n }\n });\n}\n\nfunction processBarrierRunRecord(\n yDoc: Y.Doc,\n runId: string,\n sourceBlockId: string,\n record: RunRecordDetails,\n barrierListenersBySource: Map<string, Array<{ block: any; trigger: TriggerSpec; source: { sourceBlockId: string; eventName: string; alias: string } }>>,\n getNodeOutput: (nodeId: string) => Record<string, unknown> | undefined,\n isConsumed: (listenerBlockId: string, pendingId: string) => boolean,\n now: number\n): void {\n if (!Array.isArray(record.events)) return;\n\n for (const event of record.events) {\n if (!event?.name) continue;\n const key = `${sourceBlockId}::${event.name}`;\n const listeners = barrierListenersBySource.get(key);\n if (!listeners || listeners.length === 0) continue;\n\n for (const { block: listenerBlock, trigger, source } of listeners) {\n const listenerBlockId = listenerBlock.id;\n if (!listenerBlockId) continue;\n\n const entry = {\n sourceBlockId,\n eventName: event.name,\n alias: source.alias,\n runId: record.runId,\n sessionRunId: runId,\n payload: (event.payload as Record<string, unknown>) || {},\n emittedAt: record.completedAt,\n };\n\n recordBarrierEvent(yDoc, listenerBlockId, entry, runId);\n\n // Accumulate this source's payload into the listener's runtime so partial\n // barrier state is visible to the FlowDetail. Read through the waist too:\n // accumulating onto a raw flat read would silently discard partial\n // barrier payload already accumulated in the run entry.\n const existing = readActionState(yDoc, runId, listenerBlockId).pendingPayload || {};\n writeActionState(yDoc, runId, listenerBlockId, {\n pendingPayload: { ...existing, ...((event.payload as Record<string, unknown>) || {}) },\n });\n\n const allSources = trigger.sources || [];\n const currentState = readBarrierState(yDoc, listenerBlockId, runId);\n\n // Optional sources don't gate queuing — the barrier fires once every\n // required source has fired. Optional payloads are merged in if they\n // already arrived (mergeBarrierPayloads reads currentState below).\n const requiredSources = allSources.filter((s) => s.optional !== true);\n // Degenerate all-optional config falls back to \"all sources\" so the\n // barrier can still complete instead of never firing.\n const gatingSources = requiredSources.length > 0 ? requiredSources : allSources;\n\n const allFired = gatingSources.length > 0 && gatingSources.every((s) => currentState.some((e) => e.sourceBlockId === s.sourceBlockId && e.eventName === s.eventName));\n\n if (!allFired) continue;\n\n const assigneeDid = resolveAssignee(listenerBlock) || 'unassigned';\n\n const id = computeBarrierInvocationId(currentState, listenerBlockId, runId);\n // A barrier invocation the listener already ran must not resurrect.\n if (isConsumed(listenerBlockId, id)) continue;\n const mergedPayload = mergeBarrierPayloads(currentState);\n\n const inputs = parseInputs(listenerBlock);\n const refSnapshots = snapshotInputRefs(inputs, getNodeOutput);\n const expiresAt = computeExpiry(listenerBlock, record.completedAt);\n\n // Never (re-)queue an invocation that is already past its expiry —\n // this is what lets the expiration sweep physically delete entries\n // without the write-only-on-new loop restoring them.\n if (expiresAt && Date.parse(expiresAt) < now) continue;\n\n const invocation: PendingInvocation = {\n id,\n triggeringBlockId: sourceBlockId,\n sourceRunId: record.runId,\n sessionRunId: runId,\n eventName: `barrier:${allSources.map((s) => s.alias).join('+')}`,\n eventIndex: 0,\n payload: mergedPayload,\n refSnapshots,\n assigneeDid,\n emittedAt: record.completedAt,\n expiresAt,\n };\n\n queuePendingInvocation(yDoc, listenerBlockId, invocation, runId);\n clearBarrierState(yDoc, listenerBlockId, runId);\n\n // Persist the merged payload into the listener block's runtime so the\n // FlowDetail can read it across navigation without relying on React state.\n writeActionState(yDoc, runId, listenerBlockId, {\n pendingPayload: { ...mergedPayload, ...refSnapshots },\n });\n }\n }\n}\n\n// ─── Block prop helpers ─────────────────────────────────────────────────────\n\nfunction parseTrigger(block: any): TriggerSpec | null {\n const raw = block?.props?.trigger;\n if (!raw || typeof raw !== 'string') return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object' && typeof parsed.type === 'string') {\n return parsed as TriggerSpec;\n }\n } catch {\n // Invalid trigger JSON — treat as no trigger, but say so once.\n warnOnce(`trigger-parse:${block?.id}`, `[flow-config] block ${block?.id}: props.trigger is not valid JSON; trigger ignored`);\n }\n return null;\n}\n\nfunction parseInputs(block: any): Record<string, unknown> {\n const raw = block?.props?.inputs;\n if (!raw || typeof raw !== 'string') return {};\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object') return parsed as Record<string, unknown>;\n } catch {\n // Invalid inputs JSON — treat as empty, but say so once.\n warnOnce(`inputs-parse:${block?.id}`, `[flow-config] block ${block?.id}: props.inputs is not valid JSON; treated as empty`);\n }\n return {};\n}\n\nfunction resolveAssignee(block: any): string | undefined {\n const raw = block?.props?.assignment;\n if (!raw) return undefined;\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n const did = parsed?.assignedActor?.did;\n return typeof did === 'string' && did.length > 0 ? did : undefined;\n } catch {\n warnOnce(`assignment-parse:${block?.id}`, `[flow-config] block ${block?.id}: props.assignment is not valid JSON; assignee unresolved`);\n return undefined;\n }\n}\n\n/**\n * Compute the expiration timestamp for a pending invocation, reusing the\n * existing TTL props on the listener block (slice D persists these via\n * blockMapping). Falls back to 7 days from emission if no TTL is set.\n */\nfunction computeExpiry(block: any, emittedAt: string): string {\n const ttlAbsolute = block?.props?.ttlAbsoluteDueDate;\n if (typeof ttlAbsolute === 'string' && ttlAbsolute) {\n return ttlAbsolute;\n }\n\n const ttlFromEnablement = block?.props?.ttlFromEnablement;\n if (typeof ttlFromEnablement === 'string' && ttlFromEnablement) {\n // Parse ISO 8601 duration like \"P7D\" → milliseconds\n const ms = parseIsoDurationToMs(ttlFromEnablement);\n if (ms != null) {\n return new Date(new Date(emittedAt).getTime() + ms).toISOString();\n }\n }\n\n // Default: 7 days\n return new Date(new Date(emittedAt).getTime() + 7 * 24 * 60 * 60 * 1000).toISOString();\n}\n\n/** Parse a small subset of ISO 8601 durations: P[n]D, PT[n]H, PT[n]M, PT[n]S. */\nfunction parseIsoDurationToMs(duration: string): number | null {\n const match = /^P(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?$/.exec(duration);\n if (!match) return null;\n const [, d, h, m, s] = match;\n let ms = 0;\n if (d) ms += parseInt(d, 10) * 24 * 60 * 60 * 1000;\n if (h) ms += parseInt(h, 10) * 60 * 60 * 1000;\n if (m) ms += parseInt(m, 10) * 60 * 1000;\n if (s) ms += parseInt(s, 10) * 1000;\n return ms;\n}\n\n// ─── Action registry compatibility ──────────────────────────────────────────\n// The reconciliation loop doesn't strictly need to look up the action — it\n// trusts the compiler to have validated the trigger and event vocabulary at\n// compile time. But for diagnostics, expose a helper that returns the action\n// for a given block. Used by slice F's tests and slice J's UI.\n\nexport function getActionForBlock(block: any): ReturnType<typeof getAction> {\n const actionType = block?.props?.actionType;\n if (typeof actionType !== 'string') return undefined;\n return getAction(actionType);\n}\n","import * as Y from 'yjs';\nimport type { IxoEditorType } from '../../types/editor';\nimport { resolveActiveRunId } from './runs';\nimport { appendRunRecord, type RunRecordDetails } from './triggers';\nimport { reconcilePendingInvocations } from './reconcile';\n\n/**\n * Write a run record to the audit trail and trigger the reconciliation loop\n * so listener blocks pick up the emitted events as pending invocations.\n *\n * Call this after `updateRuntime({ state: 'completed', output })` in any\n * FlowDetail component whose action defines events.\n *\n * @param runId The **session run** (`runs.ts`) this emission belongs to.\n * Defaults to the active run. Recorded additively as\n * `RunRecordDetails.sessionRunId`; nothing in Phase A reads it, and it is\n * deliberately kept out of `computePendingInvocationId` (D2 / spec §2 rule 8\n * — the id space moves in Phase B, together with `pendingInvocations` and\n * `barrierState`, or the same logical event queues once per generation).\n */\nexport function writeRunRecordAndReconcile(\n editor: IxoEditorType,\n blockId: string,\n output: Record<string, unknown>,\n events: Array<{ name: string; payload: Record<string, unknown> }>,\n actorDid: string,\n detailsPatch: Partial<RunRecordDetails> & { sourceRunId?: string } = {},\n runId?: string\n): void {\n const yDoc = (editor as unknown as { _yDoc?: Y.Doc })._yDoc;\n if (!yDoc) return;\n if (events.length === 0) return;\n\n // The per-EXECUTION audit id, not the session run — `RunRecordDetails.runId`\n // keeps its historical meaning and format because it is live persisted data\n // feeding `computePendingInvocationId` (D2).\n const executionId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const now = new Date().toISOString();\n\n const details: RunRecordDetails = {\n runId: executionId,\n sessionRunId: runId || resolveActiveRunId(yDoc),\n output,\n events,\n startedAt: now,\n completedAt: now,\n actorDid,\n ...detailsPatch,\n };\n\n appendRunRecord(yDoc, blockId, details, actorDid);\n reconcilePendingInvocations(editor, details.sessionRunId);\n}\n","import type { Doc, Map as YMap } from 'yjs';\nimport type { FlowNodeRuntimeState } from '../../types/authorization';\nimport type { IxoEditorType } from '../../types/editor';\nimport { FLOW_CONNECTION_BINDINGS_MAP_KEY } from '../flowCompiler/connections';\nimport { DM_NOTIFICATIONS_MAP_KEY } from './dmNotificationState';\nimport { RUNS_MAP_KEY, RUNS_TERMINAL_MAP_KEY, createRunScopedRuntimeManager, resolveRunIdForExecution } from './runs';\nimport { BARRIER_STATE_MAP_KEY } from './triggers';\n\nconst XERO_WORK_ITEMS_MAP_NAME = 'xeroWorkItems';\nconst XERO_WORK_TERMINAL_MAP_NAME = 'xeroWorkItemsTerminal';\nconst XERO_CONNECTION_MAP_NAME = 'xeroConnection';\n\nexport interface FlowRuntimeStateManager {\n get: (nodeId: string) => FlowNodeRuntimeState;\n update: (nodeId: string, updates: Partial<FlowNodeRuntimeState>) => void;\n}\n\n/**\n * The small, public Y.Doc surface needed to clear execution state.\n *\n * Keeping this structural prevents a linked consumer with a compatible Yjs\n * minor version from inheriting this package's private Y.Doc type identity.\n * Template cleanup only needs map iteration/deletion and one transaction.\n */\nexport interface TemplateCloneDocument {\n getMap(name?: string): {\n forEach(callback: (value: unknown, key: string) => void): void;\n delete(key: string): void;\n };\n transact(callback: () => void): void;\n}\n\nconst ensureStateObject = (value: unknown): FlowNodeRuntimeState => {\n if (!value || typeof value !== 'object') {\n return {};\n }\n return { ...(value as FlowNodeRuntimeState) };\n};\n\nconst createYMapManager = (map: YMap<any>): FlowRuntimeStateManager => {\n return {\n get: (nodeId: string) => {\n const stored = map.get(nodeId);\n return ensureStateObject(stored);\n },\n update: (nodeId: string, updates: Partial<FlowNodeRuntimeState>) => {\n const current = ensureStateObject(map.get(nodeId));\n map.set(nodeId, { ...current, ...updates });\n },\n };\n};\n\nconst createMemoryManager = (): FlowRuntimeStateManager => {\n const memory = new Map<string, FlowNodeRuntimeState>();\n return {\n get: (nodeId: string) => ensureStateObject(memory.get(nodeId)),\n update: (nodeId: string, updates: Partial<FlowNodeRuntimeState>) => {\n const current = ensureStateObject(memory.get(nodeId));\n memory.set(nodeId, { ...current, ...updates });\n },\n };\n};\n\n/**\n * Resolve the Y.Doc behind an editor handle.\n *\n * `_yDoc` is the real field; `_yRuntime.doc` is the long-standing fallback used\n * across this repo (`useEntities.ts`, `DebugButton.tsx`) and by every test that\n * builds an editor stub as `{ _yRuntime: yDoc.getMap('runtime') }`. A duck-typed\n * mock map has no `.doc`, which is exactly what keeps those callers on the\n * legacy path below instead of throwing.\n *\n * Exported so the React write path (`useNodeRuntime`) resolves the doc by\n * exactly the same rule the core write path does. Two subtly different\n * resolutions would leave the two twins of a path on different generations —\n * precisely the half-measure §9.3's adoption gate exists to forbid.\n */\nexport function resolveEditorYDoc(editor?: IxoEditorType | null): Doc | undefined {\n const direct = (editor as { _yDoc?: Doc } | null | undefined)?._yDoc;\n if (direct && typeof direct.getMap === 'function') return direct;\n const viaRuntime = (editor as { _yRuntime?: { doc?: Doc } } | null | undefined)?._yRuntime?.doc;\n return viaRuntime && typeof viaRuntime.getMap === 'function' ? viaRuntime : undefined;\n}\n\n/**\n * `FlowRuntimeStateManager` for an editor.\n *\n * IGNITION PHASE A: when a Y.Doc is reachable this delegates to the run-scoped\n * manager (`runs.ts#createRunScopedRuntimeManager`), so every `update()` made\n * through it dual-writes the run entry and the flat mirror in one transaction,\n * and every `get()` resolves the two through the freshness predicate. That is\n * what makes a *downgrade* — a reset, an unchecked box, a read-back proof\n * failure — visible on both sides; a flat-only downgrade can never be\n * materialised into the run and would strand the stale higher state forever\n * (§9.3 The adoption gate).\n *\n * The name is kept because it is public API (`src/index.ts`, `src/core/index.ts`).\n *\n * The two non-doc branches are unchanged on purpose: a duck-typed `_yRuntime`\n * (test stubs, mocks) still gets a plain map manager, and a handle-less editor\n * still gets the historical in-memory manager rather than a throw — narrowing\n * that contract is a separate, breaking change.\n */\nexport const createRuntimeStateManager = (editor?: IxoEditorType | null, runId?: string): FlowRuntimeStateManager => {\n const yDoc = resolveEditorYDoc(editor);\n if (yDoc) {\n return createRunScopedRuntimeManager(yDoc, resolveRunIdForExecution(yDoc, runId));\n }\n if (editor?._yRuntime) {\n return createYMapManager(editor._yRuntime);\n }\n return createMemoryManager();\n};\n\n/**\n * `FlowRuntimeStateManager` for a Y.Doc.\n *\n * IGNITION PHASE A: a thin alias for the run-scoped manager over the active\n * run. Kept as a named export because it is public API and both orchestrators\n * (flow-manager, flow-agent) import it.\n */\nexport const createYDocRuntimeManager = (yDoc: Doc, runId?: string): FlowRuntimeStateManager => {\n return createRunScopedRuntimeManager(yDoc, resolveRunIdForExecution(yDoc, runId));\n};\n\n/**\n * Clears runtime, invocations, and pending invocations from a Y.Doc.\n * Used when cloning a flow as a template — the new document should\n * carry only configuration (intent), not execution history.\n *\n * The audit trail (which now also holds run records as `type: 'block.run'`\n * entries) and pending invocations are observation, not configuration —\n * both are cleared on template clone.\n *\n * `barrierState` belongs to the same class and was missing here: a partially\n * filled barrier (`block.event.all`) survived the clone, so a single source\n * firing in the clone could satisfy the barrier using entries emitted in the\n * *source* flow and queue an invocation whose merged payload mixes two flows.\n *\n * `dmNotificationState` is dedup bookkeeping about DMs that were sent for the\n * source flow's execution; carrying it into a clone suppresses the clone's\n * first legitimate notification for every block already notified upstream.\n *\n * `runs` and `runsTerminal` are where that same execution state now lives\n * (Ignition Phase A). Clearing the flat `runtime` map without clearing `runs`\n * would leave the clone pre-completed for every adopted block. Deleting the\n * outer run key is sufficient — the nested per-run maps go with it.\n *\n * `qi.flow.connectionBindings` names one workspace's connected accounts, so it\n * is cleared too: a clone that kept them would point at a Xero organisation its\n * own members hold no grant for, and would read as connected while every call\n * through it fails. The requirements themselves (`qi.flow.connections`) are\n * configuration and survive, exactly like the participant roster.\n */\nexport function clearRuntimeForTemplateClone(yDoc: TemplateCloneDocument): void {\n const runtime = yDoc.getMap('runtime');\n const runs = yDoc.getMap(RUNS_MAP_KEY);\n const runsTerminal = yDoc.getMap(RUNS_TERMINAL_MAP_KEY);\n const invocations = yDoc.getMap('invocations');\n const pendingInvocations = yDoc.getMap('pendingInvocations');\n const barrierState = yDoc.getMap(BARRIER_STATE_MAP_KEY);\n const dmNotificationState = yDoc.getMap(DM_NOTIFICATIONS_MAP_KEY);\n const agentOutbox = yDoc.getMap('agentOutbox');\n const agentLeases = yDoc.getMap('agentLeases');\n const auditTrail = yDoc.getMap('auditTrail');\n const xeroWorkItems = yDoc.getMap(XERO_WORK_ITEMS_MAP_NAME);\n const xeroWorkTerminal = yDoc.getMap(XERO_WORK_TERMINAL_MAP_NAME);\n const xeroConnection = yDoc.getMap(XERO_CONNECTION_MAP_NAME);\n const connectionBindings = yDoc.getMap(FLOW_CONNECTION_BINDINGS_MAP_KEY);\n const root = yDoc.getMap('root');\n\n yDoc.transact(() => {\n runtime.forEach((_, key) => runtime.delete(key));\n runs.forEach((_, key) => runs.delete(key));\n runsTerminal.forEach((_, key) => runsTerminal.delete(key));\n invocations.forEach((_, key) => invocations.delete(key));\n pendingInvocations.forEach((_, key) => pendingInvocations.delete(key));\n barrierState.forEach((_, key) => barrierState.delete(key));\n dmNotificationState.forEach((_, key) => dmNotificationState.delete(key));\n agentOutbox.forEach((_, key) => agentOutbox.delete(key));\n agentLeases.forEach((_, key) => agentLeases.delete(key));\n auditTrail.forEach((_, key) => auditTrail.delete(key));\n xeroWorkItems.forEach((_, key) => xeroWorkItems.delete(key));\n xeroWorkTerminal.forEach((_, key) => xeroWorkTerminal.delete(key));\n xeroConnection.forEach((_, key) => xeroConnection.delete(key));\n connectionBindings.forEach((_, key) => connectionBindings.delete(key));\n // Selection is execution state and would point at a run removed above.\n // Keep runStorageVersion: it is the document's storage format, not history.\n root.delete('activeRunId');\n });\n}\n","import type * as Y from 'yjs';\nimport type { FlowNodeRuntimeState } from '../../types/authorization';\nimport type { RunEventAppender, RunEventInput, RunJsonValue } from './runLifecycle';\nimport type { FlowRuntimeStateManager } from './runtime';\nimport { createRunScopedRuntimeManager } from './runs';\n\n/**\n * A run head must stay small enough to replicate cheaply. Full action history\n * belongs in Matrix; the Y.Doc keeps only the latest referenceable output.\n *\n * 16 KiB leaves ample room for the run-event envelope under Matrix's 64 KiB\n * event limit and bounds ten runs independently of retry/history volume.\n */\nexport const MAX_RUN_ACTION_OUTPUT_BYTES = 16 * 1024;\nconst MAX_PENDING_TIMELINE_EVENTS = 4;\nconst TIMELINE_PENDING_CACHE_KEY = 'runTimelinePending';\nconst TIMELINE_ERROR_CACHE_KEY = 'runTimelineError';\n\nexport interface BoundedRunOutput {\n output: Record<string, unknown>;\n byteLength: number;\n exceeded: boolean;\n}\n\nexport interface PendingRunTimelineEvent {\n event: RunEventInput;\n failedAt: number;\n error: string;\n}\n\nexport interface RunTimelineAppendResult {\n ok: boolean;\n eventId?: string;\n error?: string;\n}\n\nfunction jsonByteLength(value: unknown): number {\n const encoded = JSON.stringify(value);\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(encoded).byteLength;\n }\n return unescape(encodeURIComponent(encoded)).length;\n}\n\nfunction fnv1a32(input: string, seed: number): string {\n let hash = seed >>> 0;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\n/** Stable, bounded, Matrix-safe key. Raw block/run ids never enter the key. */\nexport function createRunEventIdempotencyKey(kind: RunEventInput['kind'], ...identity: Array<string | number>): string {\n const canonical = JSON.stringify([kind, ...identity]);\n const digest = `${fnv1a32(canonical, 0x811c9dc5)}${fnv1a32(canonical, 0x9e3779b1)}`;\n return `v1:${kind.replace(/\\./g, '_')}:${digest}`;\n}\n\n/**\n * Prepare the value allowed into the Y.Doc. Oversized output is represented by\n * a bounded marker; callers must route the action to needs-verification rather\n * than pretending downstream references still have the complete value.\n */\nexport function boundRunActionOutput(value: Record<string, unknown>): BoundedRunOutput {\n const byteLength = jsonByteLength(value);\n if (byteLength <= MAX_RUN_ACTION_OUTPUT_BYTES) {\n return {\n output: JSON.parse(JSON.stringify(value)) as Record<string, unknown>,\n byteLength,\n exceeded: false,\n };\n }\n\n return {\n output: {\n __runOutput: {\n truncated: true,\n byteLength,\n maxBytes: MAX_RUN_ACTION_OUTPUT_BYTES,\n digest: `${fnv1a32(JSON.stringify(value), 0x811c9dc5)}${fnv1a32(JSON.stringify(value), 0x9e3779b1)}`,\n keys: Object.keys(value).sort().slice(0, 32),\n },\n },\n byteLength,\n exceeded: true,\n };\n}\n\nfunction readPending(runtime: FlowRuntimeStateManager, blockId: string): PendingRunTimelineEvent[] {\n const value = runtime.get(blockId).cache?.[TIMELINE_PENDING_CACHE_KEY];\n if (!Array.isArray(value)) return [];\n return value.filter(\n (entry): entry is PendingRunTimelineEvent =>\n !!entry && typeof entry === 'object' && !!(entry as PendingRunTimelineEvent).event && typeof (entry as PendingRunTimelineEvent).failedAt === 'number'\n );\n}\n\nfunction retainPending(runtime: FlowRuntimeStateManager, blockId: string, event: RunEventInput, error: string, failedAt: number): void {\n const pending = readPending(runtime, blockId).filter((entry) => entry.event.idempotencyKey !== event.idempotencyKey);\n pending.push({ event, failedAt, error });\n updateTimelineCache(runtime, blockId, {\n pending: pending.slice(-MAX_PENDING_TIMELINE_EVENTS),\n error,\n });\n}\n\nfunction updateTimelineCache(\n runtime: FlowRuntimeStateManager,\n blockId: string,\n patch: {\n pending?: PendingRunTimelineEvent[];\n error?: string;\n lastEventId?: string;\n }\n): void {\n const current = runtime.get(blockId);\n const cache = { ...(current.cache || {}) };\n if (patch.pending !== undefined) {\n if (patch.pending.length > 0) cache[TIMELINE_PENDING_CACHE_KEY] = patch.pending;\n else delete cache[TIMELINE_PENDING_CACHE_KEY];\n }\n if (patch.error !== undefined) cache[TIMELINE_ERROR_CACHE_KEY] = patch.error;\n else if (patch.pending !== undefined && patch.pending.length === 0) delete cache[TIMELINE_ERROR_CACHE_KEY];\n runtime.update(blockId, {\n cache,\n ...(patch.lastEventId ? { lastEventId: patch.lastEventId } : {}),\n } as Partial<FlowNodeRuntimeState>);\n}\n\n/**\n * Append one canonical run event. Post-effect failures can be retained for\n * replay; preflight failures pass retainOnFailure=false and abort execution.\n */\nexport async function appendRunTimelineEvent(params: {\n eventLog?: RunEventAppender;\n event: RunEventInput;\n runtime?: FlowRuntimeStateManager;\n blockId?: string;\n retainOnFailure?: boolean;\n now?: () => number;\n}): Promise<RunTimelineAppendResult> {\n if (!params.eventLog) {\n return { ok: false, error: 'A run event log is required for multi-run execution.' };\n }\n try {\n const eventId = await params.eventLog.append(params.event);\n if (params.runtime && params.blockId) {\n const pending = readPending(params.runtime, params.blockId).filter((entry) => entry.event.idempotencyKey !== params.event.idempotencyKey);\n updateTimelineCache(params.runtime, params.blockId, { pending, lastEventId: eventId });\n }\n return { ok: true, eventId };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to append run timeline event';\n if (params.retainOnFailure !== false && params.runtime && params.blockId) {\n retainPending(params.runtime, params.blockId, params.event, message, params.now?.() ?? Date.now());\n }\n return { ok: false, error: message };\n }\n}\n\n/**\n * Append an ordered event sequence. If one append fails, it and every event\n * after it are retained in order so recovery cannot publish `action.done`\n * ahead of the missing `action.output`.\n */\nexport async function appendRunTimelineEvents(params: {\n eventLog?: RunEventAppender;\n events: RunEventInput[];\n runtime: FlowRuntimeStateManager;\n blockId: string;\n retainOnFailure?: boolean;\n now?: () => number;\n}): Promise<{\n ok: boolean;\n appended: number;\n remaining: number;\n lastEventId?: string;\n error?: string;\n}> {\n let appended = 0;\n let lastEventId: string | undefined;\n for (let index = 0; index < params.events.length; index += 1) {\n const event = params.events[index]!;\n const result = await appendRunTimelineEvent({\n eventLog: params.eventLog,\n event,\n runtime: params.runtime,\n blockId: params.blockId,\n retainOnFailure: params.retainOnFailure,\n now: params.now,\n });\n if (result.eventId) lastEventId = result.eventId;\n if (!result.ok) {\n if (params.retainOnFailure !== false) {\n const failedAt = params.now?.() ?? Date.now();\n const error = result.error || 'Failed to append run timeline event';\n for (const remainingEvent of params.events.slice(index + 1)) {\n retainPending(params.runtime, params.blockId, remainingEvent, error, failedAt);\n }\n }\n return {\n ok: false,\n appended,\n remaining: readPending(params.runtime, params.blockId).length,\n ...(lastEventId ? { lastEventId } : {}),\n ...(result.error ? { error: result.error } : {}),\n };\n }\n appended += 1;\n }\n return {\n ok: true,\n appended,\n remaining: readPending(params.runtime, params.blockId).length,\n ...(lastEventId ? { lastEventId } : {}),\n };\n}\n\n/** Pure read used by status/recovery surfaces. */\nexport function readPendingRunTimelineEvents(yDoc: Y.Doc, sessionRunId: string, blockId: string): PendingRunTimelineEvent[] {\n return readPending(createRunScopedRuntimeManager(yDoc, sessionRunId), blockId).map((entry) => ({\n ...entry,\n event: JSON.parse(JSON.stringify(entry.event)) as RunEventInput,\n }));\n}\n\n/** Replay retained post-effect events in original order and clear successes. */\nexport async function retryPendingRunTimelineEvents(params: {\n yDoc: Y.Doc;\n sessionRunId: string;\n blockId: string;\n eventLog: RunEventAppender;\n now?: () => number;\n}): Promise<{ attempted: number; remaining: number; lastEventId?: string }> {\n const runtime = createRunScopedRuntimeManager(params.yDoc, params.sessionRunId);\n const pending = readPending(runtime, params.blockId);\n let attempted = 0;\n let lastEventId: string | undefined;\n for (const entry of pending) {\n attempted += 1;\n const result = await appendRunTimelineEvent({\n eventLog: params.eventLog,\n event: entry.event,\n runtime,\n blockId: params.blockId,\n retainOnFailure: true,\n now: params.now,\n });\n if (result.eventId) lastEventId = result.eventId;\n if (!result.ok) break;\n }\n return {\n attempted,\n remaining: readPending(runtime, params.blockId).length,\n ...(lastEventId ? { lastEventId } : {}),\n };\n}\n\n/**\n * Bound arbitrary JSON before embedding it in an event. Inputs are diagnostic,\n * not authoritative; oversized values become the same compact marker.\n */\nexport function boundRunEventJson(value: unknown): RunJsonValue {\n const json = value === undefined ? null : (JSON.parse(JSON.stringify(value)) as RunJsonValue);\n if (jsonByteLength(json) <= MAX_RUN_ACTION_OUTPUT_BYTES) return json;\n const wrapped =\n json && typeof json === 'object' && !Array.isArray(json) ? boundRunActionOutput(json as Record<string, unknown>).output : boundRunActionOutput({ value: json }).output;\n return wrapped as RunJsonValue;\n}\n","import type * as Y from 'yjs';\nimport type { FlowNodeRuntimeState } from '../../types/authorization';\nimport { getNestedValue } from './referenceResolver';\nimport { readActionState, usesLegacyRuntimeCompatibility } from './runs';\n\nexport type ConditionOperator = 'equals' | 'not_equals' | 'greater_than' | 'less_than' | 'contains' | 'not_contains' | 'is_empty' | 'is_not_empty';\n\nexport interface BlockCondition {\n id: string;\n name: string;\n description?: string;\n sourceBlockId: string;\n sourceBlockType: string;\n rule: {\n type: 'property_value';\n property: string;\n operator: ConditionOperator;\n value: string | number | boolean;\n };\n effect: {\n action: 'enable' | 'disable' | 'hide' | 'show';\n message?: string;\n };\n}\n\nexport interface ConditionConfig {\n enabled: boolean;\n mode: 'all_must_pass' | 'any_can_pass';\n conditions: BlockCondition[];\n}\n\nexport interface ConditionEvaluationResult {\n passes: boolean;\n message?: string;\n}\n\nexport interface ConditionActionResult {\n action: 'enable' | 'disable' | 'hide' | 'show';\n message?: string;\n conditionName: string;\n}\n\nexport interface BlockConditionsResult {\n actions: ConditionActionResult[];\n}\n\nexport interface BlockExecutionEligibility {\n eligible: boolean;\n enabled: boolean;\n visible: boolean;\n message?: string;\n result: BlockConditionsResult;\n}\n\nexport interface ConditionEvaluationOptions {\n getRuntimeState?: (blockId: string) => FlowNodeRuntimeState | undefined;\n /**\n * Phase A only: fall back to authored props when no run output exists.\n * Multi-run documents deliberately disable this so execution results never\n * leak through shared definition props.\n */\n allowPropsFallback?: boolean;\n}\n\nconst OPERATOR_INVERSIONS: Record<ConditionOperator, ConditionOperator> = {\n equals: 'not_equals',\n not_equals: 'equals',\n contains: 'not_contains',\n not_contains: 'contains',\n is_empty: 'is_not_empty',\n is_not_empty: 'is_empty',\n greater_than: 'less_than',\n less_than: 'greater_than',\n};\n\nconst ACTION_INVERSIONS: Record<BlockCondition['effect']['action'], BlockCondition['effect']['action'] | null> = {\n disable: 'enable',\n hide: 'show',\n enable: null,\n show: null,\n};\n\nexport function normalizeCondition(condition: BlockCondition): BlockCondition {\n const canonicalAction = ACTION_INVERSIONS[condition.effect.action];\n if (canonicalAction === null) return condition;\n\n let value = condition.rule.value;\n if ((condition.rule.operator === 'equals' || condition.rule.operator === 'not_equals') && typeof value === 'boolean') {\n value = !value;\n }\n return {\n ...condition,\n rule: {\n ...condition.rule,\n operator: OPERATOR_INVERSIONS[condition.rule.operator],\n value,\n },\n effect: { ...condition.effect, action: canonicalAction },\n };\n}\n\nexport function normalizeConditions(conditions: BlockCondition[]): BlockCondition[] {\n return conditions.map(normalizeCondition);\n}\n\nexport function parseConditionConfig(value: unknown): ConditionConfig {\n if (!value) return { enabled: false, mode: 'all_must_pass', conditions: [] };\n try {\n const parsed = typeof value === 'string' ? JSON.parse(value) : value;\n if (!parsed || typeof parsed !== 'object') {\n return { enabled: false, mode: 'all_must_pass', conditions: [] };\n }\n const candidate = parsed as Partial<ConditionConfig>;\n return {\n enabled: candidate.enabled === true,\n mode: candidate.mode === 'any_can_pass' ? 'any_can_pass' : 'all_must_pass',\n conditions: Array.isArray(candidate.conditions) ? (candidate.conditions as BlockCondition[]) : [],\n };\n } catch {\n return { enabled: false, mode: 'all_must_pass', conditions: [] };\n }\n}\n\nexport class InvalidConditionConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidConditionConfigError';\n }\n}\n\n/** Fail-closed parser for execution/planning boundaries. */\nexport function parseConditionConfigStrict(value: unknown): ConditionConfig {\n if (value == null || value === '') {\n return { enabled: false, mode: 'all_must_pass', conditions: [] };\n }\n let parsed: unknown;\n try {\n parsed = typeof value === 'string' ? JSON.parse(value) : value;\n } catch {\n throw new InvalidConditionConfigError('Block conditions are not valid JSON.');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new InvalidConditionConfigError('Block conditions must be an object.');\n }\n const candidate = parsed as Partial<ConditionConfig>;\n if (candidate.enabled !== true) {\n return { enabled: false, mode: 'all_must_pass', conditions: [] };\n }\n if (candidate.mode !== 'all_must_pass' && candidate.mode !== 'any_can_pass') {\n throw new InvalidConditionConfigError('Enabled block conditions require a valid mode.');\n }\n if (!Array.isArray(candidate.conditions)) {\n throw new InvalidConditionConfigError('Enabled block conditions require a conditions array.');\n }\n for (const condition of candidate.conditions) {\n if (\n !condition ||\n typeof condition !== 'object' ||\n typeof (condition as BlockCondition).sourceBlockId !== 'string' ||\n !(condition as BlockCondition).rule ||\n !(condition as BlockCondition).effect\n ) {\n throw new InvalidConditionConfigError('Block conditions contain an invalid condition.');\n }\n }\n return {\n enabled: true,\n mode: candidate.mode,\n conditions: candidate.conditions as BlockCondition[],\n };\n}\n\nfunction flattenBlocks(blocks: unknown[]): unknown[] {\n const flattened: unknown[] = [];\n const visit = (block: unknown) => {\n flattened.push(block);\n const children = (block as { children?: unknown[] } | null)?.children;\n if (Array.isArray(children)) children.forEach(visit);\n };\n blocks.forEach(visit);\n return flattened;\n}\n\nfunction resolveRuntimeValue(runtime: FlowNodeRuntimeState | undefined, property: string): unknown {\n if (!runtime) return undefined;\n if (property.startsWith('output.')) {\n return getNestedValue(runtime.output, property.slice('output.'.length));\n }\n const direct = getNestedValue(runtime, property);\n if (direct !== undefined) return direct;\n return getNestedValue(runtime.output, property);\n}\n\nexport function resolveConditionSourceValue(condition: BlockCondition, sourceBlock: unknown, options: ConditionEvaluationOptions = {}): unknown {\n const runtimeValue = resolveRuntimeValue(options.getRuntimeState?.(condition.sourceBlockId), condition.rule.property);\n if (runtimeValue !== undefined || options.allowPropsFallback === false) return runtimeValue;\n const props = (sourceBlock as { props?: unknown } | null | undefined)?.props;\n return getNestedValue(props, condition.rule.property);\n}\n\nfunction compareConditionValue(sourceValue: unknown, operator: ConditionOperator, expected: unknown): boolean {\n switch (operator) {\n case 'equals':\n return sourceValue === expected;\n case 'not_equals':\n return sourceValue !== expected;\n case 'greater_than':\n return typeof sourceValue === 'number' && typeof expected === 'number' && sourceValue > expected;\n case 'less_than':\n return typeof sourceValue === 'number' && typeof expected === 'number' && sourceValue < expected;\n case 'contains':\n return typeof sourceValue === 'string' && typeof expected === 'string' && sourceValue.toLowerCase().includes(expected.toLowerCase());\n case 'not_contains':\n return typeof sourceValue === 'string' && typeof expected === 'string' && !sourceValue.toLowerCase().includes(expected.toLowerCase());\n case 'is_empty':\n return sourceValue === '' || sourceValue === null || sourceValue === undefined;\n case 'is_not_empty':\n return sourceValue !== '' && sourceValue !== null && sourceValue !== undefined;\n }\n}\n\nexport function evaluateCondition(condition: BlockCondition, sourceBlock: unknown, options: ConditionEvaluationOptions = {}): ConditionEvaluationResult {\n if (!sourceBlock) {\n return {\n passes: false,\n message: `Required block not found: ${condition.name || condition.sourceBlockType}`,\n };\n }\n const passes = compareConditionValue(resolveConditionSourceValue(condition, sourceBlock, options), condition.rule.operator, condition.rule.value);\n return { passes, message: passes ? undefined : condition.effect.message };\n}\n\nexport function evaluateBlockConditions(conditionConfig: ConditionConfig, editorDocument: unknown[], options: ConditionEvaluationOptions = {}): BlockConditionsResult {\n if (!conditionConfig.enabled || conditionConfig.conditions.length === 0) return { actions: [] };\n const blocks = flattenBlocks(editorDocument);\n\n const evaluations = normalizeConditions(conditionConfig.conditions).map((condition) => {\n const sourceBlock = blocks.find((block) => {\n const candidate = block as { id?: unknown; type?: unknown };\n return candidate.id === condition.sourceBlockId && candidate.type === condition.sourceBlockType;\n });\n return { condition, result: evaluateCondition(condition, sourceBlock, options) };\n });\n\n const passed =\n conditionConfig.mode === 'all_must_pass' ? (evaluations.every(({ result }) => result.passes) ? evaluations : []) : evaluations.filter(({ result }) => result.passes);\n\n return {\n actions: passed.map(({ condition }) => ({\n action: condition.effect.action,\n message: condition.effect.message,\n conditionName: condition.name,\n })),\n };\n}\n\n/** Canonical run-aware evaluator used by browser and headless consumers. */\nexport function evaluateBlockConditionsForRun(conditionConfig: ConditionConfig, editorDocument: unknown[], yDoc: Y.Doc, sessionRunId: string): BlockConditionsResult {\n return evaluateBlockConditions(conditionConfig, editorDocument, {\n getRuntimeState: (blockId) => readActionState(yDoc, sessionRunId, blockId),\n allowPropsFallback: usesLegacyRuntimeCompatibility(yDoc),\n });\n}\n\n/**\n * Canonical decision used immediately before execution and by planners. The\n * condition vocabulary is positive after normalization: if an authored\n * enable/show gate exists, at least one corresponding action must fire.\n */\nexport function evaluateBlockExecutionEligibilityForRun(conditionConfig: ConditionConfig, editorDocument: unknown[], yDoc: Y.Doc, sessionRunId: string): BlockExecutionEligibility {\n const normalized = normalizeConditions(conditionConfig.conditions);\n const result = evaluateBlockConditionsForRun(conditionConfig, editorDocument, yDoc, sessionRunId);\n const requiresEnable = normalized.some((condition) => condition.effect.action === 'enable');\n const requiresShow = normalized.some((condition) => condition.effect.action === 'show');\n const enabled = !conditionConfig.enabled || !requiresEnable || result.actions.some((action) => action.action === 'enable');\n const visible = !conditionConfig.enabled || !requiresShow || result.actions.some((action) => action.action === 'show');\n const failedMessage = normalized.map((condition) => condition.effect.message).find((message): message is string => !!message);\n return {\n eligible: enabled && visible,\n enabled,\n visible,\n ...(enabled && visible ? {} : { message: failedMessage || 'Block conditions are not satisfied.' }),\n result,\n };\n}\n","import { FlowNode, FlowNodeAuthzExtension } from '../../types/authorization';\n\nexport const buildAuthzFromProps = (props: Record<string, any>): FlowNodeAuthzExtension => {\n const linkedClaimCollectionId = typeof props.linkedClaimCollectionId === 'string' ? props.linkedClaimCollectionId.trim() : '';\n\n const authz: FlowNodeAuthzExtension = {};\n\n if (linkedClaimCollectionId) {\n authz.linkedClaim = { collectionId: linkedClaimCollectionId };\n }\n\n return authz;\n};\n\nexport const buildFlowNodeFromBlock = (block: any): FlowNode => {\n const base: FlowNode = {\n id: block.id,\n type: block.type,\n props: block.props || {},\n } as FlowNode;\n\n const authz = buildAuthzFromProps(block.props || {});\n\n return {\n ...base,\n ...authz,\n };\n};\n","import type { ActionDefinition, ActionProofDeclaration } from '../actionRegistry/types';\n\nexport const PROOF_MISSING_CODE = 'PROOF_MISSING';\n\nexport interface ProofValidationResult {\n valid: boolean;\n reason?: string;\n}\n\nfunction getOutputValue(output: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc && typeof acc === 'object') return (acc as Record<string, unknown>)[key];\n return undefined;\n }, output);\n}\n\nfunction isProofValue(value: unknown): boolean {\n if (Array.isArray(value)) return value.length > 0;\n // A numeric proof field is present when it is any real number — including\n // 0, which is a legitimate value for zero-indexed on-chain ids, a `status`\n // of 0, or an epoch timestamp. `!!value` would wrongly reject those. `false`\n // stays non-proof: a boolean success flag (configStored, alreadyExisted) is\n // only proof when true.\n if (typeof value === 'number') return !Number.isNaN(value);\n return !!value;\n}\n\n/**\n * Validate a successful action run's output against the action's proof\n * declaration. Called by `executeActionBlock` before writing\n * `state: 'completed'` — success without proof becomes a failure.\n *\n * A `sideEffect: true` action with no declaration fails closed; a\n * side-effect-free action with no declaration is tolerated (legacy\n * consumer-registered actions) but should declare `'none'` explicitly.\n */\nexport function validateActionProof(\n action: Pick<ActionDefinition, 'type' | 'sideEffect'> & { proof?: ActionProofDeclaration },\n output: Record<string, unknown>\n): ProofValidationResult {\n const proof = action.proof;\n\n if (proof === 'none') return { valid: true };\n\n if (proof === undefined) {\n if (action.sideEffect) {\n return {\n valid: false,\n reason: `Action '${action.type}' has a side effect but declares no proof of execution. Declare proof (or 'none') on its ActionDefinition.`,\n };\n }\n return { valid: true };\n }\n\n if ('validate' in proof) {\n let valid = false;\n try {\n valid = proof.validate(output);\n } catch {\n valid = false;\n }\n return valid ? { valid: true } : { valid: false, reason: `Action '${action.type}' returned success but its proof validator rejected the output.` };\n }\n\n const satisfied = proof.fields.some((field) => isProofValue(getOutputValue(output, field)));\n if (satisfied) return { valid: true };\n return {\n valid: false,\n reason: `Action '${action.type}' returned success without proof. Expected at least one of [${proof.fields.join(', ')}] in the output. Check the handler logs.`,\n };\n}\n","import type * as Y from 'yjs';\nimport type { ActionDefinition, ActionRunContext, CompletionCheck } from '../actionRegistry/types';\nimport { getAction } from '../actionRegistry';\nimport type { FlowNodeRuntimeState } from '../../types/authorization';\nimport { validateActionProof } from './proof';\nimport { readActionState, writeActionState } from './runs';\nimport { boundRunActionOutput } from './runTimeline';\n\n/**\n * Fold a run entry to Done using the action's own completion contract.\n *\n * There is no fallback branch: every registered action declares `done` (the\n * registry backfills the default for untyped consumers), so the contract is\n * the single place Done-ness is decided. One-shot actions typically use\n * `doneWhenCompleted`, repeatable ones `neverDone`.\n */\nexport function isActionDone<TInputs extends Record<string, any> = Record<string, any>>(\n action: ActionDefinition<TInputs> | undefined,\n actionState: FlowNodeRuntimeState,\n runContext: ActionRunContext\n): boolean {\n if (!action) return false;\n return action.done.isDone(actionState, runContext);\n}\n\nexport function isActionTypeDone(actionType: string | undefined, actionState: FlowNodeRuntimeState, runContext: ActionRunContext): boolean {\n return isActionDone(actionType ? getAction(actionType) : undefined, actionState, runContext);\n}\n\nexport type CompletionReconciliationTransition = 'unchanged' | 'adopted' | 'needs_verification' | 'unknown';\n\nexport interface ReconcileCompletionParams<TInputs extends Record<string, any> = Record<string, any>> {\n yDoc: Y.Doc;\n sessionRunId: string;\n blockId: string;\n actionType: string;\n inputs: TInputs;\n flowId?: string;\n flowUri?: string;\n actorDid?: string;\n services?: ActionRunContext['services'];\n now?: () => number;\n}\n\nexport interface ReconcileCompletionResult {\n transition: CompletionReconciliationTransition;\n check: CompletionCheck;\n previous: FlowNodeRuntimeState;\n next: FlowNodeRuntimeState;\n}\n\n/**\n * Reconcile a run entry against an action's pure/external completion contract.\n *\n * `check` is an explicit read: it must not execute the action or mutate the\n * external system. Unknown results are inert. A positive read can adopt work\n * completed outside this client; a negative read never retries an action and\n * instead moves a contradictory completed entry to human verification.\n */\nexport async function reconcileCompletion<TInputs extends Record<string, any> = Record<string, any>>(\n params: ReconcileCompletionParams<TInputs>\n): Promise<ReconcileCompletionResult> {\n const action = getAction(params.actionType) as ActionDefinition<TInputs> | undefined;\n if (!action) throw new Error(`Unknown action type \"${params.actionType}\"`);\n\n const previous = readActionState(params.yDoc, params.sessionRunId, params.blockId);\n const ctx: ActionRunContext = {\n runId: params.sessionRunId,\n flowId: params.flowId,\n flowUri: params.flowUri,\n actorDid: params.actorDid,\n nodeId: params.blockId,\n services: params.services,\n now: params.now?.() ?? Date.now(),\n };\n\n const check: CompletionCheck = action.done.check\n ? await action.done.check({ inputs: params.inputs, actionState: previous, ctx })\n : {\n done: isActionDone(action, previous, ctx),\n source: 'runtime-proof',\n };\n\n if (check.done === 'unknown') {\n return { transition: 'unknown', check, previous, next: previous };\n }\n\n if (check.done === true) {\n if (isActionDone(action, previous, ctx)) {\n return { transition: 'unchanged', check, previous, next: previous };\n }\n const mergedOutput = {\n ...((previous.output as Record<string, unknown>) || {}),\n ...(check.output || {}),\n };\n const proof = validateActionProof(action, mergedOutput);\n const bounded = boundRunActionOutput(mergedOutput);\n if (!proof.valid || bounded.exceeded) {\n const { next } = writeActionState(params.yDoc, params.sessionRunId, params.blockId, {\n state: 'needs_verification',\n output: bounded.output,\n error: {\n message: bounded.exceeded ? 'External completion output exceeds the run-head size limit.' : proof.reason || 'External completion did not return the action proof.',\n code: bounded.exceeded ? 'RUN_OUTPUT_TOO_LARGE' : 'COMPLETION_PROOF_MISSING',\n at: ctx.now,\n },\n reconciledAt: ctx.now,\n completionSource: check.source,\n } as Partial<FlowNodeRuntimeState>);\n return {\n transition: 'needs_verification',\n check,\n previous,\n next,\n };\n }\n const { next } = writeActionState(params.yDoc, params.sessionRunId, params.blockId, {\n state: 'completed',\n output: bounded.output,\n error: undefined,\n executedAt: previous.executedAt ?? ctx.now,\n reconciledAt: ctx.now,\n completionSource: check.source,\n } as Partial<FlowNodeRuntimeState>);\n return { transition: 'adopted', check, previous, next };\n }\n\n if (previous.state === 'completed') {\n const { next } = writeActionState(params.yDoc, params.sessionRunId, params.blockId, {\n state: 'needs_verification',\n error: {\n message: check.reason || 'External completion check contradicts the completed run state.',\n code: 'COMPLETION_MISMATCH',\n at: ctx.now,\n },\n reconciledAt: ctx.now,\n completionSource: check.source,\n } as Partial<FlowNodeRuntimeState>);\n return { transition: 'needs_verification', check, previous, next };\n }\n\n return { transition: 'unchanged', check, previous, next: previous };\n}\n","import * as Y from 'yjs';\nimport type { StoredInvocation } from '../../types/ucan';\nimport { isRecordInRun } from './runs';\nimport { getExistingYMap } from '../yjsTypes';\n\nexport const INVOCATIONS_MAP_KEY = 'invocations';\n\n/**\n * Read UCAN invocation history for exactly one session run.\n *\n * Records written before sessions existed carry no `sessionRunId` and belong to\n * the unsessioned document until it is migrated — see {@link isRecordInRun}.\n * The lookup uses `Doc.share` so inspecting a room with no invocation history\n * does not create an empty shared map.\n */\nexport function readInvocationsForRun(yDoc: Y.Doc, sessionRunId: string): StoredInvocation[] {\n const existing = getExistingYMap<StoredInvocation>(yDoc, INVOCATIONS_MAP_KEY);\n if (!existing) return [];\n\n const invocations: StoredInvocation[] = [];\n existing.forEach((value) => {\n if (!value || typeof value !== 'object') return;\n const invocation = value as StoredInvocation;\n if (!invocation.cid) return;\n if (!isRecordInRun(invocation.sessionRunId, sessionRunId)) return;\n invocations.push({\n ...invocation,\n capability: { ...(invocation.capability || {}) } as StoredInvocation['capability'],\n proofCids: [...(invocation.proofCids || [])],\n });\n });\n return invocations.sort((a, b) => b.executedAt - a.executedAt || a.cid.localeCompare(b.cid));\n}\n","import * as Y from 'yjs';\nimport type { Doc } from 'yjs';\nimport type { FlowAgentCommand, FlowAgentLedgerEvent, FlowAgentLedgerEventType, FlowAgentLease, FlowAgentMaps } from '../../types/flowAgent';\nimport { isRecordInRun, resolveRecordRunId } from '../flowEngine/runs';\nimport { createIntentHash, stableStringify } from './utils';\nimport { getExistingYMap } from '../yjsTypes';\n\nexport const FLOW_AGENT_OUTBOX_KEY = 'agentOutbox';\nexport const FLOW_AGENT_LEASES_KEY = 'agentLeases';\nexport const FLOW_AGENT_AUDIT_SCOPE = '__flow_agent__';\n\nfunction readExistingMap<T>(yDoc: Doc, key: string): Y.Map<T> | undefined {\n return getExistingYMap<T>(yDoc, key);\n}\n\nexport function getFlowAgentMaps(yDoc: Doc): FlowAgentMaps {\n return {\n outbox: yDoc.getMap<FlowAgentCommand>(FLOW_AGENT_OUTBOX_KEY),\n leases: yDoc.getMap(FLOW_AGENT_LEASES_KEY),\n };\n}\n\nexport function computeAgentCommandId(params: { flowId: string; sessionRunId: string; nodeId: string; type: string; payload: Record<string, unknown> }): string {\n const intentHash = createIntentHash(params);\n return `${params.flowId}:${params.nodeId}:${intentHash}`;\n}\n\nexport function queueAgentCommand(yDoc: Doc, command: FlowAgentCommand): { command: FlowAgentCommand; created: boolean } {\n const { outbox } = getFlowAgentMaps(yDoc);\n const existing = outbox.get(command.id);\n if (existing) {\n const retryFailedAssignment = existing.type === 'assign_actor' && existing.status === 'failed';\n const retryFailedDiagnosis = existing.type === 'diagnose_blocker' && existing.status === 'failed';\n const retryUnprovenDiagnosis = existing.type === 'diagnose_blocker' && existing.status === 'confirmed' && typeof existing.payload.delegatedInvocationId !== 'string';\n if (retryFailedAssignment || retryFailedDiagnosis || retryUnprovenDiagnosis) {\n const retried: FlowAgentCommand = {\n ...existing,\n status: 'queued',\n error: undefined,\n lease: undefined,\n reason: command.reason,\n payload: command.payload,\n capability: command.capability,\n actorDid: command.actorDid,\n updatedAt: command.updatedAt,\n };\n outbox.set(command.id, retried);\n try {\n appendAgentLedgerEvent(yDoc, {\n type: 'agent.command',\n flowId: retried.flowId,\n sessionRunId: retried.sessionRunId,\n nodeId: retried.nodeId,\n commandId: retried.id,\n actorDid: retried.actorDid,\n timestamp: retried.updatedAt,\n details: {\n commandType: retried.type,\n status: retried.status,\n idempotencyKey: retried.idempotencyKey,\n reason: retried.reason,\n retry: true,\n retryCause: retryFailedDiagnosis ? 'diagnosis_failed' : retryUnprovenDiagnosis ? 'missing_delegated_invocation' : 'assignment_failed',\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to append flow-agent ledger event';\n if (!message.includes('Unexpected content type') && !message.includes('already been defined with a different constructor')) {\n throw error;\n }\n }\n return { command: retried, created: true };\n }\n return { command: existing, created: false };\n }\n outbox.set(command.id, command);\n try {\n appendAgentLedgerEvent(yDoc, {\n type: 'agent.command',\n flowId: command.flowId,\n sessionRunId: command.sessionRunId,\n nodeId: command.nodeId,\n commandId: command.id,\n actorDid: command.actorDid,\n timestamp: command.createdAt,\n details: {\n commandType: command.type,\n status: command.status,\n idempotencyKey: command.idempotencyKey,\n reason: command.reason,\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to append flow-agent ledger event';\n if (!message.includes('Unexpected content type') && !message.includes('already been defined with a different constructor')) {\n throw error;\n }\n }\n return { command, created: true };\n}\n\nfunction belongsToSessionRun(value: { sessionRunId?: string }, sessionRunId?: string): boolean {\n return !sessionRunId || isRecordInRun(value.sessionRunId, sessionRunId);\n}\n\n/** Read every command for one session without creating the outbox map. */\nexport function readAgentCommands(yDoc: Doc, sessionRunId?: string): FlowAgentCommand[] {\n const outbox = readExistingMap<FlowAgentCommand>(yDoc, FLOW_AGENT_OUTBOX_KEY);\n if (!outbox) return [];\n const commands: FlowAgentCommand[] = [];\n outbox.forEach((command) => {\n if (belongsToSessionRun(command, sessionRunId)) {\n commands.push({\n ...command,\n sessionRunId: resolveRecordRunId(command.sessionRunId, sessionRunId),\n });\n }\n });\n commands.sort(\n (a, b) =>\n (a.createdAt ?? 0) - (b.createdAt ?? 0) ||\n (a.id ?? (a as FlowAgentCommand & { commandId?: string }).commandId ?? '').localeCompare(b.id ?? (b as FlowAgentCommand & { commandId?: string }).commandId ?? '')\n );\n return commands;\n}\n\nexport function readQueuedAgentCommands(yDoc: Doc, sessionRunId?: string): FlowAgentCommand[] {\n return readAgentCommands(yDoc, sessionRunId).filter((command) => command.status === 'queued' || command.status === 'leased' || command.status === 'running');\n}\n\n/** Read every lease for one session without creating the leases map. */\nexport function readFlowAgentLeases(yDoc: Doc, sessionRunId?: string): FlowAgentLease[] {\n const leases = readExistingMap<FlowAgentLease>(yDoc, FLOW_AGENT_LEASES_KEY);\n if (!leases) return [];\n const results: FlowAgentLease[] = [];\n leases.forEach((lease) => {\n if (belongsToSessionRun(lease, sessionRunId)) {\n results.push({\n ...lease,\n sessionRunId: resolveRecordRunId(lease.sessionRunId, sessionRunId),\n });\n }\n });\n results.sort((a, b) => (a.acquiredAt ?? 0) - (b.acquiredAt ?? 0) || (a.id ?? a.commandId ?? '').localeCompare(b.id ?? b.commandId ?? ''));\n return results;\n}\n\nexport function updateAgentCommand(yDoc: Doc, commandId: string, patch: Partial<FlowAgentCommand>): FlowAgentCommand | null {\n const { outbox } = getFlowAgentMaps(yDoc);\n const current = outbox.get(commandId);\n if (!current) return null;\n const next = { ...current, ...patch };\n outbox.set(commandId, next);\n return next;\n}\n\nexport function appendAgentLedgerEvent(\n yDoc: Doc,\n event: Omit<FlowAgentLedgerEvent, 'id'> & {\n id?: string;\n }\n): FlowAgentLedgerEvent {\n const auditMap = yDoc.getMap<Y.Array<unknown>>('auditTrail');\n let arr = auditMap.get(FLOW_AGENT_AUDIT_SCOPE);\n if (!arr) {\n arr = new Y.Array<unknown>();\n auditMap.set(FLOW_AGENT_AUDIT_SCOPE, arr);\n }\n\n const fullEvent: FlowAgentLedgerEvent = {\n id: event.id || `${event.type}:${event.commandId || event.nodeId || 'flow'}:${createIntentHash(event.details)}:${event.timestamp}`,\n type: event.type,\n flowId: event.flowId,\n sessionRunId: event.sessionRunId,\n actorDid: event.actorDid,\n timestamp: event.timestamp,\n details: JSON.parse(stableStringify(event.details)) as Record<string, unknown>,\n };\n\n if (event.nodeId) fullEvent.nodeId = event.nodeId;\n if (event.commandId) fullEvent.commandId = event.commandId;\n\n arr.push([\n {\n id: fullEvent.id,\n type: fullEvent.type,\n details: fullEvent,\n meta: {\n timestamp: new Date(fullEvent.timestamp).toISOString(),\n userId: fullEvent.actorDid,\n editable: false,\n },\n },\n ]);\n\n return fullEvent;\n}\n\nexport function readAgentLedgerEvents(yDoc: Doc, eventType?: FlowAgentLedgerEventType, sessionRunId?: string): FlowAgentLedgerEvent[] {\n const auditMap = readExistingMap<Y.Array<unknown>>(yDoc, 'auditTrail');\n if (!auditMap) return [];\n const arr = auditMap.get(FLOW_AGENT_AUDIT_SCOPE);\n if (!arr) return [];\n const events: FlowAgentLedgerEvent[] = [];\n arr.forEach((value) => {\n if (!value || typeof value !== 'object') return;\n const entry = value as { type?: string; details?: FlowAgentLedgerEvent };\n if (!entry.details) return;\n if (eventType && entry.details.type !== eventType) return;\n if (sessionRunId && !isRecordInRun(entry.details.sessionRunId, sessionRunId)) {\n return;\n }\n events.push({\n ...entry.details,\n sessionRunId: resolveRecordRunId(entry.details.sessionRunId, sessionRunId),\n });\n });\n events.sort((a, b) => a.timestamp - b.timestamp || a.id.localeCompare(b.id));\n return events;\n}\n","import type { Block } from '@blocknote/core';\nimport type { UcanCapability } from '../../types/ucan';\n\nexport function stableStringify(value: unknown): string {\n if (value === undefined) return 'null';\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(',')}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) => a.localeCompare(b));\n return `{${entries.map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`).join(',')}}`;\n}\n\nexport function fnv1a32(input: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\nexport function createIntentHash(intent: Record<string, unknown>): string {\n return fnv1a32(stableStringify(intent));\n}\n\nexport function parseJsonProp<T>(value: unknown, fallback: T): T {\n if (value == null || value === '') return fallback;\n if (typeof value === 'object') return value as T;\n if (typeof value !== 'string') return fallback;\n try {\n const parsed = JSON.parse(value);\n return parsed as T;\n } catch {\n return fallback;\n }\n}\n\nexport function getBlockActionType(block: unknown): string | undefined {\n const props = (block as { props?: Record<string, unknown> })?.props;\n const actionType = props?.actionType;\n return typeof actionType === 'string' && actionType.length > 0 ? actionType : undefined;\n}\n\nexport function getBlockTitle(block: unknown): string | undefined {\n const props = (block as { props?: Record<string, unknown> })?.props;\n const title = props?.title;\n return typeof title === 'string' && title.length > 0 ? title : undefined;\n}\n\nexport function getBlockType(block: unknown): string {\n const type = (block as { type?: string })?.type;\n return typeof type === 'string' && type.length > 0 ? type : 'block';\n}\n\nexport function getBlockProps(block: unknown): Record<string, unknown> {\n return ((block as { props?: Record<string, unknown> })?.props || {}) as Record<string, unknown>;\n}\n\nexport function getBlockId(block: unknown): string | undefined {\n const id = (block as { id?: string })?.id;\n return typeof id === 'string' && id.length > 0 ? id : undefined;\n}\n\nexport function getAssigneeDid(block: unknown): string | undefined {\n const props = getBlockProps(block);\n const assignment = parseJsonProp<Record<string, any>>(props.assignment, {});\n const did = assignment?.assignedActor?.did;\n return typeof did === 'string' && did.length > 0 ? did : undefined;\n}\n\nexport function getDueAt(block: unknown): number | undefined {\n const props = getBlockProps(block);\n const ttlAbsoluteDueDate = props.ttlAbsoluteDueDate;\n if (typeof ttlAbsoluteDueDate !== 'string' || ttlAbsoluteDueDate.length === 0) return undefined;\n const parsed = new Date(ttlAbsoluteDueDate).getTime();\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function normalizeBlocks(blocks: unknown[]): Block[] {\n return blocks.filter((block) => typeof getBlockId(block) === 'string') as Block[];\n}\n\nexport function capabilityForCommand(can: string, flowUri: string, nodeId: string): UcanCapability {\n return {\n can,\n with: `${flowUri}:${nodeId}`,\n };\n}\n","import * as Y from 'yjs';\nimport type { StoredInvocation } from '../../types/ucan';\nimport { getExistingYMap } from '../yjsTypes';\nimport { FLOW_AGENT_AUDIT_SCOPE, FLOW_AGENT_LEASES_KEY, FLOW_AGENT_OUTBOX_KEY } from '../flowAgent/store';\nimport { INVOCATIONS_MAP_KEY } from './runHistory';\nimport { RUN_RECORD_AUDIT_TYPE } from './triggers';\n\n/**\n * # Migrating a pre-session document\n *\n * Everything here exists to answer one question about records written before\n * sessions existed: **which session owns them?**\n *\n * The old answer was a hard-coded constant every repo agreed to read as \"the\n * legacy run\" (`sessionRunId ?? LEGACY_RUN_ID`). That put a document-shaped\n * fact in a string literal, so ownership was re-derived, identically and by\n * hand, in a dozen places across three repositories — and a record's owner\n * changed meaning if any one of them disagreed.\n *\n * Migration answers it once, in the data: every untagged record is stamped with\n * the id of the session that absorbs the document's history. Afterwards nothing\n * infers ownership, and no constant needs to survive.\n *\n * This is the only module that rewrites history, which is why it is separate\n * from the waist: `runs.ts` owns *action state*, and nothing there should learn\n * the shape of an agent lease or an invocation.\n */\n\n/** One counter per container touched, so a migration can report what it moved. */\nexport interface StampedRecordCounts {\n commands: number;\n leases: number;\n ledgerEvents: number;\n invocations: number;\n runRecords: number;\n}\n\nfunction stampMapValues(yDoc: Y.Doc, key: string, sessionRunId: string): number {\n const map = getExistingYMap<{ sessionRunId?: string }>(yDoc, key);\n if (!map) return 0;\n let stamped = 0;\n map.forEach((value, entryKey) => {\n if (!value || typeof value !== 'object' || value.sessionRunId) return;\n map.set(entryKey, { ...value, sessionRunId });\n stamped += 1;\n });\n return stamped;\n}\n\n/**\n * Stamp entries of one `auditTrail` scope in place.\n *\n * `Y.Array` has no positional set, so an entry is replaced by a delete plus an\n * insert at the same index. Iterating by index and rewriting as we go is safe\n * because the length never changes; doing it inside the caller's transaction\n * keeps the whole migration one atomic update.\n */\nfunction stampAuditEntries(yDoc: Y.Doc, scope: string, sessionRunId: string, matches: (entry: { type?: string; details?: { sessionRunId?: string } }) => boolean): number {\n const auditMap = getExistingYMap<Y.Array<unknown>>(yDoc, 'auditTrail');\n const arr = auditMap?.get(scope);\n if (!arr) return 0;\n let stamped = 0;\n for (let index = 0; index < arr.length; index += 1) {\n const value = arr.get(index);\n if (!value || typeof value !== 'object') continue;\n const entry = value as { type?: string; details?: { sessionRunId?: string } };\n if (!entry.details || entry.details.sessionRunId || !matches(entry)) continue;\n arr.delete(index, 1);\n arr.insert(index, [{ ...entry, details: { ...entry.details, sessionRunId } }]);\n stamped += 1;\n }\n return stamped;\n}\n\n/**\n * Give every pre-session record an explicit owner.\n *\n * Idempotent: a record that already carries a `sessionRunId` is never rewritten,\n * so re-running this changes nothing and reports zero.\n *\n * Runs inside the migration's transaction — callers must not invoke it on its\n * own, or a failure later in the migration would leave records pointing at a\n * session that does not exist.\n */\nexport function stampPreSessionRecords(yDoc: Y.Doc, sessionRunId: string): StampedRecordCounts {\n const auditScopes = getExistingYMap<Y.Array<unknown>>(yDoc, 'auditTrail');\n let runRecords = 0;\n auditScopes?.forEach((_, scope) => {\n if (scope === FLOW_AGENT_AUDIT_SCOPE) return;\n runRecords += stampAuditEntries(yDoc, scope, sessionRunId, (entry) => entry.type === RUN_RECORD_AUDIT_TYPE);\n });\n\n return {\n commands: stampMapValues(yDoc, FLOW_AGENT_OUTBOX_KEY, sessionRunId),\n leases: stampMapValues(yDoc, FLOW_AGENT_LEASES_KEY, sessionRunId),\n ledgerEvents: stampAuditEntries(yDoc, FLOW_AGENT_AUDIT_SCOPE, sessionRunId, () => true),\n invocations: stampInvocations(yDoc, sessionRunId),\n runRecords,\n };\n}\n\nfunction stampInvocations(yDoc: Y.Doc, sessionRunId: string): number {\n const map = getExistingYMap<StoredInvocation>(yDoc, INVOCATIONS_MAP_KEY);\n if (!map) return 0;\n let stamped = 0;\n map.forEach((value, cid) => {\n if (!value || typeof value !== 'object' || value.sessionRunId) return;\n map.set(cid, { ...value, sessionRunId });\n stamped += 1;\n });\n return stamped;\n}\n\n/**\n * When the document's history began, derived rather than observed.\n *\n * The earliest execution the flat runtime map records, falling back to the\n * document's creation time and finally to zero. Never `Date.now()`: the value\n * is written into run metadata, and a wall-clock reading would make two clients\n * migrating the same document disagree about what they migrated.\n */\nexport function deriveMigratedStartedAt(yDoc: Y.Doc): number {\n let earliest: number | undefined;\n getExistingYMap<{ executedAt?: unknown }>(yDoc, 'runtime')?.forEach((value) => {\n if (!value || typeof value !== 'object') return;\n const executedAt = value.executedAt;\n if (typeof executedAt !== 'number' || !Number.isFinite(executedAt)) return;\n if (earliest === undefined || executedAt < earliest) earliest = executedAt;\n });\n if (earliest !== undefined) return earliest;\n\n const createdAt = getExistingYMap(yDoc, 'root')?.get('createdAt');\n if (typeof createdAt === 'number' && Number.isFinite(createdAt)) return createdAt;\n if (typeof createdAt === 'string') {\n const parsed = Date.parse(createdAt);\n if (!Number.isNaN(parsed)) return parsed;\n }\n return 0;\n}\n\nconst CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\nfunction fnv1a(input: string): number {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return hash >>> 0;\n}\n\nfunction encodeCrockford(value: number, length: number): string {\n let remaining = value;\n let encoded = '';\n for (let index = 0; index < length; index += 1) {\n encoded = CROCKFORD[remaining % 32] + encoded;\n remaining = Math.floor(remaining / 32);\n }\n return encoded;\n}\n\n/**\n * The id of the session a migration creates — **derived, not random.**\n *\n * `createRunId` appends a random ULID, which is right for `startRun`: starting a\n * session is a single writer acting once. Migration is not: two clients opening\n * the same legacy flow and both pressing Migrate would mint two ids and split\n * one history into two sessions, each holding half the answer.\n *\n * Deriving the suffix from document-stable inputs makes concurrent migrations\n * converge on the same container instead, which is the property the old fixed\n * `r-0000-legacy` id provided for free.\n */\nexport function deriveMigratedRunId(params: { docId: string; defHash: string; startedAt: number }): string {\n const seed = `${params.docId}\u0000${params.defHash}\u0000${params.startedAt}`;\n return `r-0001-${encodeCrockford(fnv1a(seed), 8)}${encodeCrockford(fnv1a(`${seed}\u0000salt`), 8)}`;\n}\n","import type * as Y from 'yjs';\nimport { getAction } from '../actionRegistry';\nimport type { ActionRunContext } from '../actionRegistry';\nimport type { FlowNodeRuntimeState } from '../../types/authorization';\nimport { isActionDone } from './completion';\nimport {\n collectPhantomLegacyRun,\n ensureRun,\n getExistingRunsMap,\n getExistingRunsTerminalMap,\n getRunMeta,\n getRunsTerminalMap,\n isBelowTheLineBlock,\n readActionState,\n resetActionState,\n seedRunFromLegacyRuntime,\n setMultiRunStorage,\n usesLegacyRuntimeCompatibility,\n type MultiRunMigrationResult,\n type RunMeta,\n type RunTerminalRecord,\n} from './runs';\nimport { deriveMigratedRunId, deriveMigratedStartedAt, stampPreSessionRecords, type StampedRecordCounts } from './runMigration';\nimport { dispatchFlowStartTriggers } from './reconcile';\nimport { createRunEventIdempotencyKey } from './runTimeline';\nimport { isTempUcanEnforcementDisabled } from './versionManifest';\n\nexport type RunJsonValue = null | string | number | boolean | RunJsonObject | RunJsonValue[];\nexport interface RunJsonObject {\n [key: string]: RunJsonValue;\n}\n\nexport type LifecycleRunEventInput =\n | {\n runId: string;\n kind: 'run.started';\n payload: { invocationCid?: string; definitionRevision?: string; label?: string };\n idempotencyKey: string;\n ts?: number;\n blockId?: never;\n }\n | {\n runId: string;\n kind: 'run.closed';\n payload: { invocationCid?: string; summary?: RunJsonObject };\n idempotencyKey: string;\n ts?: number;\n blockId?: never;\n }\n | {\n runId: string;\n kind: 'run.cancelled';\n payload: { invocationCid?: string; reason?: string; summary?: RunJsonObject };\n idempotencyKey: string;\n ts?: number;\n blockId?: never;\n }\n | {\n runId: string;\n kind: 'definition.changed';\n payload: { revision: string; previousRevision?: string; changedBlockIds?: string[]; summary?: string };\n idempotencyKey: string;\n ts?: number;\n blockId?: never;\n };\n\nexport type ActionRunEventInput =\n | {\n runId: string;\n blockId: string;\n kind: 'action.started';\n payload: { attempt: number; executionId?: string; invocationCid?: string; input?: RunJsonValue };\n idempotencyKey: string;\n ts?: number;\n }\n | {\n runId: string;\n blockId: string;\n kind: 'action.output';\n payload: { attempt: number; executionId?: string; output: RunJsonValue };\n idempotencyKey: string;\n ts?: number;\n }\n | {\n runId: string;\n blockId: string;\n kind: 'action.done';\n payload: { attempt: number; executionId?: string; durationMs?: number; output?: RunJsonValue };\n idempotencyKey: string;\n ts?: number;\n }\n | {\n runId: string;\n blockId: string;\n kind: 'action.failed';\n payload: {\n attempt: number;\n executionId?: string;\n durationMs?: number;\n error: { message: string; name?: string; code?: string; retryable?: boolean; details?: RunJsonValue };\n };\n idempotencyKey: string;\n ts?: number;\n };\n\nexport type RunLogEventInput = {\n runId: string;\n blockId?: string;\n kind: 'log';\n payload: { level: 'debug' | 'info' | 'warn' | 'error'; message: string; data?: RunJsonValue };\n idempotencyKey: string;\n ts?: number;\n};\n\nexport type RunEventInput = LifecycleRunEventInput | ActionRunEventInput | RunLogEventInput;\n\n/** Assignment-compatible with matrix-crdt's IRoomEventLog. */\nexport interface RunEventAppender {\n append(event: RunEventInput): Promise<string>;\n}\n\nexport type RunLifecycleCapability = 'flow/run.start' | 'flow/run.close';\n\nexport interface RunLifecycleAuthorizationRequest {\n can: RunLifecycleCapability;\n with: string;\n actorDid: string;\n runId?: string;\n}\n\nexport interface RunLifecycleAuthorizationDecision {\n allowed: boolean;\n reason?: string;\n invocationCid?: string;\n}\n\nexport type RunLifecycleAuthorizer = (request: RunLifecycleAuthorizationRequest) => Promise<RunLifecycleAuthorizationDecision> | RunLifecycleAuthorizationDecision;\n\nexport interface RunManifest {\n blockIds: string[];\n defHash: string;\n}\n\nexport interface RunDefinitionBlock {\n id?: string;\n type?: string;\n props?: Record<string, unknown>;\n children?: RunDefinitionBlock[];\n}\n\nexport interface RunDefinitionSnapshot {\n manifest: RunManifest;\n actionTypes: Record<string, string>;\n}\n\nexport interface RunSnapshot {\n id: string;\n meta: RunMeta;\n terminal?: RunTerminalRecord;\n}\n\nexport class RunLifecycleAuthorizationError extends Error {\n constructor(\n public readonly capability: RunLifecycleCapability,\n message: string\n ) {\n super(message);\n this.name = 'RunLifecycleAuthorizationError';\n }\n}\n\nexport class RunNotReadyError extends Error {\n constructor(public readonly incompleteBlockIds: string[]) {\n super(`Run cannot close while manifest actions remain incomplete: ${incompleteBlockIds.join(', ')}`);\n this.name = 'RunNotReadyError';\n }\n}\n\n/**\n * The flow predates sessions and has not been migrated, so it has no session to\n * act on. Thrown by `startRun` rather than quietly migrating on the caller's\n * behalf: migration is one-way and changes how every client reads the document,\n * which is a decision for an actor, not a side effect of pressing Start.\n */\nexport class FlowNotMigratedError extends Error {\n constructor(public readonly flowUri: string) {\n super('This flow predates sessions. Migrate it to enable them.');\n this.name = 'FlowNotMigratedError';\n }\n}\n\n/**\n * The run exists but has no frozen manifest, so there is no definition to judge\n * completeness against.\n *\n * Reaching this means the run was created by something other than `startRun` or\n * `migrateFlowToSessions` — in practice a container left behind by a build that\n * created one on connect. Computing a summary against the *live* document\n * instead would let an unstarted flow report work as belonging to a session\n * nobody opened.\n */\nexport class RunNotMigratedError extends Error {\n constructor(public readonly runId: string) {\n super(`Run \"${runId}\" has no frozen manifest, so it is not a session.`);\n this.name = 'RunNotMigratedError';\n }\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map(canonicalize);\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const nested = (value as Record<string, unknown>)[key];\n if (nested !== undefined && typeof nested !== 'function') result[key] = canonicalize(nested);\n }\n return result;\n}\n\nfunction fnv1a32(input: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\nexport function computeRunDefinitionHash(definition: unknown): string {\n return `def-${fnv1a32(JSON.stringify(canonicalize(definition)))}`;\n}\n\n/** Convert arbitrary action data into Matrix-event-safe JSON. */\nexport function toRunJsonValue(value: unknown): RunJsonValue {\n if (value === undefined) return null;\n try {\n return JSON.parse(JSON.stringify(value)) as RunJsonValue;\n } catch {\n return String(value);\n }\n}\n\nfunction walkBlocks(blocks: RunDefinitionBlock[], visit: (block: RunDefinitionBlock) => void): void {\n for (const block of blocks) {\n visit(block);\n if (Array.isArray(block.children)) walkBlocks(block.children, visit);\n }\n}\n\nexport function buildRunDefinitionSnapshot(blocks: RunDefinitionBlock[], definition: unknown = blocks): RunDefinitionSnapshot {\n const blockIds: string[] = [];\n const actionTypes: Record<string, string> = {};\n walkBlocks(blocks, (block) => {\n const actionType = block.props?.actionType;\n if (!block.id || typeof actionType !== 'string' || isBelowTheLineBlock(block) || actionType === 'qi/flow.run.start' || actionType === 'qi/flow.run.close') {\n return;\n }\n blockIds.push(block.id);\n actionTypes[block.id] = actionType;\n });\n return {\n manifest: {\n blockIds,\n defHash: computeRunDefinitionHash(definition),\n },\n actionTypes,\n };\n}\n\nconst CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\nfunction encodeTime(timestamp: number): string {\n let value = Math.max(0, Math.floor(timestamp));\n let encoded = '';\n for (let i = 0; i < 10; i += 1) {\n encoded = CROCKFORD[value % 32] + encoded;\n value = Math.floor(value / 32);\n }\n return encoded;\n}\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n const cryptoApi = (globalThis as { crypto?: { getRandomValues?: (target: Uint8Array) => Uint8Array } }).crypto;\n if (cryptoApi?.getRandomValues) return cryptoApi.getRandomValues(bytes);\n for (let i = 0; i < length; i += 1) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\nexport function createRunUlid(timestamp = Date.now()): string {\n const bytes = randomBytes(16);\n let randomPart = '';\n for (let i = 0; i < 16; i += 1) randomPart += CROCKFORD[bytes[i] & 31];\n return `${encodeTime(timestamp)}${randomPart}`;\n}\n\nfunction nextRunSequence(yDoc: Y.Doc): number {\n let max = 0;\n getExistingRunsMap(yDoc)?.forEach((_, runId) => {\n max = Math.max(max, getRunMeta(yDoc, runId)?.seq || 0);\n });\n return max + 1;\n}\n\nexport function createRunId(seq: number, timestamp = Date.now()): string {\n return `r-${String(seq).padStart(4, '0')}-${createRunUlid(timestamp)}`;\n}\n\nexport function listRuns(yDoc: Y.Doc): RunSnapshot[] {\n const terminal = getExistingRunsTerminalMap(yDoc);\n const runs: RunSnapshot[] = [];\n getExistingRunsMap(yDoc)?.forEach((_, id) => {\n const meta = getRunMeta(yDoc, id);\n if (!meta) return;\n const terminalRecord = terminal?.get(id);\n runs.push({\n id,\n meta: { ...meta, manifest: meta.manifest ? { ...meta.manifest, blockIds: [...meta.manifest.blockIds] } : undefined },\n terminal: terminalRecord ? { ...terminalRecord, summary: terminalRecord.summary ? { ...terminalRecord.summary } : undefined } : undefined,\n });\n });\n return runs.sort((a, b) => b.meta.seq - a.meta.seq || b.meta.startedAt - a.meta.startedAt || b.id.localeCompare(a.id));\n}\n\nexport function listOpenRuns(yDoc: Y.Doc): RunSnapshot[] {\n return listRuns(yDoc).filter((run) => !run.terminal);\n}\n\nexport function setAdvisoryActiveRunId(yDoc: Y.Doc, runId: string): void {\n if (!getExistingRunsMap(yDoc)?.has(runId)) throw new Error(`Unknown run \"${runId}\"`);\n yDoc.getMap('root').set('activeRunId', runId);\n}\n\nasync function requireAuthorization(authorize: RunLifecycleAuthorizer, request: RunLifecycleAuthorizationRequest): Promise<RunLifecycleAuthorizationDecision> {\n // TEMPORARY — the same kill switch that disables UCAN enforcement for block\n // execution (`versionManifest.ts#isTempUcanEnforcementDisabled`). While it is\n // on, starting, migrating, closing and cancelling a session are ungated.\n //\n // The authorizer is **not called at all**, rather than called and ignored: a\n // consumer's authorizer may itself throw (the Portal's reads room state), and\n // \"the gate is off\" must not depend on the gate being reachable.\n //\n // Only the permission check goes. Everything that makes a lifecycle\n // transition correct still runs — the timeline is appended before the\n // document changes, the close fold still demands every manifest action be\n // done, and terminal state is still write-once — so restoring enforcement is\n // a one-line change with nothing to reconstruct.\n if (isTempUcanEnforcementDisabled()) {\n return { allowed: true };\n }\n const decision = await authorize(request);\n if (!decision.allowed) {\n throw new RunLifecycleAuthorizationError(request.can, decision.reason || `${request.actorDid} is not authorized for ${request.can}`);\n }\n return decision;\n}\n\nexport interface StartRunParams {\n yDoc: Y.Doc;\n flowUri: string;\n actorDid: string;\n definition: RunDefinitionSnapshot;\n /** Live block tree used to dispatch authored `trigger: flow.start` actions. */\n document?: RunDefinitionBlock[];\n eventLog: RunEventAppender;\n authorize: RunLifecycleAuthorizer;\n label?: string;\n now?: () => number;\n}\n\nexport interface StartRunResult {\n run: RunSnapshot;\n eventId: string;\n flowStartInvocations: number;\n}\n\nconst lifecycleQueues = new WeakMap<Y.Doc, Map<string, Promise<void>>>();\n\nasync function withLifecycleLock<T>(yDoc: Y.Doc, key: string, operation: () => Promise<T>): Promise<T> {\n let queues = lifecycleQueues.get(yDoc);\n if (!queues) {\n queues = new Map();\n lifecycleQueues.set(yDoc, queues);\n }\n const previous = queues.get(key) || Promise.resolve();\n let release!: () => void;\n const gate = new Promise<void>((resolve) => {\n release = resolve;\n });\n const current = previous.then(() => gate);\n queues.set(key, current);\n await previous;\n try {\n return await operation();\n } finally {\n release();\n if (queues.get(key) === current) queues.delete(key);\n }\n}\n\nexport async function startRun(params: StartRunParams): Promise<StartRunResult> {\n return withLifecycleLock(params.yDoc, '__start__', async () => {\n // A version 1 document still reads and writes the flat runtime map, so a\n // session started on it would be a second, partial view of the same state.\n // Migration is the only way across, and it is an actor's decision.\n if (usesLegacyRuntimeCompatibility(params.yDoc)) {\n throw new FlowNotMigratedError(params.flowUri);\n }\n const authorization = await requireAuthorization(params.authorize, {\n can: 'flow/run.start',\n with: params.flowUri,\n actorDid: params.actorDid,\n });\n const now = params.now?.() ?? Date.now();\n const seq = nextRunSequence(params.yDoc);\n const runId = createRunId(seq, now);\n const meta: RunMeta = {\n seq,\n startedAt: now,\n startedByDid: params.actorDid,\n origin: 'started',\n ...(params.label ? { label: params.label } : {}),\n manifest: {\n blockIds: [...params.definition.manifest.blockIds],\n defHash: params.definition.manifest.defHash,\n },\n };\n\n // Timeline first: a transient Matrix failure must leave the document\n // completely unchanged, including its storage-version latch.\n const eventId = await params.eventLog.append({\n runId,\n kind: 'run.started',\n payload: {\n ...(authorization.invocationCid ? { invocationCid: authorization.invocationCid } : {}),\n definitionRevision: params.definition.manifest.defHash,\n ...(params.label ? { label: params.label } : {}),\n },\n idempotencyKey: createRunEventIdempotencyKey('run.started', runId),\n ts: now,\n });\n\n let flowStartInvocations = 0;\n params.yDoc.transact(() => {\n // A document with a session is session-based, permanently. Without this\n // the format would stay *inferred* from the absence of flat history, and\n // one stray write from a not-yet-upgraded client — which still dual-writes\n // the flat map — would flip the document back to version 1 underneath a\n // session that is already open.\n setMultiRunStorage(params.yDoc);\n ensureRun(params.yDoc, runId, meta);\n for (const blockId of meta.manifest!.blockIds) {\n resetActionState(params.yDoc, runId, blockId, { state: 'idle' });\n }\n if (params.document) {\n flowStartInvocations = dispatchFlowStartTriggers({\n yDoc: params.yDoc,\n runId,\n blocks: params.document,\n startedAt: now,\n sourceEventId: eventId,\n });\n }\n params.yDoc.getMap('root').set('activeRunId', runId);\n });\n\n return {\n run: { id: runId, meta },\n eventId,\n flowStartInvocations,\n };\n });\n}\n\nexport interface MigrateFlowParams {\n yDoc: Y.Doc;\n flowUri: string;\n actorDid: string;\n /** Frozen into the migrated session, exactly as `startRun` freezes its own. */\n definition: RunDefinitionSnapshot;\n eventLog: RunEventAppender;\n authorize: RunLifecycleAuthorizer;\n label?: string;\n}\n\nexport interface MigrateFlowResult {\n /** The session that now owns the document's history, or `undefined` when\n * there was no history to carry and the document was simply latched. */\n run?: RunSnapshot;\n eventId?: string;\n seeded: MultiRunMigrationResult;\n stamped?: StampedRecordCounts;\n phantomCollected: boolean;\n alreadyMigrated: boolean;\n}\n\n/**\n * Turn a pre-session document into a session-based one, **one way**.\n *\n * What already happened in the flow becomes its first session: an ordinary open\n * run carrying the same action states, pending invocations and partial barriers,\n * closable and tickable like any other. A document with no history has nothing\n * to carry, so it is simply latched and the actor starts session 1 normally.\n *\n * ## Order matters\n *\n * The timeline event is appended **before** anything is written to the document,\n * exactly as `startRun` does it: a transient Matrix failure must leave the\n * document completely unchanged rather than latched onto a layout whose history\n * nobody can see. Everything after it is one transaction, so a document is\n * never observed half-migrated — history seeded but unlatched, or latched with\n * records still pointing nowhere.\n *\n * Idempotent. A second call sees the latch and returns `alreadyMigrated`.\n */\nexport async function migrateFlowToSessions(params: MigrateFlowParams): Promise<MigrateFlowResult> {\n return withLifecycleLock(params.yDoc, '__start__', async () => {\n const empty: MultiRunMigrationResult = { actionStates: 0, pendingInvocations: 0, barrierEntries: 0 };\n // Sessions are the default, so \"legacy\" now means the document genuinely\n // carries pre-session history. A document without it is already\n // session-based and has nothing to migrate — including every flow created\n // by copying a template, which used to land in the branch below and be\n // latched by a migration that moved no state.\n if (!usesLegacyRuntimeCompatibility(params.yDoc)) {\n return { seeded: empty, phantomCollected: false, alreadyMigrated: true };\n }\n\n const authorization = await requireAuthorization(params.authorize, {\n can: 'flow/run.start',\n with: params.flowUri,\n actorDid: params.actorDid,\n });\n\n const startedAt = deriveMigratedStartedAt(params.yDoc);\n const runId = deriveMigratedRunId({\n docId: String(params.yDoc.getMap('root').get('doc_id') || params.flowUri),\n defHash: params.definition.manifest.defHash,\n startedAt,\n });\n const meta: RunMeta = {\n seq: 1,\n startedAt,\n startedByDid: params.actorDid,\n origin: 'migrated',\n label: params.label || 'Session 1 (migrated)',\n manifest: {\n blockIds: [...params.definition.manifest.blockIds],\n defHash: params.definition.manifest.defHash,\n },\n };\n\n const eventId = await params.eventLog.append({\n runId,\n kind: 'run.started',\n payload: {\n ...(authorization.invocationCid ? { invocationCid: authorization.invocationCid } : {}),\n definitionRevision: params.definition.manifest.defHash,\n label: meta.label,\n },\n idempotencyKey: createRunEventIdempotencyKey('run.started', runId),\n ts: startedAt,\n });\n\n let seeded = empty;\n let stamped: StampedRecordCounts | undefined;\n let phantomCollected = false;\n params.yDoc.transact(() => {\n // Before the run is created, so the collector cannot mistake the new\n // session for the phantom it is looking for.\n phantomCollected = collectPhantomLegacyRun(params.yDoc);\n ensureRun(params.yDoc, runId, meta);\n seeded = seedRunFromLegacyRuntime(params.yDoc, runId);\n stamped = stampPreSessionRecords(params.yDoc, runId);\n // Last: every read switches to the multi-run layout the moment this\n // lands, so nothing above may still be missing.\n setMultiRunStorage(params.yDoc);\n params.yDoc.getMap('root').set('activeRunId', runId);\n });\n\n return {\n run: { id: runId, meta },\n eventId,\n seeded,\n stamped,\n phantomCollected,\n alreadyMigrated: false,\n };\n });\n}\n\nexport function computeRunSummary(yDoc: Y.Doc, runId: string, actionTypes: Record<string, string>, context: Omit<ActionRunContext, 'runId'>): Record<string, boolean> {\n const meta = getRunMeta(yDoc, runId);\n if (!meta?.manifest) throw new RunNotMigratedError(runId);\n const runContext: ActionRunContext = { ...context, runId };\n const summary: Record<string, boolean> = {};\n for (const blockId of meta.manifest.blockIds) {\n summary[blockId] = isActionDone(actionTypes[blockId] ? getAction(actionTypes[blockId]) : undefined, readActionState(yDoc, runId, blockId), runContext);\n }\n return summary;\n}\n\nexport interface CloseRunParams {\n yDoc: Y.Doc;\n flowUri: string;\n runId: string;\n actorDid: string;\n actionTypes: Record<string, string>;\n eventLog: RunEventAppender;\n authorize: RunLifecycleAuthorizer;\n allowIncomplete?: boolean;\n now?: () => number;\n}\n\nexport interface FinishRunResult {\n terminal: RunTerminalRecord;\n created: boolean;\n eventId?: string;\n}\n\nexport async function closeRun(params: CloseRunParams): Promise<FinishRunResult> {\n return withLifecycleLock(params.yDoc, params.runId, async () => {\n const existing = getExistingRunsTerminalMap(params.yDoc)?.get(params.runId);\n if (existing) {\n return {\n terminal: {\n ...existing,\n summary: existing.summary ? { ...existing.summary } : undefined,\n },\n created: false,\n ...(existing.terminalEventId ? { eventId: existing.terminalEventId } : {}),\n };\n }\n const meta = getRunMeta(params.yDoc, params.runId);\n if (!meta) throw new Error(`Unknown run \"${params.runId}\"`);\n\n const authorization = await requireAuthorization(params.authorize, {\n can: 'flow/run.close',\n with: params.flowUri,\n actorDid: params.actorDid,\n runId: params.runId,\n });\n const now = params.now?.() ?? Date.now();\n const summary = computeRunSummary(params.yDoc, params.runId, params.actionTypes, {\n flowId: params.flowUri,\n actorDid: params.actorDid,\n now,\n });\n const incomplete = Object.entries(summary)\n .filter(([, done]) => !done)\n .map(([blockId]) => blockId);\n if (!params.allowIncomplete && incomplete.length > 0) {\n throw new RunNotReadyError(incomplete);\n }\n\n const eventId = await params.eventLog.append({\n runId: params.runId,\n kind: 'run.closed',\n payload: {\n ...(authorization.invocationCid ? { invocationCid: authorization.invocationCid } : {}),\n summary: summary as unknown as RunJsonObject,\n },\n // Close and cancel intentionally contend on one key.\n idempotencyKey: createRunEventIdempotencyKey('run.closed', params.runId, 'terminal'),\n ts: now,\n });\n\n const terminal: RunTerminalRecord = {\n status: 'closed',\n at: now,\n by: params.actorDid,\n terminalEventId: eventId,\n ...(authorization.invocationCid ? { closeInvocationCid: authorization.invocationCid } : {}),\n summary,\n };\n let created = false;\n params.yDoc.transact(() => {\n const terminalMap = getRunsTerminalMap(params.yDoc);\n if (!terminalMap.has(params.runId)) {\n terminalMap.set(params.runId, terminal);\n created = true;\n }\n });\n const winner = getRunsTerminalMap(params.yDoc).get(params.runId) || terminal;\n return {\n terminal: {\n ...winner,\n summary: winner.summary ? { ...winner.summary } : undefined,\n },\n created,\n eventId,\n };\n });\n}\n\nexport interface CancelRunParams extends Omit<CloseRunParams, 'allowIncomplete'> {\n reason?: string;\n}\n\nexport async function cancelRun(params: CancelRunParams): Promise<FinishRunResult> {\n return withLifecycleLock(params.yDoc, params.runId, async () => {\n const existing = getExistingRunsTerminalMap(params.yDoc)?.get(params.runId);\n if (existing) {\n return {\n terminal: {\n ...existing,\n summary: existing.summary ? { ...existing.summary } : undefined,\n },\n created: false,\n ...(existing.terminalEventId ? { eventId: existing.terminalEventId } : {}),\n };\n }\n if (!getRunMeta(params.yDoc, params.runId)) {\n throw new Error(`Unknown run \"${params.runId}\"`);\n }\n const authorization = await requireAuthorization(params.authorize, {\n can: 'flow/run.close',\n with: params.flowUri,\n actorDid: params.actorDid,\n runId: params.runId,\n });\n const now = params.now?.() ?? Date.now();\n const summary = computeRunSummary(params.yDoc, params.runId, params.actionTypes, {\n flowId: params.flowUri,\n actorDid: params.actorDid,\n now,\n });\n const eventId = await params.eventLog.append({\n runId: params.runId,\n kind: 'run.cancelled',\n payload: {\n ...(authorization.invocationCid ? { invocationCid: authorization.invocationCid } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n summary: summary as unknown as RunJsonObject,\n },\n // Same key family as close: one local/log transition may win.\n idempotencyKey: createRunEventIdempotencyKey('run.closed', params.runId, 'terminal'),\n ts: now,\n });\n const terminal: RunTerminalRecord = {\n status: 'cancelled',\n at: now,\n by: params.actorDid,\n terminalEventId: eventId,\n ...(authorization.invocationCid ? { closeInvocationCid: authorization.invocationCid } : {}),\n summary,\n };\n let created = false;\n params.yDoc.transact(() => {\n const terminalMap = getRunsTerminalMap(params.yDoc);\n if (!terminalMap.has(params.runId)) {\n terminalMap.set(params.runId, terminal);\n created = true;\n }\n });\n const winner = getRunsTerminalMap(params.yDoc).get(params.runId) || terminal;\n return {\n terminal: {\n ...winner,\n summary: winner.summary ? { ...winner.summary } : undefined,\n },\n created,\n eventId,\n };\n });\n}\n\nexport interface RunDefinitionDrift {\n changed: boolean;\n previousRevision?: string;\n revision: string;\n changedBlockIds: string[];\n}\n\nexport function detectRunDefinitionDrift(yDoc: Y.Doc, runId: string, definition: RunDefinitionSnapshot): RunDefinitionDrift {\n const manifest = getRunMeta(yDoc, runId)?.manifest;\n if (!manifest) throw new RunNotMigratedError(runId);\n const before = new Set(manifest.blockIds);\n const after = new Set(definition.manifest.blockIds);\n const changedBlockIds = [...new Set([...before, ...after])].filter((id) => before.has(id) !== after.has(id));\n return {\n changed: manifest.defHash !== definition.manifest.defHash,\n previousRevision: manifest.defHash,\n revision: definition.manifest.defHash,\n changedBlockIds,\n };\n}\n\nexport async function recordRunDefinitionDrift(\n yDoc: Y.Doc,\n runId: string,\n definition: RunDefinitionSnapshot,\n eventLog: RunEventAppender,\n now = Date.now()\n): Promise<RunDefinitionDrift & { eventId?: string }> {\n const drift = detectRunDefinitionDrift(yDoc, runId, definition);\n if (!drift.changed) return drift;\n const eventId = await eventLog.append({\n runId,\n kind: 'definition.changed',\n payload: {\n revision: drift.revision,\n previousRevision: drift.previousRevision,\n changedBlockIds: drift.changedBlockIds,\n summary: 'The live flow definition changed after this session started.',\n },\n idempotencyKey: createRunEventIdempotencyKey('definition.changed', runId, drift.revision),\n ts: now,\n });\n return { ...drift, eventId };\n}\n\nexport function readRunActionStates(yDoc: Y.Doc, runId: string, blockIds: string[]): Record<string, FlowNodeRuntimeState> {\n return Object.fromEntries(blockIds.map((blockId) => [blockId, readActionState(yDoc, runId, blockId)]));\n}\n","import { isRuntimeRef } from '../../types/baseUcan';\nimport { getNestedValue } from '../flowEngine/referenceResolver';\n\n/**\n * Context passed to resolveRuntimeRefs when resolving inputs for a triggered\n * listener block. The runtime constructs this from a PendingInvocation when\n * the assignee invokes the listener.\n *\n * - `payload`: the frozen event payload, used to resolve `trigger.payload.*` refs\n * - `refSnapshots`: frozen `nodeId.output.*` values captured at queue time,\n * used to resolve those refs against the moment of emission rather than\n * current state. See docs/flow-engine/events-and-triggers-plan.md §3.5.1 for the\n * Sally → Mike scenario this fixes.\n */\nexport interface TriggerResolutionContext {\n payload: Record<string, unknown>;\n refSnapshots: Record<string, unknown>;\n}\n\n/**\n * Resolve runtime references in an nb (caveats) object.\n *\n * At compile time, `{ \"$ref\": \"nodeId.output.fieldPath\" }` values are serialized\n * as-is into the block's `inputs` JSON string. At execution time, this function\n * replaces them with actual output values from upstream nodes.\n *\n * Two ref namespaces are supported:\n * - `nodeId.output.fieldPath` — looked up via `getNodeOutput`. When a\n * `triggerContext` is provided AND `refSnapshots[ref]` exists, the\n * snapshot is preferred over the live lookup. This is the load-bearing\n * fix for the lag-time scenario where multiple pending invocations are\n * queued and the source block re-runs before the assignee acts on them.\n * - `trigger.payload.fieldPath` — looked up in `triggerContext.payload`.\n * Only valid when `triggerContext` is provided (i.e. resolving inputs\n * for a triggered listener invocation). Compile-time validation in\n * compiler.ts guarantees these only appear on `block.event`-triggered\n * blocks.\n *\n * @param nb - The caveats object (may contain nested RuntimeRef values)\n * @param getNodeOutput - Lookup function for upstream node outputs\n * @param triggerContext - Optional, present only for triggered listener invocations\n * @returns A new object with all $ref values resolved\n */\nexport function resolveRuntimeRefs(\n nb: Record<string, unknown>,\n getNodeOutput: (nodeId: string) => Record<string, unknown> | undefined,\n triggerContext?: TriggerResolutionContext\n): Record<string, unknown> {\n return resolveValue(nb, getNodeOutput, triggerContext) as Record<string, unknown>;\n}\n\nfunction resolveValue(value: unknown, getNodeOutput: (nodeId: string) => Record<string, unknown> | undefined, triggerContext?: TriggerResolutionContext): unknown {\n if (isRuntimeRef(value)) {\n return resolveRef(value.$ref, getNodeOutput, triggerContext);\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => resolveValue(item, getNodeOutput, triggerContext));\n }\n\n if (typeof value === 'object' && value !== null) {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = resolveValue(val, getNodeOutput, triggerContext);\n }\n return result;\n }\n\n return value;\n}\n\n/**\n * Resolve a single $ref string.\n *\n * Supported forms:\n * - \"trigger.payload.fieldPath\" — looked up in triggerContext.payload\n * - \"nodeId.output.fieldPath\" — looked up in triggerContext.refSnapshots first\n * (if present), falling back to getNodeOutput. Snapshot preference is\n * what makes the Sally → Mike scenario produce frozen values per pending\n * invocation.\n */\nfunction resolveRef(ref: string, getNodeOutput: (nodeId: string) => Record<string, unknown> | undefined, triggerContext?: TriggerResolutionContext): unknown {\n // trigger.payload.* — only valid when a triggerContext is provided\n if (ref.startsWith('trigger.payload.')) {\n if (!triggerContext) {\n throw new Error(`Trigger ref \"${ref}\" used outside of a listener invocation context. trigger.payload.* refs are only valid on block.event-triggered blocks.`);\n }\n const fieldPath = ref.slice('trigger.payload.'.length);\n return getNestedValue(triggerContext.payload, fieldPath);\n }\n\n // nodeId.output.fieldPath — prefer the snapshot if we're inside a trigger context\n if (triggerContext && Object.prototype.hasOwnProperty.call(triggerContext.refSnapshots, ref)) {\n return triggerContext.refSnapshots[ref];\n }\n\n // Parse \"nodeId.output.fieldPath\"\n const outputIndex = ref.indexOf('.output.');\n if (outputIndex === -1) {\n throw new Error(`Invalid runtime reference \"${ref}\". Expected format: \"nodeId.output.fieldPath\" or \"trigger.payload.fieldPath\"`);\n }\n\n const nodeId = ref.slice(0, outputIndex);\n const fieldPath = ref.slice(outputIndex + '.output.'.length);\n\n const output = getNodeOutput(nodeId);\n if (!output) {\n return undefined;\n }\n\n // Traverse the field path (supports dot notation)\n return getNestedValue(output, fieldPath);\n}\n","import type { UcanCapability } from '../../types/ucan';\nimport type { UcanService } from '../../services/ucanService';\nimport { getVersionPolicy } from './versionManifest';\n\nexport interface AuthorizationResult {\n authorized: boolean;\n reason?: string;\n capabilityId?: string;\n proofCids?: string[];\n}\n\n/**\n * Check if an actor is authorized to execute a block.\n *\n * Behaviour depends on the flow's schema version:\n * - v0.x (or no version): UCAN is optional. If ucanService is unavailable,\n * execution is allowed without a delegation chain.\n * - v1.0.0+: UCAN is required. A valid delegation chain must exist.\n */\nexport const isAuthorized = async (\n blockId: string,\n actorDid: string,\n ucanService: UcanService | undefined,\n flowUri: string,\n schemaVersion?: string\n): Promise<AuthorizationResult> => {\n const policy = schemaVersion ? getVersionPolicy(schemaVersion) : null;\n\n // If UCAN is not required by this version, allow execution without delegation chain\n if (policy && !policy.ucanRequired) {\n return { authorized: true };\n }\n\n // UCAN is required (v1.0.0+ or unknown version) — ucanService must be available\n if (!ucanService) {\n // No ucanService and no version info: allow for backward compatibility\n if (!policy) {\n return { authorized: true };\n }\n return {\n authorized: false,\n reason: 'UCAN service is not configured. This flow version requires UCAN authorization.',\n };\n }\n\n const capability: UcanCapability = {\n can: 'flow/block/execute',\n with: `${flowUri}:${blockId}`,\n };\n\n const result = await ucanService.validateDelegationChain(actorDid, capability);\n\n if (!result.valid) {\n return {\n authorized: false,\n reason: result.error || 'No valid capability chain found',\n };\n }\n\n const proofCids = result.proofChain?.map((d) => d.cid) || [];\n\n return {\n authorized: true,\n capabilityId: proofCids[0],\n proofCids,\n };\n};\n","import { isAuthorized } from './authorization';\nimport type { FlowNode, FlowNodeRuntimeState, EvaluationStatus } from '../../types/authorization';\nimport type { FlowRuntimeStateManager } from './runtime';\nimport type { InvocationStore } from '../invocationStore';\nimport type { UcanService } from '../../services/ucanService';\nimport type { StoredInvocation, UcanCapability } from '../../types/ucan';\n\nexport interface NodeActionResult {\n claimId?: string;\n evaluationStatus?: EvaluationStatus;\n submittedByDid?: string;\n payload?: any;\n}\n\nexport interface ExecutionContext {\n runtime: FlowRuntimeStateManager;\n /** UCAN service — optional for v0.x flows, required for v1.0.0+ */\n ucanService?: UcanService;\n /** Invocation store — optional for v0.x flows */\n invocationStore?: InvocationStore;\n flowUri: string;\n flowId: string;\n /** Session run that owns runtime and invocation records for this execution. */\n sessionRunId?: string;\n flowOwnerDid: string;\n /** Flow schema version. When set, controls whether UCAN is enforced. */\n schemaVersion?: string;\n now?: () => number;\n}\n\nexport interface ExecutionOutcome {\n success: boolean;\n stage: 'authorization' | 'claim' | 'action' | 'complete';\n error?: string;\n result?: NodeActionResult;\n capabilityId?: string;\n invocationCid?: string;\n}\n\nexport interface ExecuteNodeParams {\n node: FlowNode;\n actorDid: string;\n actorType: 'entity' | 'user';\n entityRoomId?: string;\n context: ExecutionContext;\n action: () => Promise<NodeActionResult>;\n pin: string;\n}\n\nconst updateRuntimeAfterSuccess = (\n node: FlowNode,\n actorDid: string,\n runtime: FlowRuntimeStateManager,\n actionResult: NodeActionResult,\n invocationCid?: string,\n now?: () => number\n) => {\n const updates: FlowNodeRuntimeState = {\n submittedByDid: actionResult.submittedByDid || actorDid,\n evaluationStatus: actionResult.evaluationStatus || 'pending',\n executionTimestamp: now ? now() : Date.now(),\n lastInvocationCid: invocationCid,\n };\n\n if (actionResult.claimId) {\n updates.claimId = actionResult.claimId;\n }\n\n runtime.update(node.id, updates);\n};\n\n/**\n * Execute a node.\n *\n * The pipeline adapts based on the flow's schema version (via context.schemaVersion):\n *\n * **v0.x (legacy):** activation → action → runtime update.\n * UCAN authorization and invocations are skipped when ucanService is not available.\n *\n * **v1.0.0+:** activation → UCAN authorization → invocation → action → runtime update.\n * Requires a configured ucanService with valid delegation chains.\n */\nexport const executeNode = async ({ node, actorDid, actorType, entityRoomId, context, action, pin }: ExecuteNodeParams): Promise<ExecutionOutcome> => {\n const { runtime, ucanService, invocationStore, flowUri, flowId, sessionRunId, schemaVersion, now } = context;\n\n // 1. Check authorization (version-aware: skips UCAN for v0.x when service unavailable)\n const auth = await isAuthorized(node.id, actorDid, ucanService, flowUri, schemaVersion);\n if (!auth.authorized) {\n return { success: false, stage: 'authorization', error: auth.reason };\n }\n\n // 3. Check linked claim requirement\n if (node.linkedClaim && !node.linkedClaim.collectionId) {\n return { success: false, stage: 'claim', error: 'Linked claim collection is required but missing.' };\n }\n\n // 4. Create invocation BEFORE execution (only when UCAN proof chain exists)\n let invocationCid: string | undefined;\n let invocationData: string | undefined;\n\n if (ucanService && auth.proofCids && auth.proofCids.length > 0) {\n const capability: UcanCapability = {\n can: 'flow/block/execute',\n with: `${flowUri}:${node.id}`,\n };\n\n try {\n const invocationResult = await ucanService.createAndValidateInvocation(\n {\n invokerDid: actorDid,\n invokerType: actorType,\n entityRoomId,\n capability,\n proofs: auth.proofCids,\n pin,\n },\n flowId,\n node.id\n );\n\n if (!invocationResult.valid) {\n return {\n success: false,\n stage: 'authorization',\n error: `Invocation validation failed: ${invocationResult.error}`,\n };\n }\n\n invocationCid = invocationResult.cid;\n invocationData = invocationResult.invocation;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to create invocation';\n return { success: false, stage: 'authorization', error: message };\n }\n }\n\n // 5. Execute action\n try {\n const result = await action();\n\n // 6. Verify linked claim was provided if required\n if (node.linkedClaim && !result.claimId) {\n if (invocationStore && invocationCid && invocationData) {\n const storedInvocation: StoredInvocation = {\n cid: invocationCid,\n invocation: invocationData,\n invokerDid: actorDid,\n capability: { can: 'flow/block/execute', with: `${flowUri}:${node.id}` },\n executedAt: now ? now() : Date.now(),\n flowId,\n sessionRunId,\n blockId: node.id,\n result: 'failure',\n error: 'Execution did not return a claimId for linked claim requirement.',\n proofCids: auth.proofCids || [],\n };\n invocationStore.add(storedInvocation);\n }\n\n return {\n success: false,\n stage: 'claim',\n error: 'Execution did not return a claimId for linked claim requirement.',\n invocationCid,\n };\n }\n\n // 7. Store successful invocation\n if (invocationStore && invocationCid && invocationData) {\n const storedInvocation: StoredInvocation = {\n cid: invocationCid,\n invocation: invocationData,\n invokerDid: actorDid,\n capability: { can: 'flow/block/execute', with: `${flowUri}:${node.id}` },\n executedAt: now ? now() : Date.now(),\n flowId,\n sessionRunId,\n blockId: node.id,\n result: 'success',\n proofCids: auth.proofCids || [],\n claimId: result.claimId,\n };\n invocationStore.add(storedInvocation);\n }\n\n // 8. Update runtime state\n updateRuntimeAfterSuccess(node, actorDid, runtime, result, invocationCid || auth.capabilityId, now);\n\n return {\n success: true,\n stage: 'complete',\n result,\n capabilityId: auth.capabilityId,\n invocationCid,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Execution failed';\n\n // Store failed invocation\n if (invocationStore && invocationCid && invocationData) {\n const storedInvocation: StoredInvocation = {\n cid: invocationCid,\n invocation: invocationData,\n invokerDid: actorDid,\n capability: { can: 'flow/block/execute', with: `${flowUri}:${node.id}` },\n executedAt: now ? now() : Date.now(),\n flowId,\n sessionRunId,\n blockId: node.id,\n result: 'failure',\n error: message,\n proofCids: auth.proofCids || [],\n };\n invocationStore.add(storedInvocation);\n }\n\n return { success: false, stage: 'action', error: message, invocationCid };\n }\n};\n\n// ---------------------------------------------------------------------------\n// Version-aware execution dispatch (convenience wrapper)\n// ---------------------------------------------------------------------------\n\nexport interface ExecuteNodeVersionedParams {\n node: FlowNode;\n actorDid: string;\n actorType: 'entity' | 'user';\n entityRoomId?: string;\n schemaVersion: string;\n context: ExecutionContext;\n action: () => Promise<NodeActionResult>;\n pin: string;\n}\n\n/**\n * Convenience wrapper that ensures schemaVersion is set on the context.\n * Prefer using executeNode directly with context.schemaVersion set.\n */\nexport const executeNodeVersioned = async (params: ExecuteNodeVersionedParams): Promise<ExecutionOutcome> => {\n return executeNode({\n node: params.node,\n actorDid: params.actorDid,\n actorType: params.actorType,\n entityRoomId: params.entityRoomId,\n context: { ...params.context, schemaVersion: params.schemaVersion },\n action: params.action,\n pin: params.pin,\n });\n};\n","import * as Y from 'yjs';\nimport { getAction } from '../actionRegistry';\nimport type { ActionResult } from '../actionRegistry/types';\nimport { PROOF_MISSING_CODE, validateActionProof } from './proof';\nimport type { ActionReadBackMetadata, FlowNodeRuntimeState, ReadBackTerminalState } from '../../types/authorization';\nimport type { IxoEditorType } from '../../types/editor';\nimport type { FlowRuntimeStateManager } from './runtime';\nimport { createRuntimeStateManager } from './runtime';\nimport { createRunRuntimeReaderWithDoc, createRunScopedRuntimeManager, resolveRunIdForExecution, usesLegacyRuntimeCompatibility } from './runs';\nimport { reconcilePendingInvocations } from './reconcile';\nimport { appendRunRecord, removePendingInvocation, type PendingInvocation, type RunRecordDetails } from './triggers';\nimport type { RunEventAppender, RunEventInput } from './runLifecycle';\nimport { appendRunTimelineEvent, appendRunTimelineEvents, boundRunActionOutput, boundRunEventJson, createRunEventIdempotencyKey, MAX_RUN_ACTION_OUTPUT_BYTES } from './runTimeline';\n\ntype EditorOrYDoc = IxoEditorType | Y.Doc;\n\nexport interface NormalizeReadBackMetadataParams {\n readBack?: Record<string, unknown>;\n blockId: string;\n actionType: string;\n actorDid: string;\n invocationCid?: string;\n capabilityId?: string;\n requestedAt: number;\n pendingInvocation?: PendingInvocation;\n}\n\nexport interface ActionReadBackResolution {\n state: ReadBackTerminalState;\n output?: Record<string, unknown>;\n events?: NonNullable<ActionResult['events']>;\n readBack?: Record<string, unknown>;\n error?: string | { message: string; code?: string };\n}\n\nexport interface ActionReadBackResolverInput {\n blockId: string;\n runtime: FlowNodeRuntimeState;\n output: Record<string, unknown>;\n readBack: ActionReadBackMetadata;\n}\n\nexport type ActionReadBackResolver = (input: ActionReadBackResolverInput) => ActionReadBackResolution | Promise<ActionReadBackResolution>;\n\nexport interface ReconcileActionReadBackParams {\n editorOrYDoc?: EditorOrYDoc | null;\n blockId: string;\n actorDid?: string;\n runtime?: FlowRuntimeStateManager;\n document?: Array<{ id?: string; props?: Record<string, unknown> }>;\n resolver?: ActionReadBackResolver;\n resolvers?: Record<string, ActionReadBackResolver>;\n runEventLog?: RunEventAppender;\n now?: () => number;\n /**\n * The **session run** (`runs.ts`) this reconciliation writes into — not the\n * per-execution audit id. Multi-run documents require this explicitly; only\n * legacy documents retain the advisory active-run fallback.\n *\n * D2: every new parameter named `runId` means the session run.\n */\n runId?: string;\n}\n\nexport interface ReconcileActionReadBackResult {\n success: boolean;\n blockId: string;\n state: ReadBackTerminalState;\n output?: Record<string, unknown>;\n events: NonNullable<ActionResult['events']>;\n error?: string;\n /**\n * Id of the audit record this reconciliation wrote (`readback-<ts>-<rand>`).\n *\n * @deprecated Use {@link ReconcileActionReadBackResult.executionId}; both\n * carry the same value. The persisted `RunRecordDetails.runId` is never\n * renamed (D2).\n */\n runId?: string;\n /** Forward name for the per-execution audit id. Identical to {@link runId}. */\n executionId?: string;\n pendingInvocationRemoved: boolean;\n readBack?: ActionReadBackMetadata;\n}\n\nasync function appendReadBackTimeline(\n eventLog: RunEventAppender | undefined,\n event: RunEventInput,\n runtime: FlowRuntimeStateManager,\n blockId: string,\n now: () => number\n): Promise<boolean> {\n const result = await appendRunTimelineEvent({\n eventLog,\n event,\n runtime,\n blockId,\n now,\n });\n return result.ok;\n}\n\nfunction isYDoc(value: unknown): value is Y.Doc {\n return value instanceof Y.Doc;\n}\n\nfunction getYDoc(editorOrYDoc?: EditorOrYDoc | null): Y.Doc | undefined {\n if (!editorOrYDoc) return undefined;\n if (isYDoc(editorOrYDoc)) return editorOrYDoc;\n return (editorOrYDoc as { _yDoc?: Y.Doc })._yDoc;\n}\n\nfunction getEditor(editorOrYDoc?: EditorOrYDoc | null): IxoEditorType | undefined {\n return editorOrYDoc && !isYDoc(editorOrYDoc) ? editorOrYDoc : undefined;\n}\n\n/**\n * IGNITION PHASE A: run-scoped runtime manager, so every write below\n * dual-writes the run entry and the flat mirror in one transaction.\n *\n * This path is the sharpest instance of why that matters. The read-back\n * failure branches — `state: 'failed'` and the `PROOF_MISSING` branch — are\n * **downgrades from `awaiting_readback`**, and they deliberately do *not*\n * restamp `executedAt`. Written flat-only they are invisible to the freshness\n * predicate in both directions: rule (a) keeps the started run entry, and with\n * no fresher `executedAt` rule (b) never fires either. The run would report\n * `awaiting_readback` with `error: undefined` forever, in a live room, with no\n * repair possible. The proof-failure test in `runs.test.ts` pins exactly this.\n */\nfunction getRuntime(editorOrYDoc?: EditorOrYDoc | null, runtime?: FlowRuntimeStateManager, runId?: string): FlowRuntimeStateManager {\n if (runtime) return runtime;\n const yDoc = getYDoc(editorOrYDoc);\n if (yDoc) return createRunScopedRuntimeManager(yDoc, resolveRunIdForExecution(yDoc, runId));\n return createRuntimeStateManager(!isYDoc(editorOrYDoc) ? editorOrYDoc : undefined);\n}\n\n/**\n * Synthetic editor for `reconcilePendingInvocations` on the headless path.\n * `_yRuntime` is a **read-only, run-scoped** reader — never the raw flat map\n * it used to be. See `actionExecutor.ts#getReconcileEditor`.\n */\nfunction getReconcileEditor(params: ReconcileActionReadBackParams, yDoc: Y.Doc | undefined, editor: IxoEditorType | undefined): IxoEditorType | undefined {\n if (editor) return editor;\n if (!yDoc || !params.document) return undefined;\n return {\n _yDoc: yDoc,\n _yRuntime: createRunRuntimeReaderWithDoc(yDoc, resolveRunIdForExecution(yDoc, params.runId)),\n document: params.document,\n } as unknown as IxoEditorType;\n}\n\n/**\n * Mint the per-execution audit id for a reconciliation record\n * (`RunRecordDetails.runId`). Not the session run — see D2.\n */\nfunction makeExecutionId(now: () => number): string {\n return `readback-${now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction asOutput(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? { ...(value as Record<string, unknown>) } : {};\n}\n\nfunction boundActionEvents(events: NonNullable<ActionResult['events']>): NonNullable<ActionResult['events']> {\n return events.map((event) => ({\n name: event.name,\n payload: boundRunEventJson(event.payload) as Record<string, unknown>,\n }));\n}\n\nfunction errorRecord(error: string | { message: string; code?: string } | undefined): { message: string; code?: string } | undefined {\n if (!error) return undefined;\n return typeof error === 'string' ? { message: error } : { message: error.message, code: error.code };\n}\n\nexport function normalizeActionReadBackMetadata(params: NormalizeReadBackMetadataParams): ActionReadBackMetadata {\n const base = params.readBack && typeof params.readBack === 'object' && !Array.isArray(params.readBack) ? { ...params.readBack } : {};\n const kind = typeof base.kind === 'string' && base.kind.trim() ? base.kind.trim() : params.actionType;\n\n const normalized: ActionReadBackMetadata = {\n ...base,\n kind,\n status: 'pending',\n requestedAt: typeof base.requestedAt === 'string' ? base.requestedAt : new Date(params.requestedAt).toISOString(),\n blockId: params.blockId,\n actionType: params.actionType,\n actorDid: params.actorDid,\n invocationCid: params.invocationCid,\n capabilityId: params.capabilityId,\n };\n\n if (params.pendingInvocation) {\n normalized.pendingInvocation = {\n id: params.pendingInvocation.id,\n triggeringBlockId: params.pendingInvocation.triggeringBlockId,\n eventName: params.pendingInvocation.eventName,\n sourceRunId: params.pendingInvocation.sourceRunId,\n };\n }\n\n return normalized;\n}\n\nfunction writeReconciliationRunRecord(params: {\n yDoc?: Y.Doc;\n editor?: IxoEditorType;\n blockId: string;\n actorDid: string;\n output: Record<string, unknown>;\n events: NonNullable<ActionResult['events']>;\n readBack: ActionReadBackMetadata;\n error?: { message: string; code?: string };\n now: () => number;\n /** Session run (`runs.ts`), recorded additively for Phase B attribution. */\n sessionRunId?: string;\n}): string | undefined {\n if (!params.yDoc) return undefined;\n\n const completedAt = params.now();\n const executionId = makeExecutionId(params.now);\n const pendingInvocation = params.readBack.pendingInvocation;\n const details: RunRecordDetails = {\n runId: executionId,\n sessionRunId: params.sessionRunId,\n output: params.output,\n events: params.events,\n startedAt: params.readBack.requestedAt || new Date(completedAt).toISOString(),\n completedAt: new Date(completedAt).toISOString(),\n actorDid: params.actorDid,\n invocationCid: params.readBack.invocationCid,\n capabilityId: params.readBack.capabilityId,\n error: params.error,\n readBack: params.readBack,\n reconciled: true,\n };\n\n if (pendingInvocation) {\n details.fromPendingInvocationId = pendingInvocation.id;\n details.triggeredBy = {\n sourceBlockId: pendingInvocation.triggeringBlockId,\n eventName: pendingInvocation.eventName,\n };\n details.sourceRunId = pendingInvocation.sourceRunId;\n }\n\n appendRunRecord(params.yDoc, params.blockId, details, params.actorDid);\n if (params.editor && params.events.length > 0) {\n reconcilePendingInvocations(params.editor, params.sessionRunId);\n }\n return executionId;\n}\n\nexport async function reconcileActionReadBack(params: ReconcileActionReadBackParams): Promise<ReconcileActionReadBackResult> {\n const now = params.now || Date.now;\n const yDoc = getYDoc(params.editorOrYDoc);\n const editor = getEditor(params.editorOrYDoc);\n const eventLog = params.runEventLog || editor?._runEventLog;\n const sessionRunId = yDoc ? resolveRunIdForExecution(yDoc, params.runId) : params.runId;\n const runtime = getRuntime(params.editorOrYDoc, params.runtime, sessionRunId);\n const current = runtime.get(params.blockId);\n const output = asOutput(current.output);\n const readBack = current.readBack;\n const timelineRequired = Boolean(yDoc && !usesLegacyRuntimeCompatibility(yDoc));\n\n if (timelineRequired && !eventLog) {\n return {\n success: false,\n blockId: params.blockId,\n state: 'pending',\n output,\n events: [],\n error: 'Read-back was not reconciled because a canonical run event log is required.',\n pendingInvocationRemoved: false,\n readBack,\n };\n }\n\n if (current.state !== 'awaiting_readback' || !readBack?.kind) {\n return {\n success: false,\n blockId: params.blockId,\n state: current.state === 'failed' ? 'failed' : 'pending',\n output,\n events: [],\n error: `Block \"${params.blockId}\" is not awaiting read-back`,\n pendingInvocationRemoved: false,\n readBack,\n };\n }\n\n const resolver = params.resolver || params.resolvers?.[readBack.kind];\n if (!resolver) {\n return {\n success: false,\n blockId: params.blockId,\n state: 'pending',\n output,\n events: [],\n error: `No read-back resolver registered for \"${readBack.kind}\"`,\n pendingInvocationRemoved: false,\n readBack,\n };\n }\n\n const resolution = await resolver({\n blockId: params.blockId,\n runtime: current,\n output,\n readBack,\n });\n const checkedAt = now();\n const checkedIso = new Date(checkedAt).toISOString();\n const nextReadBack: ActionReadBackMetadata = {\n ...readBack,\n ...(resolution.readBack || {}),\n status: resolution.state,\n lastCheckedAt: checkedIso,\n };\n\n if (resolution.state === 'pending') {\n runtime.update(params.blockId, {\n readBack: nextReadBack,\n });\n return {\n success: true,\n blockId: params.blockId,\n state: 'pending',\n output,\n events: resolution.events || [],\n pendingInvocationRemoved: false,\n readBack: nextReadBack,\n };\n }\n\n const events = boundActionEvents(resolution.events || []);\n const mergedOutput = {\n ...output,\n ...(resolution.output || {}),\n };\n const boundedOutput = boundRunActionOutput(mergedOutput);\n const finalOutput = boundedOutput.output;\n const actorDid = params.actorDid || readBack.actorDid || current.executedByDid || 'system:readback';\n\n if (resolution.state === 'failed') {\n const error = errorRecord(resolution.error) || { message: 'External read-back failed' };\n const failedReadBack = {\n ...nextReadBack,\n terminalAt: checkedIso,\n };\n runtime.update(params.blockId, {\n state: 'failed',\n output: finalOutput,\n error: { ...error, at: checkedAt },\n readBack: failedReadBack,\n });\n const executionId = writeReconciliationRunRecord({\n yDoc,\n editor: getReconcileEditor(params, yDoc, editor),\n sessionRunId,\n blockId: params.blockId,\n actorDid,\n output: finalOutput,\n events,\n readBack: failedReadBack,\n error,\n now,\n });\n if (sessionRunId && eventLog) {\n const timelineExecutionId = current.executionId || executionId || readBack.requestedAt || `readback-${checkedAt}`;\n await appendReadBackTimeline(\n eventLog,\n {\n runId: sessionRunId,\n blockId: params.blockId,\n kind: 'action.failed',\n payload: {\n attempt: current.attempt || 1,\n executionId: timelineExecutionId,\n ...(current.executionStartedAt ? { durationMs: Math.max(0, checkedAt - current.executionStartedAt) } : {}),\n error: {\n message: error.message,\n ...(error.code ? { code: error.code } : {}),\n },\n },\n idempotencyKey: createRunEventIdempotencyKey('action.failed', sessionRunId, params.blockId, timelineExecutionId, 'readback'),\n ts: checkedAt,\n },\n runtime,\n params.blockId,\n now\n );\n }\n return {\n success: false,\n blockId: params.blockId,\n state: 'failed',\n output: finalOutput,\n events,\n error: error.message,\n runId: executionId,\n executionId,\n pendingInvocationRemoved: false,\n readBack: failedReadBack,\n };\n }\n\n // Terminal read-back completion is a `completed` write like any other:\n // the resolver's final output must satisfy the action's proof declaration.\n const readBackActionType = (readBack as { actionType?: string }).actionType || readBack.kind;\n const actionDef = readBackActionType ? getAction(readBackActionType) : undefined;\n if (actionDef) {\n const proofCheck = validateActionProof(actionDef, mergedOutput);\n if (!proofCheck.valid) {\n const message = proofCheck.reason || 'Read-back resolved completed without proof of execution.';\n const proofFailedReadBack = {\n ...nextReadBack,\n terminalAt: checkedIso,\n };\n // Side-effecting proof failure → `needs_verification`, never a silently\n // retryable `failed` (H1). Payload (finalOutput) is already retained.\n runtime.update(params.blockId, {\n state: actionDef.sideEffect ? 'needs_verification' : 'failed',\n output: finalOutput,\n error: { message, code: PROOF_MISSING_CODE, at: checkedAt },\n readBack: proofFailedReadBack,\n });\n const failedExecutionId = writeReconciliationRunRecord({\n yDoc,\n editor: getReconcileEditor(params, yDoc, editor),\n sessionRunId,\n blockId: params.blockId,\n actorDid,\n output: finalOutput,\n events,\n readBack: proofFailedReadBack,\n error: { message, code: PROOF_MISSING_CODE },\n now,\n });\n if (sessionRunId && eventLog) {\n const timelineExecutionId = current.executionId || failedExecutionId || readBack.requestedAt || `readback-${checkedAt}`;\n await appendReadBackTimeline(\n eventLog,\n {\n runId: sessionRunId,\n blockId: params.blockId,\n kind: 'action.failed',\n payload: {\n attempt: current.attempt || 1,\n executionId: timelineExecutionId,\n ...(current.executionStartedAt ? { durationMs: Math.max(0, checkedAt - current.executionStartedAt) } : {}),\n error: { message, code: PROOF_MISSING_CODE },\n },\n idempotencyKey: createRunEventIdempotencyKey('action.failed', sessionRunId, params.blockId, timelineExecutionId, 'readback'),\n ts: checkedAt,\n },\n runtime,\n params.blockId,\n now\n );\n }\n return {\n success: false,\n blockId: params.blockId,\n state: 'failed',\n output: finalOutput,\n events,\n error: message,\n runId: failedExecutionId,\n executionId: failedExecutionId,\n pendingInvocationRemoved: false,\n readBack: proofFailedReadBack,\n };\n }\n }\n\n if (boundedOutput.exceeded) {\n const message = `Read-back output exceeded the ${MAX_RUN_ACTION_OUTPUT_BYTES / 1024} KiB run-head limit.`;\n const oversizedReadBack = {\n ...nextReadBack,\n terminalAt: checkedIso,\n };\n runtime.update(params.blockId, {\n state: actionDef?.sideEffect === false ? 'failed' : 'needs_verification',\n output: finalOutput,\n error: {\n message,\n code: 'RUN_OUTPUT_TOO_LARGE',\n at: checkedAt,\n data: { byteLength: boundedOutput.byteLength },\n },\n readBack: oversizedReadBack,\n });\n const oversizedExecutionId = writeReconciliationRunRecord({\n yDoc,\n editor: getReconcileEditor(params, yDoc, editor),\n sessionRunId,\n blockId: params.blockId,\n actorDid,\n output: finalOutput,\n events,\n readBack: oversizedReadBack,\n error: { message, code: 'RUN_OUTPUT_TOO_LARGE' },\n now,\n });\n if (sessionRunId && eventLog) {\n const attempt = current.attempt || 1;\n const timelineExecutionId = current.executionId || oversizedExecutionId || readBack.requestedAt || `readback-${checkedAt}`;\n await appendRunTimelineEvents({\n eventLog,\n events: [\n {\n runId: sessionRunId,\n blockId: params.blockId,\n kind: 'action.output',\n payload: {\n attempt,\n executionId: timelineExecutionId,\n output: boundRunEventJson(finalOutput),\n },\n idempotencyKey: createRunEventIdempotencyKey('action.output', sessionRunId, params.blockId, timelineExecutionId, 'readback'),\n ts: checkedAt,\n },\n {\n runId: sessionRunId,\n blockId: params.blockId,\n kind: 'action.failed',\n payload: {\n attempt,\n executionId: timelineExecutionId,\n ...(current.executionStartedAt\n ? {\n durationMs: Math.max(0, checkedAt - current.executionStartedAt),\n }\n : {}),\n error: {\n message,\n code: 'RUN_OUTPUT_TOO_LARGE',\n details: {\n byteLength: boundedOutput.byteLength,\n maxBytes: MAX_RUN_ACTION_OUTPUT_BYTES,\n },\n },\n },\n idempotencyKey: createRunEventIdempotencyKey('action.failed', sessionRunId, params.blockId, timelineExecutionId, 'readback'),\n ts: checkedAt,\n },\n ],\n runtime,\n blockId: params.blockId,\n now,\n });\n }\n return {\n success: false,\n blockId: params.blockId,\n state: 'failed',\n output: finalOutput,\n events,\n error: message,\n runId: oversizedExecutionId,\n executionId: oversizedExecutionId,\n pendingInvocationRemoved: false,\n readBack: oversizedReadBack,\n };\n }\n\n const completedReadBack = {\n ...nextReadBack,\n terminalAt: checkedIso,\n };\n runtime.update(params.blockId, {\n state: 'completed',\n output: finalOutput,\n executedAt: checkedAt,\n error: undefined,\n readBack: completedReadBack,\n });\n const executionId = writeReconciliationRunRecord({\n yDoc,\n editor: getReconcileEditor(params, yDoc, editor),\n sessionRunId,\n blockId: params.blockId,\n actorDid,\n output: finalOutput,\n events,\n readBack: completedReadBack,\n now,\n });\n let timelineComplete = true;\n if (sessionRunId && eventLog) {\n const attempt = current.attempt || 1;\n const timelineExecutionId = current.executionId || executionId || readBack.requestedAt || `readback-${checkedAt}`;\n const timelineResult = await appendRunTimelineEvents({\n eventLog,\n events: [\n {\n runId: sessionRunId,\n blockId: params.blockId,\n kind: 'action.output',\n payload: {\n attempt,\n executionId: timelineExecutionId,\n output: boundRunEventJson(finalOutput),\n },\n idempotencyKey: createRunEventIdempotencyKey('action.output', sessionRunId, params.blockId, timelineExecutionId, 'readback'),\n ts: checkedAt,\n },\n {\n runId: sessionRunId,\n blockId: params.blockId,\n kind: 'action.done',\n payload: {\n attempt,\n executionId: timelineExecutionId,\n ...(current.executionStartedAt\n ? {\n durationMs: Math.max(0, checkedAt - current.executionStartedAt),\n }\n : {}),\n },\n idempotencyKey: createRunEventIdempotencyKey('action.done', sessionRunId, params.blockId, timelineExecutionId, 'readback'),\n ts: checkedAt,\n },\n ],\n runtime,\n blockId: params.blockId,\n now,\n });\n timelineComplete = timelineResult.ok && timelineResult.remaining === 0;\n }\n const pendingInvocationRemoved =\n timelineComplete &&\n Boolean(yDoc && completedReadBack.pendingInvocation?.id) &&\n removePendingInvocation(yDoc!, params.blockId, completedReadBack.pendingInvocation!.id, sessionRunId);\n\n return {\n success: timelineComplete,\n blockId: params.blockId,\n state: 'completed',\n output: finalOutput,\n events,\n ...(!timelineComplete ? { error: 'Canonical run history replay remains incomplete.' } : {}),\n runId: executionId,\n executionId,\n pendingInvocationRemoved,\n readBack: completedReadBack,\n };\n}\n","import * as Y from 'yjs';\nimport { getAction } from '../actionRegistry';\nimport type { ActionHandlers, ActionResult, ActionServices } from '../actionRegistry/types';\nimport type { InvocationStore } from '../invocationStore';\nimport { resolveRuntimeRefs, type TriggerResolutionContext } from '../flowCompiler/resolveRefs';\nimport type { UcanService } from '../../services/ucanService';\nimport type { FlowNodeRuntimeState, NodeState } from '../../types/authorization';\nimport type { FlowRuntimeStateManager } from './runtime';\nimport { createRuntimeStateManager } from './runtime';\nimport { assertRunActionExecutionAllowed, createRunRuntimeReaderWithDoc, createRunScopedRuntimeManager, resolveRunIdForExecution, usesLegacyRuntimeCompatibility } from './runs';\nimport { executeNode, type ExecutionOutcome, type NodeActionResult } from './executor';\nimport { reconcilePendingInvocations } from './reconcile';\nimport { appendRunRecord, readPendingInvocations, removePendingInvocation, type PendingInvocation, type RunRecordDetails } from './triggers';\nimport { buildFlowNodeFromBlock } from './utils';\nimport { normalizeActionReadBackMetadata } from './readBackReconciler';\nimport { PROOF_MISSING_CODE, validateActionProof } from './proof';\nimport { warnOnce } from '../warnOnce';\nimport type { IxoEditorType } from '../../types/editor';\nimport type { RunEventAppender, RunEventInput } from './runLifecycle';\nimport { appendRunTimelineEvent, appendRunTimelineEvents, boundRunActionOutput, boundRunEventJson, createRunEventIdempotencyKey, MAX_RUN_ACTION_OUTPUT_BYTES } from './runTimeline';\nimport { evaluateBlockExecutionEligibilityForRun, parseConditionConfigStrict } from './conditions';\n\nexport type ActionBlockLike = {\n id?: string;\n props?: Record<string, unknown>;\n};\n\ntype EditorOrYDoc = IxoEditorType | Y.Doc;\n\nexport interface BuildActionRunInputsParams {\n editorOrYDoc?: EditorOrYDoc | null;\n block?: ActionBlockLike | null;\n blockId?: string;\n document?: ActionBlockLike[];\n runtime?: FlowRuntimeStateManager;\n savedInputs?: unknown;\n runtimeInputs?: Record<string, unknown>;\n pendingInvocationId?: string;\n /**\n * The **session run** this execution belongs to (`runs.ts`), not the\n * per-execution audit id. Defaults to `resolveActiveRunId(yDoc)`, which is a\n * constant in Phase A.\n *\n * D2: every *new* parameter named `runId` means the session run. The\n * execution-scoped id keeps its historical name only where it is already\n * persisted (`RunRecordDetails.runId`), and is surfaced going forward as\n * {@link ExecuteActionBlockResult.executionId}.\n */\n runId?: string;\n}\n\nexport interface BuildActionRunInputsResult {\n inputs: Record<string, unknown>;\n savedInputs: Record<string, unknown>;\n mergedInputs: Record<string, unknown>;\n pendingInvocation?: PendingInvocation;\n triggerContext?: TriggerResolutionContext;\n}\n\nexport type ActionExecutionCompletionState = 'completed' | 'failed' | 'awaiting_readback' | 'needs_verification';\n\nexport interface ExecuteActionBlockParams extends BuildActionRunInputsParams {\n actorDid: string;\n actorType: 'entity' | 'user';\n entityRoomId?: string;\n ucanService?: UcanService;\n invocationStore?: InvocationStore;\n services?: ActionServices;\n handlers?: ActionHandlers;\n runEventLog?: RunEventAppender;\n pin?: string;\n now?: () => number;\n flowUri?: string;\n flowId?: string;\n flowOwnerDid?: string;\n schemaVersion?: string;\n}\n\nexport interface ExecuteActionBlockResult {\n success: boolean;\n stage: ExecutionOutcome['stage'] | 'input' | 'action_lookup';\n blockId: string;\n actionType?: string;\n output?: Record<string, unknown>;\n events: NonNullable<ActionResult['events']>;\n error?: string;\n invocationCid?: string;\n capabilityId?: string;\n /**\n * Id of the audit record this execution wrote (`run-<ts>-<rand>`).\n *\n * @deprecated Use {@link ExecuteActionBlockResult.executionId}. Both fields\n * carry the same value and both stay populated — `flow-manager` and\n * `flow-agent` read `runId` today, and `RunRecordDetails.runId` is persisted\n * live data feeding `computePendingInvocationId`, so the *stored* name is\n * never renamed.\n *\n * PHASE A COMPAT — REMOVAL TRIGGER: Phase B, once both orchestrators read\n * `executionId` (compat register item 8).\n */\n runId?: string;\n /**\n * Forward name for the per-execution audit id. Identical to {@link runId}.\n *\n * D2: bare `runId` now means the *session* run everywhere in new code, so the\n * execution id gets an unambiguous name rather than the persisted one being\n * renamed out from under live rooms.\n */\n executionId?: string;\n pendingInvocationRemoved?: boolean;\n completionState: ActionExecutionCompletionState;\n pendingInvocation?: PendingInvocation;\n}\n\nfunction isYDoc(value: unknown): value is Y.Doc {\n return value instanceof Y.Doc;\n}\n\nfunction getYDoc(editorOrYDoc?: EditorOrYDoc | null): Y.Doc | undefined {\n if (!editorOrYDoc) return undefined;\n if (isYDoc(editorOrYDoc)) return editorOrYDoc;\n return (editorOrYDoc as { _yDoc?: Y.Doc })._yDoc;\n}\n\nfunction parseInputs(value: unknown): Record<string, unknown> {\n if (value == null || value === '') return {};\n if (typeof value === 'object' && !Array.isArray(value)) return { ...(value as Record<string, unknown>) };\n if (typeof value !== 'string') return {};\n\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? (parsed as Record<string, unknown>) : {};\n } catch {\n warnOnce(`executor-inputs-parse:${value}`, `[flow-config] saved block inputs are not valid JSON; treated as empty`);\n return {};\n }\n}\n\n/**\n * IGNITION PHASE A: resolve the runtime manager for a session run.\n *\n * When a Y.Doc is reachable this is the run-scoped manager, so every\n * `runtime.update(...)` below — including the `needs_verification` /\n * `PROOF_MISSING` write, which is a *downgrade* — lands in the run entry and\n * the flat mirror in one transaction. A downgrade written flat-only can never\n * be materialised into the run (the freshness predicate refuses it), which is\n * precisely the state that strands forever once adoption is on (§9.3).\n */\nfunction getRuntime(editorOrYDoc?: EditorOrYDoc | null, runtime?: FlowRuntimeStateManager, runId?: string): FlowRuntimeStateManager {\n if (runtime) return runtime;\n const yDoc = getYDoc(editorOrYDoc);\n if (yDoc) {\n return createRunScopedRuntimeManager(yDoc, resolveRunIdForExecution(yDoc, runId));\n }\n return createRuntimeStateManager(!isYDoc(editorOrYDoc) ? editorOrYDoc : undefined);\n}\n\nfunction getEditor(editorOrYDoc?: EditorOrYDoc | null): IxoEditorType | undefined {\n return editorOrYDoc && !isYDoc(editorOrYDoc) ? editorOrYDoc : undefined;\n}\n\nfunction findBlock(params: Pick<ExecuteActionBlockParams, 'block' | 'blockId' | 'editorOrYDoc' | 'document'>): ActionBlockLike | undefined {\n if (params.block) return params.block;\n const blockId = params.blockId;\n if (!blockId) return undefined;\n const editor = getEditor(params.editorOrYDoc);\n const visit = (blocks: ActionBlockLike[]): ActionBlockLike | undefined => {\n for (const block of blocks) {\n if (block?.id === blockId) return block;\n const nested = (block as ActionBlockLike & { children?: ActionBlockLike[] })?.children;\n if (Array.isArray(nested)) {\n const found = visit(nested);\n if (found) return found;\n }\n }\n return undefined;\n };\n return visit(params.document || (editor?.document as ActionBlockLike[]) || []);\n}\n\nfunction getFlowMetadata(editor?: IxoEditorType): { flowId: string; flowUri: string; flowOwnerDid: string; schemaVersion: string } {\n const metadata = editor?.getFlowMetadata?.();\n const flowId = metadata?.doc_id || '';\n return {\n flowId,\n flowUri: flowId ? `ixo:flow:${flowId}` : '',\n flowOwnerDid: editor?.getFlowOwnerDid?.() || metadata?.flowOwnerDid || '',\n schemaVersion: metadata?.schema_version || '0.3',\n };\n}\n\nfunction getPendingInvocation(yDoc: Y.Doc | undefined, blockId: string | undefined, pendingInvocationId: string | undefined, sessionRunId?: string): PendingInvocation | undefined {\n if (!pendingInvocationId) return undefined;\n if (!yDoc) {\n throw new Error(`Cannot load pending invocation \"${pendingInvocationId}\" without a Y.Doc`);\n }\n if (!blockId) {\n throw new Error(`Cannot load pending invocation \"${pendingInvocationId}\" without a block id`);\n }\n\n const pending = readPendingInvocations(yDoc, blockId, sessionRunId).find((invocation) => invocation.id === pendingInvocationId);\n if (!pending) {\n throw new Error(`Pending invocation \"${pendingInvocationId}\" was not found for block \"${blockId}\"`);\n }\n return pending;\n}\n\nfunction getNodeOutput(runtime: FlowRuntimeStateManager, nodeId: string): Record<string, unknown> | undefined {\n const state = runtime.get(nodeId);\n const output = state.output;\n return output && typeof output === 'object' && !Array.isArray(output) ? output : undefined;\n}\n\nexport function buildActionRunInputs(params: BuildActionRunInputsParams): BuildActionRunInputsResult {\n const blockId = params.blockId || params.block?.id;\n const yDoc = getYDoc(params.editorOrYDoc);\n const runtime = getRuntime(params.editorOrYDoc, params.runtime, params.runId);\n const savedInputs = parseInputs(params.savedInputs ?? params.block?.props?.inputs);\n const pendingInvocation = getPendingInvocation(yDoc, blockId, params.pendingInvocationId, params.runId);\n\n const triggerContext = pendingInvocation\n ? {\n payload: pendingInvocation.payload || {},\n refSnapshots: pendingInvocation.refSnapshots || {},\n }\n : undefined;\n\n const mergedInputs = {\n ...savedInputs,\n ...(pendingInvocation?.payload || {}),\n ...(pendingInvocation?.refSnapshots || {}),\n ...(params.runtimeInputs || {}),\n };\n\n return {\n inputs: resolveRuntimeRefs(mergedInputs, (nodeId) => getNodeOutput(runtime, nodeId), triggerContext),\n savedInputs,\n mergedInputs,\n pendingInvocation,\n triggerContext,\n };\n}\n\nfunction buildFailureResult(params: {\n blockId: string;\n actionType?: string;\n stage: ExecuteActionBlockResult['stage'];\n error: string;\n pendingInvocation?: PendingInvocation;\n}): ExecuteActionBlockResult {\n return {\n success: false,\n stage: params.stage,\n blockId: params.blockId,\n actionType: params.actionType,\n events: [],\n error: params.error,\n completionState: 'failed',\n pendingInvocation: params.pendingInvocation,\n };\n}\n\nfunction updateRuntimeFailure(runtime: FlowRuntimeStateManager, blockId: string, message: string, now: () => number): void {\n runtime.update(blockId, {\n state: 'failed',\n error: { message, at: now() },\n } as Partial<FlowNodeRuntimeState>);\n}\n\n/**\n * Mint the **per-execution audit id** (`RunRecordDetails.runId`).\n *\n * D2: this is the pre-existing meaning of `runId` in this codebase and it is\n * load-bearing — it is the `sourceRunId` component of\n * `computePendingInvocationId`, a deterministic hash over live data. The format\n * and the persisted field name must not change. New code calls it the\n * *execution* id to keep `runId` free for the session run.\n */\nfunction makeExecutionId(now: () => number): string {\n return `run-${now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * The synthetic editor handed to `reconcilePendingInvocations` on the headless\n * path.\n *\n * `_yRuntime` used to be `yDoc.getMap('runtime')` — a raw flat-map handle that\n * `reconcile.ts` both read and wrote through, i.e. a runtime writer outside the\n * waist that no grep for `runtimeMap.set` in this file would ever surface. It\n * is now a **read-only, run-scoped** reader (`runs.ts`); reconciliation writes\n * through `writeActionState` against the doc instead.\n */\nfunction getReconcileEditor(params: ExecuteActionBlockParams, yDoc: Y.Doc | undefined, editor: IxoEditorType | undefined): IxoEditorType | undefined {\n if (editor) return editor;\n if (!yDoc || !params.document) return undefined;\n return {\n _yDoc: yDoc,\n _yRuntime: createRunRuntimeReaderWithDoc(yDoc, resolveRunIdForExecution(yDoc, params.runId)),\n document: params.document,\n } as unknown as IxoEditorType;\n}\n\nfunction persistEvents(params: {\n yDoc?: Y.Doc;\n editor?: IxoEditorType;\n blockId: string;\n actorDid: string;\n output: Record<string, unknown>;\n events: NonNullable<ActionResult['events']>;\n invocationCid?: string;\n capabilityId?: string;\n pendingInvocation?: PendingInvocation;\n startedAt: number;\n completedAt: number;\n now: () => number;\n executionId: string;\n /** Session run (`runs.ts`), recorded additively for Phase B attribution. */\n sessionRunId?: string;\n}): string | undefined {\n if (!params.yDoc || params.events.length === 0) return undefined;\n\n const details: RunRecordDetails = {\n runId: params.executionId,\n sessionRunId: params.sessionRunId,\n output: params.output,\n events: params.events,\n startedAt: new Date(params.startedAt).toISOString(),\n completedAt: new Date(params.completedAt).toISOString(),\n actorDid: params.actorDid,\n invocationCid: params.invocationCid,\n capabilityId: params.capabilityId,\n };\n\n if (params.pendingInvocation) {\n details.fromPendingInvocationId = params.pendingInvocation.id;\n details.triggeredBy = {\n sourceBlockId: params.pendingInvocation.triggeringBlockId,\n eventName: params.pendingInvocation.eventName,\n };\n details.sourceRunId = params.pendingInvocation.sourceRunId;\n }\n\n appendRunRecord(params.yDoc, params.blockId, details, params.actorDid);\n if (params.editor) {\n reconcilePendingInvocations(params.editor, params.sessionRunId);\n }\n return params.executionId;\n}\n\nfunction cleanupCompletedPendingInvocation(yDoc: Y.Doc | undefined, blockId: string, pendingInvocation: PendingInvocation | undefined, sessionRunId?: string): boolean {\n if (!yDoc || !pendingInvocation) return false;\n return removePendingInvocation(yDoc, blockId, pendingInvocation.id, sessionRunId || pendingInvocation.sessionRunId);\n}\n\nexport async function executeActionBlock(params: ExecuteActionBlockParams): Promise<ExecuteActionBlockResult> {\n const block = findBlock(params);\n const blockId = params.blockId || block?.id;\n const editor = getEditor(params.editorOrYDoc);\n const yDoc = getYDoc(params.editorOrYDoc);\n const now = params.now || Date.now;\n const eventLog = params.runEventLog || editor?._runEventLog;\n\n if (!block || !blockId) {\n return buildFailureResult({\n blockId: blockId || '',\n stage: 'input',\n error: blockId ? `Block \"${blockId}\" was not found` : 'executeActionBlock requires a blockId or block',\n });\n }\n\n let sessionRunId = params.runId;\n try {\n if (yDoc) {\n sessionRunId = resolveRunIdForExecution(yDoc, params.runId);\n assertRunActionExecutionAllowed(yDoc, sessionRunId, block);\n }\n } catch (error) {\n return buildFailureResult({\n blockId,\n stage: 'input',\n error: error instanceof Error ? error.message : 'The requested session run cannot execute this action.',\n });\n }\n\n const runtime = getRuntime(params.editorOrYDoc, params.runtime, sessionRunId);\n\n const actionType = typeof block.props?.actionType === 'string' ? block.props.actionType : undefined;\n if (!actionType) {\n updateRuntimeFailure(runtime, blockId, 'Action block is missing props.actionType', now);\n return buildFailureResult({\n blockId,\n stage: 'input',\n error: 'Action block is missing props.actionType',\n });\n }\n\n const action = getAction(actionType);\n if (!action) {\n const message = `No registered action found for ${actionType}`;\n updateRuntimeFailure(runtime, blockId, message, now);\n return buildFailureResult({ blockId, actionType, stage: 'action_lookup', error: message });\n }\n\n if (yDoc && sessionRunId) {\n const document = params.document || (editor?.document as ActionBlockLike[]) || [block];\n let eligibility;\n try {\n eligibility = evaluateBlockExecutionEligibilityForRun(parseConditionConfigStrict(block.props?.conditions), document, yDoc, sessionRunId);\n } catch (error) {\n return buildFailureResult({\n blockId,\n actionType,\n stage: 'input',\n error: error instanceof Error ? error.message : 'Block conditions are invalid.',\n });\n }\n if (!eligibility.eligible) {\n return buildFailureResult({\n blockId,\n actionType,\n stage: 'input',\n error: eligibility.message || 'Block conditions are not satisfied.',\n });\n }\n }\n\n let inputBuild: BuildActionRunInputsResult;\n try {\n inputBuild = buildActionRunInputs({ ...params, block, blockId, runtime });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to build action inputs';\n updateRuntimeFailure(runtime, blockId, message, now);\n return buildFailureResult({ blockId, actionType, stage: 'input', error: message });\n }\n\n const flowNode = buildFlowNodeFromBlock(block);\n const metadata = getFlowMetadata(editor);\n const flowId = params.flowId || metadata.flowId || blockId;\n const flowUri = params.flowUri || metadata.flowUri || `ixo:flow:${flowId}`;\n const flowOwnerDid = params.flowOwnerDid || metadata.flowOwnerDid;\n const schemaVersion = params.schemaVersion || metadata.schemaVersion;\n const events: NonNullable<ActionResult['events']> = [];\n let completionState: ActionExecutionCompletionState = 'completed';\n let readBack: Record<string, unknown> | undefined;\n let rawReadBack: Record<string, unknown> | undefined;\n let requestedAwaitingReadBack = false;\n let proofFailureReason: string | null = null;\n let proofFailureOutput: Record<string, unknown> | undefined;\n const startedAt = now();\n const previousState = runtime.get(blockId);\n const attempt = (previousState.attempt || 0) + 1;\n const executionId = makeExecutionId(now);\n\n const timelineRequired = !!yDoc && !usesLegacyRuntimeCompatibility(yDoc);\n if (sessionRunId && (eventLog || timelineRequired)) {\n const startedLogged = await appendRunTimelineEvent({\n eventLog,\n event: {\n runId: sessionRunId,\n blockId,\n kind: 'action.started',\n payload: {\n attempt,\n executionId,\n input: boundRunEventJson(inputBuild.inputs),\n },\n idempotencyKey: createRunEventIdempotencyKey('action.started', sessionRunId, blockId, executionId),\n ts: startedAt,\n },\n runtime,\n blockId,\n retainOnFailure: false,\n now,\n });\n if (!startedLogged.ok) {\n const message = 'Action was not executed because its run timeline could not be opened.';\n runtime.update(blockId, {\n state: 'failed',\n error: {\n message,\n code: 'RUN_EVENT_APPEND_FAILED',\n at: now(),\n data: startedLogged.error,\n },\n });\n return {\n ...buildFailureResult({ blockId, actionType, stage: 'action', error: message, pendingInvocation: inputBuild.pendingInvocation }),\n executionId,\n runId: executionId,\n };\n }\n }\n\n runtime.update(blockId, {\n state: 'running',\n output: undefined,\n error: undefined,\n executedByDid: params.actorDid,\n attempt,\n executionId,\n executionStartedAt: startedAt,\n } as Partial<FlowNodeRuntimeState>);\n\n const outcome = await executeNode({\n node: flowNode,\n actorDid: params.actorDid,\n actorType: params.actorType,\n entityRoomId: params.entityRoomId,\n context: {\n runtime,\n ucanService: params.ucanService || editor?.getUcanService?.() || undefined,\n invocationStore: params.invocationStore || editor?._invocationStore,\n flowUri,\n flowId,\n sessionRunId,\n flowOwnerDid,\n schemaVersion,\n now,\n },\n action: async (): Promise<NodeActionResult> => {\n const result = await action.run(inputBuild.inputs, {\n actorDid: params.actorDid,\n flowId,\n sessionRunId,\n flowUri,\n nodeId: blockId,\n flowNode,\n runtime,\n services: params.services || {},\n handlers: params.handlers,\n editor,\n yDoc,\n pendingInvocation: inputBuild.pendingInvocation,\n });\n if (result.events?.length) events.push(...result.events);\n if (result.completion?.state === 'awaiting_readback') {\n requestedAwaitingReadBack = true;\n rawReadBack = result.completion.readBack;\n } else {\n // Proof guard runs inside the action callback so that a proofless\n // success is recorded as a FAILED invocation by executeNode's catch\n // path — never as a success invocation followed by a failed runtime.\n const proofCheck = validateActionProof(action, (result.output as Record<string, unknown>) || {});\n if (!proofCheck.valid) {\n proofFailureReason = proofCheck.reason || 'Action returned success without proof of execution.';\n // Keep the handler payload: for a side-effecting action this is the\n // only evidence the effect may have happened (H1). It is retained on\n // runtime.output below instead of being discarded.\n proofFailureOutput = (result.output as Record<string, unknown>) || {};\n throw new Error(proofFailureReason);\n }\n }\n return {\n payload: result.output,\n submittedByDid: params.actorDid || undefined,\n };\n },\n pin: params.pin || '',\n });\n\n if (!outcome.success) {\n const message = outcome.error || 'Action execution failed';\n if (proofFailureReason) {\n // A side-effecting action that ran but couldn't prove it did is NOT a\n // clean failure: the effect may have happened (e.g. an on-chain tx that\n // landed under a differently-named field), so it must never be silently\n // auto-retried — that would double-execute. Route it to the\n // `needs_verification` dead-end and RETAIN the handler payload as\n // evidence for the human/automated verifier. A non-side-effecting proof\n // failure stays `failed` — re-running it is harmless. See H1.\n const proofFailureState: NodeState = action.sideEffect ? 'needs_verification' : 'failed';\n const boundedProofFailure = boundRunActionOutput(proofFailureOutput || {});\n runtime.update(blockId, {\n state: proofFailureState,\n output: boundedProofFailure.output,\n error: { message, code: PROOF_MISSING_CODE, at: now() },\n } as Partial<FlowNodeRuntimeState>);\n if (sessionRunId && (eventLog || timelineRequired)) {\n await appendRunTimelineEvent({\n eventLog,\n event: {\n runId: sessionRunId,\n blockId,\n kind: 'action.failed',\n payload: {\n attempt,\n executionId,\n durationMs: Math.max(0, now() - startedAt),\n error: { message, code: PROOF_MISSING_CODE },\n },\n idempotencyKey: createRunEventIdempotencyKey('action.failed', sessionRunId, blockId, executionId),\n ts: now(),\n },\n runtime,\n blockId,\n now,\n });\n }\n return {\n ...buildFailureResult({\n blockId,\n actionType,\n stage: outcome.stage,\n error: message,\n pendingInvocation: inputBuild.pendingInvocation,\n }),\n completionState: proofFailureState === 'needs_verification' ? 'needs_verification' : 'failed',\n output: proofFailureOutput,\n invocationCid: outcome.invocationCid,\n capabilityId: outcome.capabilityId,\n executionId,\n runId: executionId,\n };\n }\n updateRuntimeFailure(runtime, blockId, message, now);\n if (sessionRunId && (eventLog || timelineRequired)) {\n await appendRunTimelineEvent({\n eventLog,\n event: {\n runId: sessionRunId,\n blockId,\n kind: 'action.failed',\n payload: {\n attempt,\n executionId,\n durationMs: Math.max(0, now() - startedAt),\n error: { message },\n },\n idempotencyKey: createRunEventIdempotencyKey('action.failed', sessionRunId, blockId, executionId),\n ts: now(),\n },\n runtime,\n blockId,\n now,\n });\n }\n return {\n ...buildFailureResult({\n blockId,\n actionType,\n stage: outcome.stage,\n error: message,\n pendingInvocation: inputBuild.pendingInvocation,\n }),\n invocationCid: outcome.invocationCid,\n capabilityId: outcome.capabilityId,\n executionId,\n runId: executionId,\n };\n }\n\n const output = (outcome.result?.payload || {}) as Record<string, unknown>;\n const boundedOutput = boundRunActionOutput(output);\n const completedAt = now();\n if (requestedAwaitingReadBack) {\n completionState = 'awaiting_readback';\n readBack = normalizeActionReadBackMetadata({\n readBack: rawReadBack,\n blockId,\n actionType,\n actorDid: params.actorDid,\n invocationCid: outcome.invocationCid,\n capabilityId: outcome.capabilityId,\n requestedAt: startedAt,\n pendingInvocation: inputBuild.pendingInvocation,\n });\n }\n if (boundedOutput.exceeded) {\n completionState = action.sideEffect ? 'needs_verification' : 'failed';\n }\n runtime.update(blockId, {\n state: completionState,\n output: boundedOutput.output,\n executedByDid: params.actorDid,\n executedAt: completedAt,\n lastInvocationCid: outcome.invocationCid || outcome.capabilityId,\n readBack,\n ...(boundedOutput.exceeded\n ? {\n error: {\n message: `Action output exceeded the ${MAX_RUN_ACTION_OUTPUT_BYTES / 1024} KiB run-head limit.`,\n code: 'RUN_OUTPUT_TOO_LARGE',\n at: completedAt,\n data: { byteLength: boundedOutput.byteLength },\n },\n }\n : { error: undefined }),\n } as Partial<FlowNodeRuntimeState>);\n persistEvents({\n yDoc,\n editor: getReconcileEditor(params, yDoc, editor),\n sessionRunId,\n blockId,\n actorDid: params.actorDid,\n output: boundedOutput.output,\n events,\n invocationCid: outcome.invocationCid,\n capabilityId: outcome.capabilityId,\n pendingInvocation: inputBuild.pendingInvocation,\n startedAt,\n completedAt,\n now,\n executionId,\n });\n if (sessionRunId && (eventLog || timelineRequired)) {\n const timelineEvents: RunEventInput[] = [\n {\n runId: sessionRunId,\n blockId,\n kind: 'action.output',\n payload: {\n attempt,\n executionId,\n output: boundRunEventJson(boundedOutput.output),\n },\n idempotencyKey: createRunEventIdempotencyKey('action.output', sessionRunId, blockId, executionId, 1),\n ts: completedAt,\n },\n ];\n if (completionState === 'completed') {\n timelineEvents.push({\n runId: sessionRunId,\n blockId,\n kind: 'action.done',\n payload: {\n attempt,\n executionId,\n durationMs: Math.max(0, completedAt - startedAt),\n },\n idempotencyKey: createRunEventIdempotencyKey('action.done', sessionRunId, blockId, executionId),\n ts: completedAt,\n });\n } else if (boundedOutput.exceeded) {\n timelineEvents.push({\n runId: sessionRunId,\n blockId,\n kind: 'action.failed',\n payload: {\n attempt,\n executionId,\n durationMs: Math.max(0, completedAt - startedAt),\n error: {\n message: `Action output exceeded the ${MAX_RUN_ACTION_OUTPUT_BYTES / 1024} KiB run-head limit.`,\n code: 'RUN_OUTPUT_TOO_LARGE',\n details: {\n byteLength: boundedOutput.byteLength,\n maxBytes: MAX_RUN_ACTION_OUTPUT_BYTES,\n },\n },\n },\n idempotencyKey: createRunEventIdempotencyKey('action.failed', sessionRunId, blockId, executionId),\n ts: completedAt,\n });\n }\n await appendRunTimelineEvents({\n eventLog,\n events: timelineEvents,\n runtime,\n blockId,\n now,\n });\n }\n const pendingInvocationRemoved = completionState === 'completed' ? cleanupCompletedPendingInvocation(yDoc, blockId, inputBuild.pendingInvocation, sessionRunId) : false;\n\n return {\n success: !boundedOutput.exceeded,\n stage: outcome.stage,\n blockId,\n actionType,\n output,\n ...(boundedOutput.exceeded\n ? {\n error: `Action output exceeded the ${MAX_RUN_ACTION_OUTPUT_BYTES / 1024} KiB run-head limit.`,\n }\n : {}),\n events,\n invocationCid: outcome.invocationCid,\n capabilityId: outcome.capabilityId,\n // Both names, same value — see the field docs on ExecuteActionBlockResult.\n runId: executionId,\n executionId,\n pendingInvocationRemoved,\n completionState,\n pendingInvocation: inputBuild.pendingInvocation,\n };\n}\n","import type { FlowNodeRuntimeState } from '../../types/authorization';\nimport type { StoredInvocation } from '../../types/ucan';\nimport { getAction } from '../actionRegistry';\nimport { validateActionProof } from './proof';\nimport { getVersionPolicy } from './versionManifest';\n\nexport type CompletionVerificationStatus = 'verified' | 'unverified' | 'not_completed';\n\nexport interface CompletionVerification {\n status: CompletionVerificationStatus;\n /** Populated when status is 'unverified'. */\n reason?: string;\n}\n\nexport interface VerifyCompletionParams {\n runtime: FlowNodeRuntimeState | undefined | null;\n blockId: string;\n /** Action type of the block, used to re-check the proof declaration. */\n actionType?: string;\n /** Invocation lookup, typically backed by the doc's `invocations` Y.Map. */\n getInvocation?: (cid: string) => StoredInvocation | undefined | null;\n /** Flow schema version; UCAN binding is only required when the version policy demands it. */\n schemaVersion?: string;\n}\n\n/**\n * Decide whether a block's `state: 'completed'` can be trusted.\n *\n * Anyone with room write access can set `completed` directly in the runtime\n * Y.Map — a completion is only *verified* when it carries the evidence the\n * execution kernel writes:\n *\n * 1. Proof of execution per the action's `proof` declaration (all versions).\n * 2. On UCAN-enforced flows (policy.ucanRequired), a `lastInvocationCid`\n * that resolves in the invocation store to a successful invocation for\n * this block.\n *\n * The invocation check is store-level PRESENCE, not a cryptographic\n * re-verification of the CAR bytes: signatures are validated when the\n * invocation is minted, but the `invocations` Y.Map is room-writable, so a\n * member with write access can forge a matching `{ result: 'success', blockId }`\n * entry and pass this check. This raises the bar (a completion must at least\n * reference a resolvable, successful, block-matching invocation) but does NOT\n * make completions unforgeable — that needs read-time CAR-signature\n * re-verification against the delegation chain (open trust-model decision, H3).\n * Do not describe a completion that passes here as \"impossible to forge\".\n *\n * Consumers gate on this instead of raw `state === 'completed'`:\n * trigger reconciliation (event sources), flow-agent planning (Done\n * classification), and the FlowView completion badge.\n */\nexport function verifyCompletion(params: VerifyCompletionParams): CompletionVerification {\n const { runtime, blockId, actionType, getInvocation, schemaVersion } = params;\n\n if (!runtime || runtime.state !== 'completed') {\n return { status: 'not_completed' };\n }\n\n // A human resolved a `needs_verification` block by confirming the side effect\n // really happened (see NodeState 'needs_verification'). This is a deliberate\n // human-in-the-loop override of the missing declared proof — trust it, but it\n // is recorded (manuallyVerifiedByDid/At) for the audit trail. Preferable to\n // leaving a genuinely-completed on-chain action stuck Blocked forever.\n if (runtime.manuallyVerified === true) {\n return { status: 'verified' };\n }\n\n // Proof re-check applies to every version: a completed entry whose output\n // lacks the declared proof is stale or forged.\n if (actionType) {\n const action = getAction(actionType);\n if (action) {\n const proofCheck = validateActionProof(action, (runtime.output as Record<string, unknown>) || {});\n if (!proofCheck.valid) {\n return { status: 'unverified', reason: proofCheck.reason || 'Completed without proof of execution.' };\n }\n }\n }\n\n const policy = schemaVersion ? getVersionPolicy(schemaVersion) : null;\n if (!policy?.ucanRequired) {\n // Legacy flows: room-level access control is the trust boundary.\n return { status: 'verified' };\n }\n\n const invocationCid = runtime.lastInvocationCid;\n if (!invocationCid) {\n return { status: 'unverified', reason: 'Completed without an invocation record on a UCAN-enforced flow.' };\n }\n if (!getInvocation) {\n return { status: 'unverified', reason: 'No invocation store available to verify the completion.' };\n }\n const invocation = getInvocation(invocationCid);\n if (!invocation) {\n return { status: 'unverified', reason: `Invocation ${invocationCid} not found in the invocation store.` };\n }\n if (invocation.result !== 'success') {\n return { status: 'unverified', reason: 'Completion references a failed invocation.' };\n }\n if (invocation.blockId && invocation.blockId !== blockId) {\n return { status: 'unverified', reason: 'Completion references an invocation for a different block.' };\n }\n\n return { status: 'verified' };\n}\n\nexport function isVerifiedCompletion(params: VerifyCompletionParams): boolean {\n return verifyCompletion(params).status === 'verified';\n}\n","import type { Map as YMap } from 'yjs';\nimport type { StoredDelegation } from '../types/ucan';\n\nconst ROOT_DELEGATION_KEY = '__root__';\nconst STORE_VERSION_KEY = '__version__';\nconst CURRENT_VERSION = 2;\n\n/**\n * Stored entry in Y.Map\n */\ninterface StoredEntry {\n v: number;\n data: StoredDelegation;\n}\n\n/**\n * UCAN Delegation Store — stores CAR-serialized delegations\n */\nexport interface UcanDelegationStore {\n // Core operations\n get: (cid: string) => StoredDelegation | null;\n set: (delegation: StoredDelegation) => void;\n remove: (cid: string) => void;\n has: (cid: string) => boolean;\n\n // Root management\n getRoot: () => StoredDelegation | null;\n setRootCid: (cid: string) => void;\n getRootCid: () => string | null;\n\n // Query operations\n getAll: () => StoredDelegation[];\n getByAudience: (audienceDid: string) => StoredDelegation[];\n getByIssuer: (issuerDid: string) => StoredDelegation[];\n findByCapability: (can: string, withUri: string) => StoredDelegation[];\n}\n\nconst isValidEntry = (value: unknown): value is StoredEntry => {\n if (!value || typeof value !== 'object') return false;\n const entry = value as StoredEntry;\n return entry.v === CURRENT_VERSION && entry.data !== undefined;\n};\n\nconst isReservedKey = (key: string): boolean => key === ROOT_DELEGATION_KEY || key === STORE_VERSION_KEY;\n\n/**\n * Create a UCAN delegation store backed by Y.Map\n */\nexport const createUcanDelegationStore = (yMap: YMap<unknown>): UcanDelegationStore => {\n const get = (cid: string): StoredDelegation | null => {\n if (isReservedKey(cid)) return null;\n const raw = yMap.get(cid);\n if (!raw) return null;\n if (isValidEntry(raw)) return raw.data;\n return null;\n };\n\n const set = (delegation: StoredDelegation): void => {\n const entry: StoredEntry = { v: CURRENT_VERSION, data: delegation };\n yMap.set(delegation.cid, entry);\n };\n\n const remove = (cid: string): void => {\n yMap.delete(cid);\n };\n\n const has = (cid: string): boolean => {\n return yMap.has(cid) && !isReservedKey(cid);\n };\n\n const getRoot = (): StoredDelegation | null => {\n const rootCid = yMap.get(ROOT_DELEGATION_KEY) as string | undefined;\n if (!rootCid) return null;\n return get(rootCid);\n };\n\n const setRootCid = (cid: string): void => {\n yMap.set(ROOT_DELEGATION_KEY, cid);\n };\n\n const getRootCid = (): string | null => {\n return (yMap.get(ROOT_DELEGATION_KEY) as string) || null;\n };\n\n const getAll = (): StoredDelegation[] => {\n const delegations: StoredDelegation[] = [];\n yMap.forEach((value, key) => {\n if (isReservedKey(key)) return;\n if (isValidEntry(value)) {\n delegations.push(value.data);\n }\n });\n return delegations;\n };\n\n const getByAudience = (audienceDid: string): StoredDelegation[] => {\n return getAll().filter((d) => d.audienceDid === audienceDid);\n };\n\n const getByIssuer = (issuerDid: string): StoredDelegation[] => {\n return getAll().filter((d) => d.issuerDid === issuerDid);\n };\n\n const findByCapability = (can: string, withUri: string): StoredDelegation[] => {\n return getAll().filter((d) =>\n d.capabilities.some((c) => {\n if (c.can === can && c.with === withUri) return true;\n if (c.can === '*' || c.can === 'flow/*') return true;\n if (c.can.endsWith('/*')) {\n const prefix = c.can.slice(0, -1);\n if (can.startsWith(prefix)) return true;\n }\n if (c.with === '*') return true;\n if (c.with.endsWith('*')) {\n const prefix = c.with.slice(0, -1);\n if (withUri.startsWith(prefix)) return true;\n }\n return false;\n })\n );\n };\n\n return {\n get,\n set,\n remove,\n has,\n getRoot,\n setRootCid,\n getRootCid,\n getAll,\n getByAudience,\n getByIssuer,\n findByCapability,\n };\n};\n\n/**\n * Create an in-memory UCAN delegation store (for testing)\n */\nexport const createMemoryUcanDelegationStore = (): UcanDelegationStore => {\n const store = new Map<string, unknown>();\n\n const get = (cid: string): StoredDelegation | null => {\n if (isReservedKey(cid)) return null;\n const raw = store.get(cid);\n if (!raw) return null;\n if (isValidEntry(raw)) return raw.data;\n return null;\n };\n\n const set = (delegation: StoredDelegation): void => {\n const entry: StoredEntry = { v: CURRENT_VERSION, data: delegation };\n store.set(delegation.cid, entry);\n };\n\n const remove = (cid: string): void => {\n store.delete(cid);\n };\n\n const has = (cid: string): boolean => {\n return store.has(cid) && !isReservedKey(cid);\n };\n\n const getRoot = (): StoredDelegation | null => {\n const rootCid = store.get(ROOT_DELEGATION_KEY) as string | undefined;\n if (!rootCid) return null;\n return get(rootCid);\n };\n\n const setRootCid = (cid: string): void => {\n store.set(ROOT_DELEGATION_KEY, cid);\n };\n\n const getRootCid = (): string | null => {\n return (store.get(ROOT_DELEGATION_KEY) as string) || null;\n };\n\n const getAll = (): StoredDelegation[] => {\n const delegations: StoredDelegation[] = [];\n store.forEach((value, key) => {\n if (isReservedKey(key)) return;\n if (isValidEntry(value)) {\n delegations.push(value.data);\n }\n });\n return delegations;\n };\n\n const getByAudience = (audienceDid: string): StoredDelegation[] => {\n return getAll().filter((d) => d.audienceDid === audienceDid);\n };\n\n const getByIssuer = (issuerDid: string): StoredDelegation[] => {\n return getAll().filter((d) => d.issuerDid === issuerDid);\n };\n\n const findByCapability = (can: string, withUri: string): StoredDelegation[] => {\n return getAll().filter((d) =>\n d.capabilities.some((c) => {\n if (c.can === can && c.with === withUri) return true;\n if (c.can === '*' || c.can === 'flow/*') return true;\n if (c.can.endsWith('/*')) {\n const prefix = c.can.slice(0, -1);\n if (can.startsWith(prefix)) return true;\n }\n if (c.with === '*') return true;\n if (c.with.endsWith('*')) {\n const prefix = c.with.slice(0, -1);\n if (withUri.startsWith(prefix)) return true;\n }\n return false;\n })\n );\n };\n\n return {\n get,\n set,\n remove,\n has,\n getRoot,\n setRootCid,\n getRootCid,\n getAll,\n getByAudience,\n getByIssuer,\n findByCapability,\n };\n};\n","import type { Map as YMap } from 'yjs';\nimport type { StoredInvocation } from '../types/ucan';\n\n/**\n * Invocation Store for storing and querying invocations\n *\n * Invocations are stored for:\n * - Audit trail: Cryptographic proof of who did what, when, with what authority\n * - Replay protection: Prevent same invocation being used twice\n * - Dispute resolution: Evidence if actions are contested\n * - Blockchain submission: Submit proofs to chain for immutable record\n * - Analytics: Understand flow execution patterns\n */\nexport interface InvocationStore {\n // Core operations\n add: (invocation: StoredInvocation) => void;\n get: (cid: string) => StoredInvocation | null;\n remove: (cid: string) => void;\n\n // Query operations\n getAll: () => StoredInvocation[];\n getByInvoker: (invokerDid: string) => StoredInvocation[];\n getByFlow: (flowId: string) => StoredInvocation[];\n getByBlock: (flowId: string, blockId: string) => StoredInvocation[];\n getByCapability: (can: string, withUri: string) => StoredInvocation[];\n\n // Replay protection\n hasBeenInvoked: (cid: string) => boolean;\n\n // Audit queries\n getInDateRange: (startMs: number, endMs: number) => StoredInvocation[];\n getSuccessful: () => StoredInvocation[];\n getFailures: () => StoredInvocation[];\n\n // Blockchain submission tracking\n getPendingSubmission: () => StoredInvocation[];\n markSubmitted: (cid: string, transactionHash: string) => void;\n\n // Statistics\n getCount: () => number;\n getCountByResult: () => { success: number; failure: number };\n}\n\n/**\n * Create an invocation store backed by Y.Map\n */\nexport const createInvocationStore = (yMap: YMap<unknown>): InvocationStore => {\n /**\n * Add an invocation to the store\n */\n const add = (invocation: StoredInvocation): void => {\n yMap.set(invocation.cid, invocation);\n };\n\n /**\n * Get an invocation by CID\n */\n const get = (cid: string): StoredInvocation | null => {\n const raw = yMap.get(cid);\n if (!raw || typeof raw !== 'object') return null;\n return raw as StoredInvocation;\n };\n\n /**\n * Remove an invocation (use with caution - typically invocations should be immutable)\n */\n const remove = (cid: string): void => {\n yMap.delete(cid);\n };\n\n /**\n * Get all invocations\n */\n const getAll = (): StoredInvocation[] => {\n const invocations: StoredInvocation[] = [];\n yMap.forEach((value) => {\n if (value && typeof value === 'object' && 'cid' in value) {\n invocations.push(value as StoredInvocation);\n }\n });\n // Sort by executedAt descending (most recent first)\n return invocations.sort((a, b) => b.executedAt - a.executedAt);\n };\n\n /**\n * Get invocations by invoker DID\n */\n const getByInvoker = (invokerDid: string): StoredInvocation[] => {\n return getAll().filter((i) => i.invokerDid === invokerDid);\n };\n\n /**\n * Get invocations for a specific flow\n */\n const getByFlow = (flowId: string): StoredInvocation[] => {\n return getAll().filter((i) => i.flowId === flowId);\n };\n\n /**\n * Get invocations for a specific block in a flow\n */\n const getByBlock = (flowId: string, blockId: string): StoredInvocation[] => {\n return getAll().filter((i) => i.flowId === flowId && i.blockId === blockId);\n };\n\n /**\n * Get invocations that used a specific capability\n */\n const getByCapability = (can: string, withUri: string): StoredInvocation[] => {\n return getAll().filter((i) => i.capability.can === can && i.capability.with === withUri);\n };\n\n /**\n * Check if an invocation has already been used (replay protection)\n */\n const hasBeenInvoked = (cid: string): boolean => {\n return yMap.has(cid);\n };\n\n /**\n * Get invocations in a date range\n */\n const getInDateRange = (startMs: number, endMs: number): StoredInvocation[] => {\n return getAll().filter((i) => i.executedAt >= startMs && i.executedAt <= endMs);\n };\n\n /**\n * Get successful invocations\n */\n const getSuccessful = (): StoredInvocation[] => {\n return getAll().filter((i) => i.result === 'success');\n };\n\n /**\n * Get failed invocations\n */\n const getFailures = (): StoredInvocation[] => {\n return getAll().filter((i) => i.result === 'failure');\n };\n\n /**\n * Get invocations pending blockchain submission\n */\n const getPendingSubmission = (): StoredInvocation[] => {\n return getAll().filter((i) => i.result === 'success' && !i.transactionHash);\n };\n\n /**\n * Mark an invocation as submitted to blockchain\n */\n const markSubmitted = (cid: string, transactionHash: string): void => {\n const invocation = get(cid);\n if (invocation) {\n const updated: StoredInvocation = {\n ...invocation,\n transactionHash,\n };\n yMap.set(cid, updated);\n }\n };\n\n /**\n * Get total count of invocations\n */\n const getCount = (): number => {\n return getAll().length;\n };\n\n /**\n * Get count by result type\n */\n const getCountByResult = (): { success: number; failure: number } => {\n const all = getAll();\n return {\n success: all.filter((i) => i.result === 'success').length,\n failure: all.filter((i) => i.result === 'failure').length,\n };\n };\n\n return {\n add,\n get,\n remove,\n getAll,\n getByInvoker,\n getByFlow,\n getByBlock,\n getByCapability,\n hasBeenInvoked,\n getInDateRange,\n getSuccessful,\n getFailures,\n getPendingSubmission,\n markSubmitted,\n getCount,\n getCountByResult,\n };\n};\n\n/**\n * Create an in-memory invocation store (for testing)\n */\nexport const createMemoryInvocationStore = (): InvocationStore => {\n const store = new Map<string, StoredInvocation>();\n\n const add = (invocation: StoredInvocation): void => {\n store.set(invocation.cid, invocation);\n };\n\n const get = (cid: string): StoredInvocation | null => {\n return store.get(cid) || null;\n };\n\n const remove = (cid: string): void => {\n store.delete(cid);\n };\n\n const getAll = (): StoredInvocation[] => {\n const invocations = Array.from(store.values());\n return invocations.sort((a, b) => b.executedAt - a.executedAt);\n };\n\n const getByInvoker = (invokerDid: string): StoredInvocation[] => {\n return getAll().filter((i) => i.invokerDid === invokerDid);\n };\n\n const getByFlow = (flowId: string): StoredInvocation[] => {\n return getAll().filter((i) => i.flowId === flowId);\n };\n\n const getByBlock = (flowId: string, blockId: string): StoredInvocation[] => {\n return getAll().filter((i) => i.flowId === flowId && i.blockId === blockId);\n };\n\n const getByCapability = (can: string, withUri: string): StoredInvocation[] => {\n return getAll().filter((i) => i.capability.can === can && i.capability.with === withUri);\n };\n\n const hasBeenInvoked = (cid: string): boolean => {\n return store.has(cid);\n };\n\n const getInDateRange = (startMs: number, endMs: number): StoredInvocation[] => {\n return getAll().filter((i) => i.executedAt >= startMs && i.executedAt <= endMs);\n };\n\n const getSuccessful = (): StoredInvocation[] => {\n return getAll().filter((i) => i.result === 'success');\n };\n\n const getFailures = (): StoredInvocation[] => {\n return getAll().filter((i) => i.result === 'failure');\n };\n\n const getPendingSubmission = (): StoredInvocation[] => {\n return getAll().filter((i) => i.result === 'success' && !i.transactionHash);\n };\n\n const markSubmitted = (cid: string, transactionHash: string): void => {\n const invocation = get(cid);\n if (invocation) {\n store.set(cid, { ...invocation, transactionHash });\n }\n };\n\n const getCount = (): number => {\n return store.size;\n };\n\n const getCountByResult = (): { success: number; failure: number } => {\n const all = getAll();\n return {\n success: all.filter((i) => i.result === 'success').length,\n failure: all.filter((i) => i.result === 'failure').length,\n };\n };\n\n return {\n add,\n get,\n remove,\n getAll,\n getByInvoker,\n getByFlow,\n getByBlock,\n getByCapability,\n hasBeenInvoked,\n getInDateRange,\n getSuccessful,\n getFailures,\n getPendingSubmission,\n markSubmitted,\n getCount,\n getCountByResult,\n };\n};\n","import type * as Y from 'yjs';\nimport type { FlowNodeRuntimeState } from '../../types/authorization';\nimport { isRepeatableAction } from '../actionRegistry';\nimport type { CompletionVerification } from './verifiedCompletion';\nimport { readRunRecords } from './triggers';\n\n/**\n * The four top-level phases a block presents to users and planners. This is a\n * DERIVED vocabulary — it is never written to the runtime Y.Map. The stored\n * `NodeState` machine is unchanged; every consumer (badge, flow agent, future\n * dashboards) computes its view through {@link deriveBlockPhase} so the two\n * can never drift, and existing flows need no migration.\n *\n * - `pending` — not actionable yet: nothing has run and no work is queued.\n * - `active` — actionable or in motion: running, awaiting external\n * confirmation, queued invocations to act on, or (for repeatable actions) a\n * standing capability that has fired and remains open.\n * - `complete` — terminal Done. Only one-shot (`cardinality: 'once'`) actions\n * ever reach it; a repeatable action that has fired stays `active`.\n * - `failed` — needs attention. Includes plain failures (safe to retry) and\n * the two states that are deliberately NOT safe to retry:\n * `needs_verification` and unverified completions.\n */\nexport type BlockPhase = 'pending' | 'active' | 'complete' | 'failed';\n\n/**\n * Finer-grained detail preserved from the underlying state machine so UIs can\n * distinguish sub-states without re-deriving them:\n *\n * - `idle` — pending, nothing has run.\n * - `queued` — pending invocations exist for the block.\n * - `running` — executing right now.\n * - `awaiting_readback` — ran; final outcome arrives via read-back\n * reconciliation. Neither pending (it ran) nor complete (not settled).\n * - `standing` — repeatable action with ≥1 completed run; stays\n * active for the flow's life. Progress = `runCount`, not this entry.\n * - `completed` — terminal Done (one-shot actions only).\n * - `cancelled` — deliberately closed; terminal for any cardinality.\n * - `failed` — the run failed; retrying is safe.\n * - `needs_verification` — side effect MAY have happened but proof is\n * missing. Retrying could double-execute; requires human resolution.\n * - `unverified` — a `completed` entry that fails\n * `verifyCompletion` (missing proof / invocation). Treat like\n * `needs_verification`: surface, never silently trust or auto-retry.\n */\nexport type BlockPhaseDetail =\n | 'idle'\n | 'queued'\n | 'pending'\n | 'running'\n | 'retry_scheduled'\n | 'awaiting_readback'\n | 'awaiting_human'\n | 'standing'\n | 'completed'\n | 'cancelled'\n | 'failed'\n | 'needs_verification'\n | 'unverified';\n\nexport interface DerivedBlockState {\n phase: BlockPhase;\n detail: BlockPhaseDetail;\n /** Whether the block's action type is a repeatable ('many') capability. */\n repeatable: boolean;\n /**\n * Successful run count for repeatable blocks, when the caller supplied one\n * (see {@link countSuccessfulRuns}). Undefined when unknown.\n */\n runCount?: number;\n /**\n * Whether re-executing the block is safe. False for `needs_verification`\n * and `unverified` — the side effect may already have happened, so a retry\n * risks double-execution. UIs must not offer a plain retry when false.\n */\n safeToRetry: boolean;\n}\n\nexport interface DeriveBlockPhaseParams {\n runtime: FlowNodeRuntimeState | null | undefined;\n /** The block's action type, used to resolve cardinality from the registry. */\n actionType?: string | null;\n /**\n * Result of `verifyCompletion` for the block. When 'unverified', a\n * `completed` entry derives as `failed`/`unverified` instead of trusting it.\n */\n completionVerification?: CompletionVerification;\n /** Number of queued pending invocations for the block, when known. */\n pendingInvocationCount?: number;\n /** Successful run count from the audit trail, when the caller has it. */\n runCount?: number;\n}\n\n/**\n * Derive the presentation phase of a block from its canonical runtime state.\n *\n * Pure and read-only: never writes, never consults the clock. Cardinality is\n * the main branch — a repeatable ('many') action never derives `complete`;\n * a `completed` entry just means \"has fired at least once\" and the block\n * remains a standing `active` capability (see ActionDefinition.cardinality).\n *\n * Unknown state strings derive as `failed`/`needs_verification` with\n * `safeToRetry: false`: a state this build doesn't understand was written by\n * a newer client, and the only safe assumption is \"do not touch\".\n */\nexport function deriveBlockPhase(params: DeriveBlockPhaseParams): DerivedBlockState {\n const { runtime, actionType, completionVerification, pendingInvocationCount = 0, runCount } = params;\n const repeatable = isRepeatableAction(actionType);\n const state = runtime?.state ?? 'idle';\n\n const base = { repeatable, ...(repeatable && runCount !== undefined ? { runCount } : {}) };\n\n if (state === 'completed' && completionVerification?.status === 'unverified') {\n return { ...base, phase: 'failed', detail: 'unverified', safeToRetry: false };\n }\n\n switch (state) {\n case 'idle':\n if (pendingInvocationCount > 0) {\n return { ...base, phase: 'active', detail: 'queued', safeToRetry: true };\n }\n return { ...base, phase: 'pending', detail: 'idle', safeToRetry: true };\n case 'running':\n return { ...base, phase: 'active', detail: 'running', safeToRetry: false };\n case 'pending':\n return { ...base, phase: 'active', detail: 'pending', safeToRetry: false };\n case 'retry_scheduled':\n return { ...base, phase: 'active', detail: 'retry_scheduled', safeToRetry: false };\n case 'awaiting_readback':\n return { ...base, phase: 'active', detail: 'awaiting_readback', safeToRetry: false };\n case 'awaiting_human':\n return { ...base, phase: 'failed', detail: 'awaiting_human', safeToRetry: false };\n case 'completed':\n if (repeatable) {\n return { ...base, phase: 'active', detail: 'standing', safeToRetry: true };\n }\n return { ...base, phase: 'complete', detail: 'completed', safeToRetry: false };\n case 'cancelled':\n // Cancellation deliberately closes the block — terminal even for a\n // repeatable capability, unlike `completed` which just means \"fired\".\n return { ...base, phase: 'complete', detail: 'cancelled', safeToRetry: false };\n case 'failed':\n return { ...base, phase: 'failed', detail: 'failed', safeToRetry: true };\n case 'needs_verification':\n return { ...base, phase: 'failed', detail: 'needs_verification', safeToRetry: false };\n default:\n // Forward-compat guard: an unknown state was written by a newer client.\n // Deriving it as pending would let auto-execute gates fire and risk\n // double-execution — treat it as needs-attention, never retryable.\n return { ...base, phase: 'failed', detail: 'needs_verification', safeToRetry: false };\n }\n}\n\n/**\n * Count the successful runs of a block from the audit trail — the real\n * progress measure for a repeatable ('many') block, whose single runtime\n * entry only says \"has fired at least once\".\n */\nexport function countSuccessfulRuns(yDoc: Y.Doc, blockId: string): number {\n return readRunRecords(yDoc, blockId).filter((record) => !record.error).length;\n}\n","/**\n * Validate a block's user-authored JSON configuration props.\n *\n * The engine's parse helpers absorb malformed JSON (a block with a broken\n * trigger simply never fires) — this helper makes that state visible so the\n * UI can render an \"Invalid configuration\" indicator instead of leaving the\n * block silently inert.\n */\nexport function validateBlockConfig(block: { id?: string; props?: Record<string, unknown> } | null | undefined): string[] {\n const issues: string[] = [];\n if (!block?.props) return issues;\n\n const checkJson = (propName: string, value: unknown, expectObject = true): void => {\n if (value == null || value === '') return;\n if (typeof value !== 'string') return; // already parsed — fine\n try {\n const parsed = JSON.parse(value);\n if (expectObject && (parsed == null || typeof parsed !== 'object')) {\n issues.push(`${propName} is valid JSON but not an object`);\n }\n } catch {\n issues.push(`${propName} is not valid JSON`);\n }\n };\n\n checkJson('inputs', block.props.inputs);\n checkJson('trigger', block.props.trigger);\n checkJson('assignment', block.props.assignment);\n checkJson('conditions', block.props.conditions);\n\n return issues;\n}\n","/**\n * Flow Migration Engine\n *\n * State machine that manages per-flow version upgrades.\n * Migration progress is persisted in a Yjs map so it survives page reloads\n * and is visible to all collaborators.\n *\n * Key properties:\n * - Incremental: each work item is processed and persisted individually\n * - Resumable: interrupted migrations pick up from the last pending item\n * - Safe: version is only stamped after all items complete and post-validation passes\n * - Owner-only: only the flow owner can initiate or resume a migration\n */\n\nimport type { Map as YMap } from 'yjs';\nimport type { IxoEditorType } from '../../types/editor';\nimport type { UcanService } from '../../services/ucanService';\nimport type { FlowVersionString } from './versionManifest';\nimport { getMigrationChain } from './versionManifest';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MigrationPhase = 'idle' | 'analyzing' | 'ready' | 'executing' | 'validating' | 'finalizing' | 'complete' | 'failed';\n\nexport interface MigrationWorkItem {\n /** Unique identifier for this work item */\n id: string;\n /** Block ID this item relates to (empty for flow-level items like root delegation) */\n nodeId: string;\n /** Type of work to perform */\n type: 'create_root_delegation' | 'create_node_delegation' | 'backfill_capability';\n /** Current status */\n status: 'pending' | 'completed' | 'failed';\n /** Error message if failed */\n error?: string;\n /** Whether this item requires user interaction (e.g., PIN for signing) */\n requiresUserAction: boolean;\n /** Human-readable description */\n description: string;\n}\n\nexport interface MigrationState {\n /** Current phase of the migration */\n phase: MigrationPhase;\n /** Version migrating from */\n fromVersion: string;\n /** Version migrating to */\n toVersion: string;\n /** DID of the user who initiated the migration */\n initiatorDid: string;\n /** ISO timestamp when migration started */\n startedAt: string;\n /** Work items to process */\n workItems: MigrationWorkItem[];\n /** Number of completed items */\n completedItems: number;\n /** Total number of items */\n totalItems: number;\n /** Error message if migration failed */\n error?: string;\n /** ISO timestamp when migration completed */\n completedAt?: string;\n}\n\nexport interface MigrationHistoryEntry {\n from: string;\n to: string;\n migratedBy: string;\n migratedAt: string;\n itemCount: number;\n}\n\nexport interface MigrationPrecondition {\n id: string;\n description: string;\n check: (ctx: MigrationContext) => boolean | Promise<boolean>;\n /** If true, failing this precondition blocks the entire migration */\n blocking: boolean;\n}\n\nexport interface MigrationDefinition {\n from: FlowVersionString;\n to: FlowVersionString;\n\n /** Preconditions that must be met before migration can start */\n preconditions: MigrationPrecondition[];\n\n /** Analyze the flow and return work items */\n analyze: (ctx: MigrationContext) => Promise<MigrationWorkItem[]>;\n\n /** Execute a single work item */\n executeItem: (ctx: MigrationContext, item: MigrationWorkItem) => Promise<{ success: boolean; error?: string }>;\n\n /** Validate the flow after all items are processed */\n postValidate: (ctx: MigrationContext) => Promise<{ valid: boolean; errors: string[] }>;\n\n /** Finalize the migration (stamp version, update context) */\n finalize: (ctx: MigrationContext) => void;\n}\n\nexport interface MigrationContext {\n /** The editor instance */\n editor: IxoEditorType;\n /** The migration Yjs map for persisting state */\n migrationMap: YMap<any>;\n /** DID of the actor performing the migration (must be flow owner) */\n actorDid: string;\n /** DID of the flow owner */\n flowOwnerDid: string;\n /** Flow URI for capability resources */\n flowUri: string;\n /** Flow document ID */\n flowId: string;\n /** UCAN service for creating delegations */\n ucanService: UcanService;\n /** PIN for signing operations */\n pin: string;\n /** Actor type for signing */\n actorType: 'entity' | 'user';\n /** Entity room ID if signing as entity */\n entityRoomId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Migration Registry\n// ---------------------------------------------------------------------------\n\nconst MIGRATION_REGISTRY: Record<string, MigrationDefinition> = {};\n\n/**\n * Register a migration definition. Called by migration files on import.\n */\nexport function registerMigration(definition: MigrationDefinition): void {\n const key = `${definition.from}->${definition.to}`;\n MIGRATION_REGISTRY[key] = definition;\n}\n\n/**\n * Get the migration definition for a version pair.\n */\nexport function getMigrationDefinition(from: string, to: string): MigrationDefinition | null {\n return MIGRATION_REGISTRY[`${from}->${to}`] || null;\n}\n\n// ---------------------------------------------------------------------------\n// State persistence helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Read the current migration state from the Yjs map.\n */\nexport function getMigrationState(migrationMap: YMap<any>): MigrationState | null {\n const raw = migrationMap.get('state');\n if (!raw) return null;\n return typeof raw === 'string' ? JSON.parse(raw) : raw;\n}\n\nfunction persistState(migrationMap: YMap<any>, state: MigrationState): void {\n migrationMap.set('state', JSON.parse(JSON.stringify(state)));\n}\n\nfunction getMigrationHistory(migrationMap: YMap<any>): MigrationHistoryEntry[] {\n const raw = migrationMap.get('history');\n if (!raw) return [];\n return typeof raw === 'string' ? JSON.parse(raw) : raw;\n}\n\nfunction appendMigrationHistory(migrationMap: YMap<any>, entry: MigrationHistoryEntry): void {\n const history = getMigrationHistory(migrationMap);\n history.push(entry);\n migrationMap.set('history', JSON.parse(JSON.stringify(history)));\n}\n\n// ---------------------------------------------------------------------------\n// Migration lifecycle functions\n// ---------------------------------------------------------------------------\n\n/**\n * Start a migration from the flow's current version to the target version.\n * Runs preconditions and analysis, persists work items.\n * Does NOT execute any items — call executeMigrationStep() for that.\n */\nexport async function startMigration(ctx: MigrationContext, fromVersion: string, toVersion: string): Promise<{ success: boolean; state: MigrationState; errors: string[] }> {\n const errors: string[] = [];\n\n // Resolve migration definition\n const definition = getMigrationDefinition(fromVersion, toVersion);\n if (!definition) {\n return {\n success: false,\n state: createFailedState(fromVersion, toVersion, ctx.actorDid, `No migration path from ${fromVersion} to ${toVersion}`),\n errors: [`No migration definition registered for ${fromVersion} -> ${toVersion}`],\n };\n }\n\n // Check preconditions\n for (const precondition of definition.preconditions) {\n const passed = await precondition.check(ctx);\n if (!passed) {\n if (precondition.blocking) {\n const state = createFailedState(fromVersion, toVersion, ctx.actorDid, `Precondition failed: ${precondition.description}`);\n persistState(ctx.migrationMap, state);\n return { success: false, state, errors: [precondition.description] };\n }\n errors.push(`Warning: ${precondition.description}`);\n }\n }\n\n // Analyze\n const workItems = await definition.analyze(ctx);\n\n const state: MigrationState = {\n phase: workItems.length === 0 ? 'ready' : 'ready',\n fromVersion,\n toVersion,\n initiatorDid: ctx.actorDid,\n startedAt: new Date().toISOString(),\n workItems,\n completedItems: 0,\n totalItems: workItems.length,\n };\n\n persistState(ctx.migrationMap, state);\n return { success: true, state, errors };\n}\n\n/**\n * Execute the next pending work item in the migration.\n * Call this repeatedly until all items are processed.\n * Returns the updated state after processing one item.\n */\nexport async function executeMigrationStep(ctx: MigrationContext): Promise<MigrationState> {\n const state = getMigrationState(ctx.migrationMap);\n if (!state) {\n throw new Error('No migration in progress');\n }\n\n if (state.phase === 'complete' || state.phase === 'failed') {\n return state;\n }\n\n const definition = getMigrationDefinition(state.fromVersion, state.toVersion);\n if (!definition) {\n state.phase = 'failed';\n state.error = `Migration definition not found for ${state.fromVersion} -> ${state.toVersion}`;\n persistState(ctx.migrationMap, state);\n return state;\n }\n\n // Find next pending item\n const pendingItem = state.workItems.find((item) => item.status === 'pending');\n if (!pendingItem) {\n // All items processed, move to validating\n state.phase = 'validating';\n persistState(ctx.migrationMap, state);\n return state;\n }\n\n // Execute the item\n state.phase = 'executing';\n persistState(ctx.migrationMap, state);\n\n const result = await definition.executeItem(ctx, pendingItem);\n\n if (result.success) {\n pendingItem.status = 'completed';\n state.completedItems++;\n } else {\n pendingItem.status = 'failed';\n pendingItem.error = result.error;\n }\n\n // Check if all items are done\n const stillPending = state.workItems.some((item) => item.status === 'pending');\n if (!stillPending) {\n const anyFailed = state.workItems.some((item) => item.status === 'failed');\n state.phase = anyFailed ? 'failed' : 'validating';\n if (anyFailed) {\n state.error = 'One or more migration items failed. Review individual items for details.';\n }\n }\n\n persistState(ctx.migrationMap, state);\n return state;\n}\n\n/**\n * Execute all remaining pending work items in sequence.\n * Convenience wrapper around executeMigrationStep.\n */\nexport async function executeAllMigrationSteps(ctx: MigrationContext): Promise<MigrationState> {\n let state = getMigrationState(ctx.migrationMap);\n if (!state) throw new Error('No migration in progress');\n\n while (state.phase !== 'validating' && state.phase !== 'failed' && state.phase !== 'complete') {\n const hasRemaining = state.workItems.some((item) => item.status === 'pending');\n if (!hasRemaining) break;\n state = await executeMigrationStep(ctx);\n }\n\n return state;\n}\n\n/**\n * Run post-validation after all work items are complete.\n * Returns validation result without modifying the version.\n */\nexport async function validateMigration(ctx: MigrationContext): Promise<{ valid: boolean; errors: string[] }> {\n const state = getMigrationState(ctx.migrationMap);\n if (!state || state.phase !== 'validating') {\n return { valid: false, errors: ['Migration is not in validating phase'] };\n }\n\n const definition = getMigrationDefinition(state.fromVersion, state.toVersion);\n if (!definition) {\n return { valid: false, errors: ['Migration definition not found'] };\n }\n\n const result = await definition.postValidate(ctx);\n\n if (!result.valid) {\n state.phase = 'failed';\n state.error = `Post-validation failed: ${result.errors.join('; ')}`;\n persistState(ctx.migrationMap, state);\n }\n\n return result;\n}\n\n/**\n * Finalize the migration — stamp the new version and record history.\n * Only call after validateMigration returns { valid: true }.\n */\nexport function finalizeMigration(ctx: MigrationContext): MigrationState {\n const state = getMigrationState(ctx.migrationMap);\n if (!state || state.phase !== 'validating') {\n throw new Error('Cannot finalize: migration is not in validating phase');\n }\n\n const definition = getMigrationDefinition(state.fromVersion, state.toVersion);\n if (!definition) {\n throw new Error('Migration definition not found');\n }\n\n // Run the definition's finalize (stamps version on root map, etc.)\n definition.finalize(ctx);\n\n // Record history\n appendMigrationHistory(ctx.migrationMap, {\n from: state.fromVersion,\n to: state.toVersion,\n migratedBy: ctx.actorDid,\n migratedAt: new Date().toISOString(),\n itemCount: state.totalItems,\n });\n\n // Update state\n state.phase = 'complete';\n state.completedAt = new Date().toISOString();\n persistState(ctx.migrationMap, state);\n\n return state;\n}\n\n/**\n * Abandon an in-progress migration. Safe because the version hasn't been bumped.\n * Resets migration state to idle.\n */\nexport function abandonMigration(migrationMap: YMap<any>): void {\n migrationMap.delete('state');\n}\n\n/**\n * Check if a migration can be resumed (has persisted state with pending items).\n */\nexport function canResumeMigration(migrationMap: YMap<any>): boolean {\n const state = getMigrationState(migrationMap);\n if (!state) return false;\n return state.phase !== 'idle' && state.phase !== 'complete' && state.phase !== 'failed';\n}\n\n/**\n * Run a full migration chain from one version to another,\n * stepping through each intermediate version.\n * For UI-driven migrations, prefer calling the individual lifecycle functions.\n */\nexport async function runMigrationChain(ctx: MigrationContext, fromVersion: string, toVersion: string): Promise<{ success: boolean; finalVersion: string; errors: string[] }> {\n const chain = getMigrationChain(fromVersion, toVersion);\n if (chain.length === 0) {\n return { success: false, finalVersion: fromVersion, errors: ['No migration path found'] };\n }\n\n let currentVersion = fromVersion;\n const allErrors: string[] = [];\n\n for (const targetVersion of chain) {\n // Start\n const startResult = await startMigration(ctx, currentVersion, targetVersion);\n if (!startResult.success) {\n return { success: false, finalVersion: currentVersion, errors: [...allErrors, ...startResult.errors] };\n }\n\n // Execute all steps\n const state = await executeAllMigrationSteps(ctx);\n if (state.phase === 'failed') {\n return { success: false, finalVersion: currentVersion, errors: [...allErrors, state.error || 'Migration failed'] };\n }\n\n // Validate\n const validation = await validateMigration(ctx);\n if (!validation.valid) {\n return { success: false, finalVersion: currentVersion, errors: [...allErrors, ...validation.errors] };\n }\n\n // Finalize\n finalizeMigration(ctx);\n currentVersion = targetVersion;\n }\n\n return { success: true, finalVersion: currentVersion, errors: allErrors };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction createFailedState(from: string, to: string, initiator: string, error: string): MigrationState {\n return {\n phase: 'failed',\n fromVersion: from,\n toVersion: to,\n initiatorDid: initiator,\n startedAt: new Date().toISOString(),\n workItems: [],\n completedItems: 0,\n totalItems: 0,\n error,\n };\n}\n","/**\n * Migration: 0.3 → 1.0.0\n *\n * Upgrades a flow from optional UCAN to required UCAN authorization.\n *\n * What this migration does:\n * 1. Creates a root delegation if one doesn't exist\n * 2. For each executable block, ensures a delegation granting\n * flow/block/execute exists in the delegation store\n * 3. Validates all delegation chains resolve back to root\n * 4. Stamps schema_version to '1.0.0'\n *\n * In v1.0.0, delegations live in the UcanDelegationStore (Yjs-backed),\n * not as block props. The authorization layer validates chains from\n * the store at execution time.\n */\n\nimport type { MigrationDefinition, MigrationContext, MigrationWorkItem } from '../migration';\nimport { registerMigration } from '../migration';\nimport type { UcanCapability } from '../../../types/ucan';\n\n/** Block types that are structural/content and don't participate in flow execution */\nconst NON_EXECUTABLE_BLOCK_TYPES = new Set(['paragraph', 'heading', 'bulletListItem', 'numberedListItem', 'image', 'table']);\n\n/**\n * Check if a delegation already exists in the store for a given block.\n */\nfunction hasDelegationForBlock(ctx: MigrationContext, blockId: string): boolean {\n const delegations = ctx.ucanService.getAllDelegations();\n const resourceUri = `${ctx.flowUri}:${blockId}`;\n return delegations.some((d) => d.capabilities.some((c) => c.can === 'flow/block/execute' && c.with === resourceUri));\n}\n\nexport const migration_0_3_to_1_0_0: MigrationDefinition = {\n from: '0.3',\n to: '1.0.0',\n\n preconditions: [\n {\n id: 'has_flow_owner',\n description: 'Flow must have a flowOwnerDid set',\n check: (ctx) => {\n const ownerDid = ctx.editor.getFlowOwnerDid?.() || ctx.flowOwnerDid;\n return !!ownerDid;\n },\n blocking: true,\n },\n {\n id: 'is_owner',\n description: 'Only the flow owner can initiate migration',\n check: (ctx) => {\n const ownerDid = ctx.editor.getFlowOwnerDid?.() || ctx.flowOwnerDid;\n return ctx.actorDid === ownerDid;\n },\n blocking: true,\n },\n {\n id: 'ucan_service_available',\n description: 'UCAN service must be configured',\n check: (ctx) => {\n return !!ctx.ucanService && ctx.ucanService.isConfigured();\n },\n blocking: true,\n },\n ],\n\n async analyze(ctx: MigrationContext): Promise<MigrationWorkItem[]> {\n const items: MigrationWorkItem[] = [];\n const blocks = ctx.editor.document;\n\n // Check if root delegation exists\n const rootDelegation = ctx.ucanService.getRootDelegation();\n if (!rootDelegation) {\n items.push({\n id: '__root_delegation__',\n nodeId: '',\n type: 'create_root_delegation',\n status: 'pending',\n requiresUserAction: true,\n description: 'Create root delegation for flow owner',\n });\n }\n\n // Scan all blocks — create delegations for executable blocks that don't have one\n if (blocks) {\n for (const block of blocks) {\n if (NON_EXECUTABLE_BLOCK_TYPES.has(block.type)) continue;\n\n if (!hasDelegationForBlock(ctx, block.id)) {\n items.push({\n id: `node_delegation_${block.id}`,\n nodeId: block.id,\n type: 'create_node_delegation',\n status: 'pending',\n requiresUserAction: true,\n description: `Create delegation for block \"${block.type}\" (${block.id})`,\n });\n }\n }\n }\n\n return items;\n },\n\n async executeItem(ctx: MigrationContext, item: MigrationWorkItem): Promise<{ success: boolean; error?: string }> {\n try {\n switch (item.type) {\n case 'create_root_delegation': {\n await ctx.ucanService.createRootDelegation({\n flowOwnerDid: ctx.flowOwnerDid,\n issuerType: ctx.actorType,\n entityRoomId: ctx.entityRoomId,\n flowUri: ctx.flowUri,\n pin: ctx.pin,\n });\n return { success: true };\n }\n\n case 'create_node_delegation':\n case 'backfill_capability': {\n // Create a delegation from flow owner granting flow/block/execute for this node\n const capability: UcanCapability = {\n can: 'flow/block/execute',\n with: `${ctx.flowUri}:${item.nodeId}`,\n };\n\n await ctx.ucanService.createDelegation({\n issuerDid: ctx.flowOwnerDid,\n issuerType: ctx.actorType,\n entityRoomId: ctx.entityRoomId,\n audience: ctx.flowOwnerDid, // Owner delegates to self initially; actors get sub-delegations\n capabilities: [capability],\n pin: ctx.pin,\n });\n\n return { success: true };\n }\n\n default:\n return { success: false, error: `Unknown work item type: ${item.type}` };\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { success: false, error: message };\n }\n },\n\n async postValidate(ctx: MigrationContext): Promise<{ valid: boolean; errors: string[] }> {\n const errors: string[] = [];\n const blocks = ctx.editor.document;\n\n // Verify root delegation exists\n const rootDelegation = ctx.ucanService.getRootDelegation();\n if (!rootDelegation) {\n errors.push('Root delegation is missing after migration');\n }\n\n // Verify each executable block has a valid delegation chain\n if (blocks) {\n for (const block of blocks) {\n if (NON_EXECUTABLE_BLOCK_TYPES.has(block.type)) continue;\n\n const requiredCapability: UcanCapability = {\n can: 'flow/block/execute',\n with: `${ctx.flowUri}:${block.id}`,\n };\n\n const validation = await ctx.ucanService.validateDelegationChain(ctx.flowOwnerDid, requiredCapability);\n if (!validation.valid) {\n errors.push(`Block \"${block.type}\" (${block.id}): delegation chain invalid — ${validation.error || 'unknown error'}`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n },\n\n finalize(ctx: MigrationContext): void {\n const root = ctx.editor._yRoot;\n if (!root) {\n throw new Error('Cannot finalize: editor _yRoot not available');\n }\n\n root.set('schema_version', '1.0.0');\n root.set('@context', 'https://ixo.world/flow/1.0');\n },\n};\n\n// Auto-register this migration on import\nregisterMigration(migration_0_3_to_1_0_0);\n","/**\n * Node context records — per-node semantic context written by the flow\n * manager (headless orchestrator) into the top-level `nodeContext` Y.Map,\n * keyed by block/node id. Records are plain JSON objects (no nested Y types)\n * so they replicate atomically and read back as ordinary data.\n *\n * The editor treats these records as advisory input from the flow manager,\n * with one exception: fields whose provenance is `'human'` are permanent\n * manual overrides that the flow manager must never clobber.\n */\n\n/**\n * Where a context field's value came from:\n * - 'derived': mechanically extracted from node inputs.\n * - 'inferred': produced by the flow manager's LLM classification pass.\n * - 'human': manual override; wins and survives re-determination.\n */\nexport type NodeContextFieldProvenance = 'derived' | 'inferred' | 'human';\n\nexport interface NodeContextRecord {\n kind: string;\n shapeVersion: number;\n sourceDigest: string;\n values: Record<string, unknown>;\n fieldProvenance: Record<string, NodeContextFieldProvenance>;\n inferredAt: string;\n model?: string;\n}\n\n/** Top-level Y.Doc map name the flow manager writes node context records to. */\nexport const NODE_CONTEXT_MAP_NAME = 'nodeContext';\n\n/**\n * Top-level Y.Doc map name for per-field human overrides, keyed\n * `${nodeId}:${field}` with the raw override value (JSON-serializable).\n * Writing one key per override (instead of rewriting the whole record in\n * `nodeContext`) makes human overrides race-free against concurrent\n * whole-record writes by the flow manager. Readers overlay these entries on\n * the base record at read time with `fieldProvenance[field] = 'human'`.\n */\nexport const NODE_CONTEXT_OVERRIDES_MAP_NAME = 'nodeContextOverrides';\n\n/**\n * Structural guard for records read out of the shared Y.Map. The map is\n * written by a separate process (the flow manager), so never assume shape —\n * malformed entries are treated as absent rather than crashing the UI.\n */\nexport function isNodeContextRecord(value: unknown): value is NodeContextRecord {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const record = value as Partial<NodeContextRecord>;\n return (\n typeof record.kind === 'string' &&\n typeof record.shapeVersion === 'number' &&\n typeof record.sourceDigest === 'string' &&\n Boolean(record.values) &&\n typeof record.values === 'object' &&\n !Array.isArray(record.values) &&\n Boolean(record.fieldProvenance) &&\n typeof record.fieldProvenance === 'object' &&\n !Array.isArray(record.fieldProvenance) &&\n typeof record.inferredAt === 'string'\n );\n}\n","/**\n * The operator vocabulary the FE condition evaluator actually understands\n * (`src/mantine/blocks/utils/conditionEvaluator.ts`). The compiler historically wrote the\n * BaseUcan `ConditionRef` vocabulary (`eq`/`neq`/…) verbatim, which the evaluator does NOT\n * recognise (and no normalizer bridged them) — so those conditions silently never fired.\n * This module is the single source of truth that maps every supported spelling onto the\n * evaluator's vocabulary, and assembles the `props.conditions` JSON.\n */\nexport type EvaluatorOperator = 'equals' | 'not_equals' | 'greater_than' | 'less_than' | 'contains' | 'not_contains' | 'is_empty' | 'is_not_empty';\n\nconst OPERATOR_MAP: Record<string, EvaluatorOperator> = {\n // BaseUcan ConditionRef vocabulary\n eq: 'equals',\n neq: 'not_equals',\n gt: 'greater_than',\n lt: 'less_than',\n in: 'contains',\n exists: 'is_not_empty',\n // Friendly camelCase (plugin FlowSpec `is`)\n equals: 'equals',\n notEquals: 'not_equals',\n greaterThan: 'greater_than',\n lessThan: 'less_than',\n isEmpty: 'is_empty',\n isNotEmpty: 'is_not_empty',\n // Evaluator vocabulary passthrough\n not_equals: 'not_equals',\n greater_than: 'greater_than',\n less_than: 'less_than',\n contains: 'contains',\n not_contains: 'not_contains',\n notContains: 'not_contains',\n is_empty: 'is_empty',\n is_not_empty: 'is_not_empty',\n};\n\n/** Normalize any supported operator spelling to the evaluator's vocabulary. Unknown → `equals`. */\nexport function toEvaluatorOperator(operator: string): EvaluatorOperator {\n return OPERATOR_MAP[operator] ?? 'equals';\n}\n\nexport interface BlockConditionInput {\n /** The BLOCK id of the source step (note: the stored shape keys on blockId, not nodeId). */\n sourceBlockId: string;\n /** Property on the source block to test. */\n property: string;\n /** Any supported operator spelling — normalized to the evaluator's vocabulary on write. */\n operator: string;\n value?: unknown;\n effect?: { action: 'enable' | 'disable' | 'show' | 'hide'; message?: string };\n /** Source block type label; defaults to the compiled action type (`'action'`). */\n sourceBlockType?: string;\n name?: string;\n}\n\n/**\n * Build the `props.conditions` JSON string in the exact shape the FE evaluator reads, with\n * operators normalized to its vocabulary. Single source of truth for the conditions prop —\n * used by both the flow compiler (`compileCondition`) and direct authoring writes\n * (`setBlockProps('conditions', buildBlockConditionsProp(...))`), so a condition authored\n * either way actually evaluates.\n */\nexport function buildBlockConditionsProp(conditions: BlockConditionInput[], opts?: { mode?: 'all_must_pass' | 'any_can_pass'; enabled?: boolean }): string {\n return JSON.stringify({\n enabled: opts?.enabled ?? true,\n mode: opts?.mode ?? 'all_must_pass',\n conditions: conditions.map((c, i) => ({\n id: `cond_${c.sourceBlockId}_${c.property}_${i}`,\n name: c.name ?? `Condition from ${c.sourceBlockId}`,\n sourceBlockId: c.sourceBlockId,\n sourceBlockType: c.sourceBlockType ?? 'action',\n rule: {\n type: 'property_value',\n property: c.property,\n operator: toEvaluatorOperator(c.operator),\n value: c.value,\n },\n effect: c.effect ?? { action: 'enable' },\n })),\n });\n}\n","import type { FlowCapability } from '../../types/baseUcan';\n\n/** Default icon per `can` statement. */\nconst ICON_DEFAULTS: Record<string, string> = {\n 'bid/submit': 'gavel',\n 'bid/evaluate': 'check-circle',\n 'claim/submit': 'file-check',\n 'claim/evaluate': 'clipboard-check',\n 'email/send': 'mail',\n 'notification/push': 'bell',\n 'matrix/dm': 'message-circle',\n 'proposal/create': 'scroll',\n 'proposal/vote': 'vote',\n 'domain/card-preview': 'id',\n 'domain/sign': 'feather',\n 'credential/store': 'shield',\n 'http/request': 'cloud',\n 'protocol/select': 'git-branch',\n 'human/checkbox': 'check-square',\n 'human/form': 'file-text',\n 'form/submit': 'file-text',\n 'oracle/query': 'cpu',\n};\n\n/**\n * Compile a FlowCapability into block props for the `action` block type.\n *\n * All capabilities map to the `action` block type — the `actionType` prop\n * routes to the correct registry action at runtime. This is consistent with\n * how the slash menu creates action blocks today.\n *\n * All returned values are strings per BlockNote convention.\n */\nexport function compileBlockProps(cap: FlowCapability, registryType: string): Record<string, string> {\n return {\n title: cap.title || cap.can,\n description: cap.description || '',\n icon: cap.icon || ICON_DEFAULTS[cap.can] || 'bolt',\n actionType: registryType,\n inputs: JSON.stringify(cap.nb || {}),\n requiresConfirmation: '',\n conditions: '', // compiled separately by the compiler\n // Authorization props\n parentCapability: cap.actor?.parentCapability || '',\n authorisedActors: cap.actor?.authorisedActors ? JSON.stringify(cap.actor.authorisedActors) : '',\n // TTL props\n ttlAbsoluteDueDate: cap.ttl?.absoluteDueDate || '',\n ttlFromEnablement: cap.ttl?.fromEnablement || '',\n ttlFromCommitment: cap.ttl?.fromCommitment || '',\n // Trigger props (slice D — events and triggers feature). Stored as a\n // JSON string mirroring how `inputs` serializes `nb`. Default empty\n // string means \"manual\" — the runtime treats absent or empty as manual.\n trigger: cap.trigger ? JSON.stringify(cap.trigger) : '',\n };\n}\n\n/** The BlockNote block type that all capabilities compile to. */\nexport const COMPILED_BLOCK_TYPE = 'action' as const;\n\n/** Get the default icon for a `can` statement. */\nexport function getDefaultIcon(can: string): string {\n return ICON_DEFAULTS[can] || 'bolt';\n}\n","import type { BaseUcanFlow, FlowCapability, CompiledFlow, CompiledBlock, CompiledEdge, CompiledFlowNode, ConditionRef, RuntimeRef, TriggerSpec } from '../../types/baseUcan';\nimport { isRuntimeRef } from '../../types/baseUcan';\nimport type { ActionDefinition } from '../actionRegistry/types';\nimport { getEventsForBlock } from '../actionRegistry/registry';\nimport { compileBlockProps, COMPILED_BLOCK_TYPE } from './blockMapping';\nimport { toEvaluatorOperator } from './conditions';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/** Registry interface expected by the compiler (keeps it pure / testable). */\nexport interface CompilerRegistry {\n getActionByCan(can: string): ActionDefinition | undefined;\n}\n\n/**\n * Compile a Base UCAN flow plan into blocks, graph state, and metadata.\n *\n * This is a **pure function** — no React, no Yjs, no side effects.\n * The output is consumed by `hydrateFlowFromPlan()`.\n */\nexport function compileBaseUcanFlow(plan: BaseUcanFlow, registry: CompilerRegistry): CompiledFlow {\n if (!Array.isArray(plan.capabilities)) {\n throw new Error('BaseUcanFlow.capabilities must be an array');\n }\n\n const capabilities = plan.capabilities;\n if (capabilities.length === 0) {\n throw new Error('BaseUcanFlow has no capabilities to compile');\n }\n\n // 1. Validate every `can` against the registry\n const actionMap = new Map<string, { action: ActionDefinition; nodeId: string; cap: FlowCapability }>();\n for (const cap of capabilities) {\n const nodeId = cap.id?.trim();\n if (!nodeId) {\n throw new Error('Every capability in BaseUcanFlow.capabilities must include a non-empty id.');\n }\n if (actionMap.has(nodeId)) {\n throw new Error(`Duplicate capability id \"${nodeId}\" in BaseUcanFlow.capabilities.`);\n }\n\n const action = registry.getActionByCan(cap.can);\n if (!action) {\n throw new Error(`Unknown capability \"${cap.can}\" for node \"${nodeId}\". Not found in action registry.`);\n }\n actionMap.set(nodeId, { action, nodeId, cap });\n }\n\n // 2. Pre-generate deterministic block IDs (stable for testing)\n const blockIndex: Record<string, string> = {};\n for (const nodeId of actionMap.keys()) {\n blockIndex[nodeId] = generateBlockId(nodeId);\n }\n\n // 3. Validate triggers (slice D — events and triggers feature).\n // For every block.event-triggered listener:\n // a) source block must exist in the plan\n // b) source action must declare an `events` array\n // c) eventName must match a declared event\n // d) every nodeId.output.* ref in the listener's nb must be reachable\n // (the referenced block must exist; the field shape is enforced\n // loosely because output schemas are optional today)\n // Also: synthesize \"trigger\" edges from each block.event trigger so the\n // visual graph and the cycle detector see the dependency.\n const triggerEdges: CompiledEdge[] = [];\n for (const [nodeId, { cap, action }] of actionMap) {\n const trigger = cap.trigger;\n if (!trigger) continue;\n\n // ── block.event (single source) ──────────────────────────────────\n if (trigger.type === 'block.event') {\n if (action.eligibleForEventTrigger !== true) {\n throw new Error(\n `Block \"${nodeId}\" is configured with a block.event trigger, but its action type \"${action.type}\" is not marked eligibleForEventTrigger. Set eligibleForEventTrigger: true on the action definition or change the trigger to manual.`\n );\n }\n\n const sourceId = trigger.sourceBlockId?.trim();\n const eventName = trigger.eventName?.trim();\n if (!sourceId || !eventName) {\n throw new Error(`Block \"${nodeId}\" has a block.event trigger but is missing sourceBlockId or eventName.`);\n }\n\n const source = actionMap.get(sourceId);\n if (!source) {\n throw new Error(`Trigger on block \"${nodeId}\" references unknown source block \"${sourceId}\".`);\n }\n\n // Resolve events per the source block's current inputs; some actions\n // (e.g. claim.submit) derive the event list from configured state.\n const declaredEvents = getEventsForBlock(source.action, source.cap.nb);\n if (declaredEvents.length === 0) {\n throw new Error(`Trigger on block \"${nodeId}\" references event \"${eventName}\" but source action \"${source.action.type}\" declares no events.`);\n }\n\n const found = declaredEvents.find((e) => e.name === eventName);\n if (!found) {\n const declared = declaredEvents.map((e) => e.name).join(', ');\n throw new Error(`Trigger on block \"${nodeId}\" references unknown event \"${eventName}\" on action type \"${source.action.type}\". Declared events: [${declared}]`);\n }\n\n triggerEdges.push({\n id: `${sourceId}~event:${eventName}~>${nodeId}`,\n source: sourceId,\n target: nodeId,\n kind: 'trigger',\n });\n }\n\n if (trigger.type === 'block.event.all') {\n if (action.eligibleForEventTrigger !== true) {\n throw new Error(`Block \"${nodeId}\" is configured with a block.event.all trigger, but its action type \"${action.type}\" is not marked eligibleForEventTrigger.`);\n }\n\n const sources = trigger.sources || [];\n if (sources.length === 0) {\n throw new Error(`Block \"${nodeId}\" has a block.event.all trigger but no sources configured.`);\n }\n\n for (const src of sources) {\n const srcId = src.sourceBlockId?.trim();\n const evtName = src.eventName?.trim();\n if (!srcId || !evtName) {\n throw new Error(`Block \"${nodeId}\" has a block.event.all source with missing sourceBlockId or eventName.`);\n }\n\n const sourceEntry = actionMap.get(srcId);\n if (!sourceEntry) {\n throw new Error(`Barrier trigger on block \"${nodeId}\" references unknown source block \"${srcId}\".`);\n }\n\n const declaredEvents = getEventsForBlock(sourceEntry.action, sourceEntry.cap.nb);\n const found = declaredEvents.find((e) => e.name === evtName);\n if (!found) {\n const declared = declaredEvents.map((e) => e.name).join(', ');\n throw new Error(`Barrier trigger on block \"${nodeId}\" references unknown event \"${evtName}\" on action type \"${sourceEntry.action.type}\". Declared events: [${declared}]`);\n }\n\n if (!src.alias?.trim()) {\n throw new Error(`Barrier trigger on block \"${nodeId}\" has a source (${srcId}/${evtName}) with no alias.`);\n }\n\n triggerEdges.push({\n id: `${srcId}~event:${evtName}~>${nodeId}`,\n source: srcId,\n target: nodeId,\n kind: 'trigger',\n });\n }\n }\n\n // Validate that every nodeId.output.* ref the listener uses points at a\n // block that exists.\n if (trigger.type === 'block.event' || trigger.type === 'block.event.all') {\n const refs = collectOutputRefs(cap.nb || {});\n for (const ref of refs) {\n const parsed = parseOutputRef(ref);\n if (!parsed) continue;\n if (!actionMap.has(parsed.nodeId)) {\n throw new Error(`Listener \"${nodeId}\" references output of unknown block \"${parsed.nodeId}\" via ref \"${ref}\".`);\n }\n }\n }\n }\n\n // 4. Edges = trigger edges only. Synthesized in step 3 from `block.event`\n // triggers. Each one represents a real runtime relationship: source\n // emits an event, listener queues a pending invocation. There are no\n // other edge kinds — sequential ordering is implicit in the\n // capabilities[] array order, not derived from a separate field.\n const edges: CompiledEdge[] = [...triggerEdges];\n\n // 4b. Trigger graph cycle check. A cycle would cause the reconciliation\n // loop to oscillate (A's emission queues B, B's emission queues A,\n // forever). Hard error at compile time.\n detectTriggerCycles(triggerEdges);\n\n // 5. Order = the order capabilities appeared in the input plan.\n // No topological sort. The author is responsible for the order they\n // want; the compiler does not infer it.\n const order = Array.from(actionMap.keys());\n\n // 6. Compile each block in order\n const blocks: CompiledBlock[] = [];\n const nodes: Record<string, CompiledFlowNode> = {};\n\n for (const nodeId of order) {\n const { action, cap } = actionMap.get(nodeId)!;\n const blockId = blockIndex[nodeId];\n\n // Compile base props from the capability\n const props = compileBlockProps(cap, action.type);\n\n // Compile conditions into the block's conditions prop\n if (cap.condition) {\n props.conditions = compileCondition(cap.condition, blockIndex);\n }\n\n // Rewrite trigger source references from the node-id namespace (what\n // plan authors write, validated in step 3) into the block-id namespace\n // before serialization. The runtime reconciler matches props.trigger\n // against real document block ids (`flow_block_<nodeId>`) — a trigger\n // serialized with node ids validates fine but never fires.\n if (cap.trigger) {\n props.trigger = compileTrigger(cap.trigger, blockIndex);\n }\n\n // Stamp the trigger mode prop so the runtime UI knows whether this\n // block is event-driven or manually invoked. Event-driven blocks\n // suppress all manual run affordances and only fire via pending\n // invocations queued by the reconciliation loop. Default 'manual'.\n props.triggerMode = cap.trigger?.type || 'manual';\n\n blocks.push({\n id: blockId,\n type: COMPILED_BLOCK_TYPE,\n props,\n });\n\n nodes[nodeId] = {\n id: nodeId,\n blockId,\n can: cap.can,\n with: cap.with,\n registryType: action.type,\n title: cap.title || cap.can,\n description: cap.description || '',\n props,\n phase: cap.phase,\n parallelGroup: cap.parallelGroup,\n actor: cap.actor,\n };\n }\n\n return {\n meta: {\n flowId: plan.flowId,\n title: plan.title,\n goal: plan.goal,\n version: plan.version,\n flowOwnerDid: plan.meta?.rootIssuer || '',\n flowUri: plan.meta?.flowUri,\n compiledAt: new Date().toISOString(),\n compiledFrom: 'BaseUcanFlow',\n },\n blocks,\n nodes,\n edges,\n order,\n blockIndex,\n };\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────────────\n\n/** Generate a deterministic block ID from a node ID. */\nfunction generateBlockId(nodeId: string): string {\n // Use a prefix to clearly identify compiler-generated blocks\n return `flow_block_${nodeId}`;\n}\n\n/**\n * Compile a ConditionRef into the JSON string format expected by block conditions.\n * Matches the shape used by the existing block conditions system.\n */\nfunction compileCondition(condition: ConditionRef, blockIndex: Record<string, string>): string {\n const sourceBlockId = blockIndex[condition.sourceId];\n if (!sourceBlockId) {\n throw new Error(`Condition references unknown source \"${condition.sourceId}\".`);\n }\n\n const conditionConfig = {\n enabled: true,\n mode: 'all_must_pass',\n conditions: [\n {\n id: `cond_${condition.sourceId}_${condition.field}`,\n name: `Condition from ${condition.sourceId}`,\n sourceBlockId,\n sourceBlockType: COMPILED_BLOCK_TYPE,\n rule: {\n type: 'property_value',\n property: condition.field,\n // Map the BaseUcan ConditionRef operator (eq/neq/…) onto the FE evaluator's\n // vocabulary (equals/not_equals/…). Writing it verbatim is the historical bug\n // that made compiler-authored conditions silently never evaluate.\n operator: toEvaluatorOperator(condition.operator),\n value: condition.value,\n },\n effect: condition.effect || { action: 'enable' },\n },\n ],\n };\n\n return JSON.stringify(conditionConfig);\n}\n\n/**\n * Compile a TriggerSpec into the JSON string stored in props.trigger,\n * remapping every source reference from node id to compiled block id —\n * the same namespace translation compileCondition performs. Trigger\n * validation (step 3) has already guaranteed every source id resolves\n * in blockIndex.\n */\nfunction compileTrigger(trigger: TriggerSpec, blockIndex: Record<string, string>): string {\n if (trigger.type === 'block.event' && trigger.sourceBlockId) {\n return JSON.stringify({ ...trigger, sourceBlockId: blockIndex[trigger.sourceBlockId.trim()] });\n }\n if (trigger.type === 'block.event.all' && trigger.sources) {\n return JSON.stringify({\n ...trigger,\n sources: trigger.sources.map((src) => ({ ...src, sourceBlockId: blockIndex[src.sourceBlockId.trim()] })),\n });\n }\n return JSON.stringify(trigger);\n}\n\n// ─── Trigger validation helpers (slice D — events and triggers) ─────────────\n\n/**\n * Recursively walk an inputs/nb object and collect every RuntimeRef string\n * that targets a node output (i.e. matches `nodeId.output.fieldPath`).\n * Skips `trigger.payload.*` refs which resolve from a different namespace.\n */\nfunction collectOutputRefs(value: unknown): string[] {\n const refs: string[] = [];\n walk(value);\n return refs;\n\n function walk(v: unknown): void {\n if (isRuntimeRef(v)) {\n const r = (v as RuntimeRef).$ref;\n if (!r.startsWith('trigger.')) refs.push(r);\n return;\n }\n if (Array.isArray(v)) {\n for (const item of v) walk(item);\n return;\n }\n if (v !== null && typeof v === 'object') {\n for (const inner of Object.values(v as Record<string, unknown>)) walk(inner);\n }\n }\n}\n\n/** Parse `\"nodeId.output.fieldPath\"` into its parts; returns null if not a node-output ref. */\nfunction parseOutputRef(ref: string): { nodeId: string; fieldPath: string } | null {\n const outputIndex = ref.indexOf('.output.');\n if (outputIndex === -1) return null;\n return {\n nodeId: ref.slice(0, outputIndex),\n fieldPath: ref.slice(outputIndex + '.output.'.length),\n };\n}\n\n/**\n * Detect cycles in the trigger graph.\n *\n * A trigger cycle would mean: block A's event triggers block B, whose event\n * triggers block C, whose event triggers block A. The reconciliation loop\n * would oscillate forever queueing pending invocations. Hard error.\n *\n * Implementation: standard DFS with three-color marking (white/gray/black).\n * If we hit a gray node during DFS, we're inside its own subtree — that's\n * the cycle. ~30 lines and runs in O(V + E) which is sub-millisecond at any\n * realistic block count.\n */\nfunction detectTriggerCycles(triggerEdges: CompiledEdge[]): void {\n if (triggerEdges.length === 0) return;\n\n const adjacency = new Map<string, string[]>();\n const allNodes = new Set<string>();\n for (const edge of triggerEdges) {\n if (!adjacency.has(edge.source)) adjacency.set(edge.source, []);\n adjacency.get(edge.source)!.push(edge.target);\n allNodes.add(edge.source);\n allNodes.add(edge.target);\n }\n\n const WHITE = 0;\n const GRAY = 1;\n const BLACK = 2;\n const color = new Map<string, number>();\n for (const id of allNodes) color.set(id, WHITE);\n\n const path: string[] = [];\n\n const visit = (node: string): void => {\n color.set(node, GRAY);\n path.push(node);\n for (const next of adjacency.get(node) || []) {\n if (color.get(next) === GRAY) {\n // Found the back-edge. Build a readable cycle path.\n const start = path.indexOf(next);\n const cycle = path.slice(start).concat(next).join(' → ');\n throw new Error(`Trigger cycle detected: ${cycle}. Block.event triggers must form a DAG; remove one of the trigger declarations to break the cycle.`);\n }\n if (color.get(next) === WHITE) {\n visit(next);\n }\n }\n path.pop();\n color.set(node, BLACK);\n };\n\n for (const id of allNodes) {\n if (color.get(id) === WHITE) visit(id);\n }\n}\n","import * as Y from 'yjs';\nimport type { CompiledBlock } from '../../types/baseUcan';\nimport type { MergeResult } from './mergeFlows';\n\n/**\n * Writes compiled blocks into BlockNote's collaborative XmlFragment using the\n * ProseMirror/Yjs structure that BlockNote reads from collaboration.\n */\nexport function writeCompiledBlocksToFragment(fragment: Y.XmlFragment, blocks: CompiledBlock[]): void {\n const documentBlockGroup = getOrCreateDocumentBlockGroup(fragment);\n\n for (const block of blocks) {\n appendBlockToGroup(documentBlockGroup, block);\n }\n}\n\n/**\n * Remove all block containers from the document fragment.\n * Used by the `full` strategy to clear existing blocks before rebuilding.\n */\nexport function removeAllFlowBlocks(fragment: Y.XmlFragment): void {\n const blockGroup = getExistingBlockGroup(fragment);\n if (!blockGroup) return;\n\n // Delete all children from the blockGroup\n while (blockGroup.length > 0) {\n blockGroup.delete(0, 1);\n }\n}\n\n/**\n * Remove a single block container by its block ID.\n * Returns `true` if the block was found and removed.\n */\nexport function removeBlockFromFragment(fragment: Y.XmlFragment, blockId: string): boolean {\n const blockGroup = getExistingBlockGroup(fragment);\n if (!blockGroup) return false;\n\n for (let i = 0; i < blockGroup.length; i++) {\n const container = blockGroup.get(i);\n if (container instanceof Y.XmlElement && container.getAttribute('id') === blockId) {\n blockGroup.delete(i, 1);\n return true;\n }\n }\n return false;\n}\n\n/**\n * Replace a block container in-place (same position) by its block ID.\n * Returns `true` if the block was found and replaced.\n */\nexport function replaceBlockInFragment(fragment: Y.XmlFragment, block: CompiledBlock): boolean {\n const blockGroup = getExistingBlockGroup(fragment);\n if (!blockGroup) return false;\n\n for (let i = 0; i < blockGroup.length; i++) {\n const container = blockGroup.get(i);\n if (container instanceof Y.XmlElement && container.getAttribute('id') === block.id) {\n blockGroup.delete(i, 1);\n const newContainer = createBlockContainer(block);\n blockGroup.insert(i, [newContainer]);\n return true;\n }\n }\n return false;\n}\n\n/**\n * Swap the document positions of two block containers, identified by block id.\n * Uses `clone()` so each block — including any inline/prose content — moves\n * intact (its `id` attribute is preserved, so runtime/graph linkage keyed on the\n * block id survives). Non-target blocks between them keep their positions.\n *\n * Returns `false` if either id is missing or they resolve to the same container.\n */\nexport function swapBlocksInFragment(fragment: Y.XmlFragment, idA: string, idB: string): boolean {\n const blockGroup = getExistingBlockGroup(fragment);\n if (!blockGroup) return false;\n\n let ia = -1;\n let ib = -1;\n for (let i = 0; i < blockGroup.length; i++) {\n const container = blockGroup.get(i);\n if (container instanceof Y.XmlElement) {\n const id = container.getAttribute('id');\n if (id === idA) ia = i;\n else if (id === idB) ib = i;\n }\n }\n if (ia < 0 || ib < 0 || ia === ib) return false;\n\n const lo = Math.min(ia, ib);\n const hi = Math.max(ia, ib);\n const loClone = (blockGroup.get(lo) as Y.XmlElement).clone();\n const hiClone = (blockGroup.get(hi) as Y.XmlElement).clone();\n\n // Rewrite the higher index first so the lower index stays valid.\n blockGroup.delete(hi, 1);\n blockGroup.insert(hi, [loClone]);\n blockGroup.delete(lo, 1);\n blockGroup.insert(lo, [hiClone]);\n return true;\n}\n\n/**\n * Apply a MergeResult to the document fragment.\n * Replaces changed blocks in-place and appends new blocks.\n */\nexport function applyMergeResultToFragment(fragment: Y.XmlFragment, mergeResult: MergeResult): void {\n const documentBlockGroup = getOrCreateDocumentBlockGroup(fragment);\n\n // Build a lookup from nodeId → block for the merged output\n const blockByNodeId = new Map<string, CompiledBlock>();\n for (const block of mergeResult.merged.blocks) {\n // blockId is `flow_block_{nodeId}`, reverse-map to nodeId\n for (const [nodeId, blockId] of Object.entries(mergeResult.merged.blockIndex)) {\n if (blockId === block.id) {\n blockByNodeId.set(nodeId, block);\n break;\n }\n }\n }\n\n // Replace existing blocks that were patched\n for (const nodeId of mergeResult.replaced) {\n const block = blockByNodeId.get(nodeId);\n if (block) {\n replaceBlockInFragment(fragment, block);\n }\n }\n\n // Append new blocks\n for (const nodeId of mergeResult.added) {\n const block = blockByNodeId.get(nodeId);\n if (block) {\n appendBlockToGroup(documentBlockGroup, block);\n }\n }\n}\n\n/**\n * Read all blocks (with their props) back out of the document fragment.\n *\n * The inverse of `writeCompiledBlocksToFragment` / `createBlockContainer`: walks the single\n * `blockGroup` and, for each `blockContainer`, returns `{ id, type, props }` where `props` is\n * the inner `blockContent` element's attributes — the **authoritative per-block prop store**\n * (the `qi.flow.nodes` map omits props, so this is the only place to recover them headlessly).\n *\n * `textColor`/`backgroundColor` are folded back into `props` only when non-`'default'`, so a\n * default-styled block round-trips to exactly its content props. Note: props written as `''`\n * are not persisted by `createBlockContainer`, so they do not reappear here.\n *\n * Returns `[]` when the fragment has no `blockGroup`.\n */\nexport function readBlocksFromFragment(fragment: Y.XmlFragment): CompiledBlock[] {\n const blockGroup = getExistingBlockGroup(fragment);\n if (!blockGroup) return [];\n\n const blocks: CompiledBlock[] = [];\n for (let i = 0; i < blockGroup.length; i++) {\n const container = blockGroup.get(i);\n if (!(container instanceof Y.XmlElement) || container.nodeName !== 'blockContainer') continue;\n\n const id = container.getAttribute('id');\n if (typeof id !== 'string' || id.length === 0) continue;\n\n const content = container.get(0);\n if (!(content instanceof Y.XmlElement)) continue;\n\n const props: Record<string, string> = { ...(content.getAttributes() as Record<string, string>) };\n\n // createBlockContainer hoists the color attrs onto the container and defaults them to\n // 'default'. Fold them back only when explicitly set, so a default block's props match\n // exactly what was written (no color noise).\n const textColor = container.getAttribute('textColor');\n if (typeof textColor === 'string' && textColor !== 'default') props.textColor = textColor;\n const backgroundColor = container.getAttribute('backgroundColor');\n if (typeof backgroundColor === 'string' && backgroundColor !== 'default') props.backgroundColor = backgroundColor;\n\n blocks.push({ id, type: content.nodeName, props });\n }\n\n return blocks;\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────────────\n\n/** Create a blockContainer XmlElement from a CompiledBlock. */\nfunction createBlockContainer(block: CompiledBlock): Y.XmlElement {\n const blockContainer = new Y.XmlElement('blockContainer');\n const { backgroundColor: rawBackgroundColor, textColor: rawTextColor, ...contentProps } = block.props;\n\n blockContainer.setAttribute('id', block.id);\n blockContainer.setAttribute('textColor', rawTextColor || 'default');\n blockContainer.setAttribute('backgroundColor', rawBackgroundColor || 'default');\n\n const blockContent = new Y.XmlElement(block.type);\n for (const [key, value] of Object.entries(contentProps)) {\n if (value !== '') {\n blockContent.setAttribute(key, value);\n }\n }\n\n blockContainer.insert(0, [blockContent]);\n return blockContainer;\n}\n\n/** Append a single block to a blockGroup. */\nfunction appendBlockToGroup(blockGroup: Y.XmlElement, block: CompiledBlock): void {\n const container = createBlockContainer(block);\n blockGroup.insert(blockGroup.length, [container]);\n}\n\nfunction getOrCreateDocumentBlockGroup(fragment: Y.XmlFragment): Y.XmlElement {\n if (fragment.length === 0) {\n const blockGroup = new Y.XmlElement('blockGroup');\n fragment.insert(0, [blockGroup]);\n return blockGroup;\n }\n\n if (fragment.length === 1) {\n const rootNode = fragment.get(0);\n if (rootNode instanceof Y.XmlElement && rootNode.nodeName === 'blockGroup') {\n return rootNode;\n }\n }\n\n throw new Error('Unexpected BlockNote document shape in XmlFragment. ' + 'Expected a single top-level blockGroup node.');\n}\n\n/** Get the existing blockGroup or null if the fragment is empty. */\nfunction getExistingBlockGroup(fragment: Y.XmlFragment): Y.XmlElement | null {\n if (fragment.length === 0) return null;\n\n if (fragment.length === 1) {\n const rootNode = fragment.get(0);\n if (rootNode instanceof Y.XmlElement && rootNode.nodeName === 'blockGroup') {\n return rootNode;\n }\n }\n\n return null;\n}\n","import type { Doc as YDoc, Map as YMap } from 'yjs';\nimport * as Y from 'yjs';\nimport type { CompiledFlow, CompiledFlowNode, CompiledEdge, CompiledBlock } from '../../types/baseUcan';\nimport { COMPILED_BLOCK_TYPE } from './blockMapping';\n\n/**\n * Read the current compiled flow state from a live Y.Doc.\n *\n * This is the inverse of `hydrateYDocFromCompiledFlow`. It extracts the flow\n * graph state from Yjs maps so that the pure merge/patch logic can operate\n * on plain objects.\n *\n * Returns `null` if the document has no flow state.\n */\nexport function readCompiledFlowFromYDoc(yDoc: YDoc): CompiledFlow | null {\n // ── qi.flow.meta ──\n const flowMeta = yDoc.getMap('qi.flow.meta');\n\n // ── qi.flow.nodes ──\n // Read this BEFORE deciding null. Old behavior returned null on empty\n // flowId, which broke the read for any flow whose plan was authored\n // with `flowId: \"\"` (the documented agent convention). The right\n // signal that the room has no flow is \"no nodes AND no meta,\" not\n // \"flowId is falsy.\"\n const flowNodes = yDoc.getMap('qi.flow.nodes');\n const nodes: Record<string, CompiledFlowNode> = {};\n flowNodes.forEach((value, nodeId) => {\n if (value instanceof Y.Map) {\n nodes[nodeId] = yMapToFlowNode(value);\n }\n });\n\n if (flowNodes.size === 0 && flowMeta.size === 0) {\n return null;\n }\n\n const meta = {\n flowId: (flowMeta.get('flowId') as string) || '',\n title: (flowMeta.get('title') as string) || '',\n goal: flowMeta.get('goal') as string | undefined,\n version: (flowMeta.get('version') as string) || '',\n flowOwnerDid: (flowMeta.get('flowOwnerDid') as string) || '',\n flowUri: flowMeta.get('flowUri') as string | undefined,\n compiledAt: (flowMeta.get('compiledAt') as string) || '',\n compiledFrom: 'BaseUcanFlow' as const,\n };\n\n // ── qi.flow.edges ──\n const flowEdges = yDoc.getMap('qi.flow.edges');\n const edges: CompiledEdge[] = [];\n flowEdges.forEach((value) => {\n if (value instanceof Y.Map) {\n edges.push(yMapToEdge(value));\n }\n });\n\n // ── qi.flow.order ──\n const flowOrder = yDoc.getArray<string>('qi.flow.order');\n const order = flowOrder.toArray();\n\n // ── qi.flow.blockIndex ──\n const flowBlockIndex = yDoc.getMap('qi.flow.blockIndex');\n const blockIndex: Record<string, string> = {};\n flowBlockIndex.forEach((value, key) => {\n blockIndex[key] = value as string;\n });\n\n // ── Reconstruct blocks from nodes (in topological order) ──\n const blocks: CompiledBlock[] = order\n .filter((nodeId) => nodes[nodeId])\n .map((nodeId) => {\n const node = nodes[nodeId];\n return {\n id: node.blockId,\n type: COMPILED_BLOCK_TYPE,\n props: { ...node.props },\n };\n });\n\n return { meta, blocks, nodes, edges, order, blockIndex };\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────────────\n\nfunction yMapToFlowNode(yMap: YMap<unknown>): CompiledFlowNode {\n return {\n id: (yMap.get('id') as string) || '',\n blockId: (yMap.get('blockId') as string) || '',\n can: (yMap.get('can') as string) || '',\n with: (yMap.get('with') as string) || '',\n registryType: (yMap.get('registryType') as string) || '',\n title: (yMap.get('title') as string) || '',\n description: (yMap.get('description') as string) || '',\n props: (yMap.get('props') as Record<string, string>) || {},\n phase: yMap.get('phase') as string | undefined,\n parallelGroup: yMap.get('parallelGroup') as string | undefined,\n actor: yMap.get('actor') as CompiledFlowNode['actor'],\n };\n}\n\nfunction yMapToEdge(yMap: YMap<unknown>): CompiledEdge {\n return {\n id: (yMap.get('id') as string) || '',\n source: (yMap.get('source') as string) || '',\n target: (yMap.get('target') as string) || '',\n // Only 'trigger' edges exist. Legacy 'dependency' edges from older\n // Y.Docs (before dependsOn was removed) get coerced — they'll be\n // overwritten on the next compile pass.\n kind: 'trigger',\n condition: yMap.get('condition') as CompiledEdge['condition'],\n };\n}\n","import type { CompiledFlow, CompiledFlowNode, CompiledEdge, CompiledBlock } from '../../types/baseUcan';\nimport { COMPILED_BLOCK_TYPE } from './blockMapping';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/** Describes what changed when merging two compiled flows. */\nexport interface MergeResult {\n /** The merged compiled flow (full state). */\n merged: CompiledFlow;\n /** Node IDs that were added (new in incoming, not in existing). */\n added: string[];\n /** Node IDs that were replaced (patch only — existed and was overwritten). */\n replaced: string[];\n /** Node IDs that were kept unchanged from existing. */\n kept: string[];\n}\n\n/**\n * Merge an incoming compiled flow into an existing one.\n *\n * This is a **pure function** — no Yjs, no side effects.\n *\n * Strategies:\n * - `merge`: existing nodes win on ID collision. Incoming nodes with new IDs\n * are added. Existing nodes are never modified.\n * - `patch`: incoming nodes overwrite existing nodes on ID collision. Incoming\n * nodes with new IDs are added. Existing nodes not in incoming are kept.\n *\n * Edges in the merged result are the union of edges from both sides, filtered\n * to those whose source and target both exist in the merged node set, with\n * duplicates collapsed by edge id. Order is the merged node insertion order\n * (existing first, then newly added) — there is no topological sort because\n * there is no inferred dependency relationship.\n */\nexport function mergeCompiledFlows(existing: CompiledFlow, incoming: CompiledFlow, strategy: 'merge' | 'patch'): MergeResult {\n const added: string[] = [];\n const replaced: string[] = [];\n const kept: string[] = [];\n\n // Build the merged node set\n const mergedNodes: Record<string, CompiledFlowNode> = {};\n const mergedBlockIndex: Record<string, string> = {};\n\n // Start with existing nodes\n for (const [nodeId, node] of Object.entries(existing.nodes)) {\n mergedNodes[nodeId] = node;\n mergedBlockIndex[nodeId] = existing.blockIndex[nodeId];\n }\n\n // Apply incoming nodes based on strategy\n for (const [nodeId, node] of Object.entries(incoming.nodes)) {\n if (mergedNodes[nodeId]) {\n if (strategy === 'patch') {\n // Patch: incoming overwrites existing\n mergedNodes[nodeId] = node;\n mergedBlockIndex[nodeId] = incoming.blockIndex[nodeId];\n replaced.push(nodeId);\n } else {\n // Merge: existing wins, skip incoming\n kept.push(nodeId);\n }\n } else {\n // New node in both strategies\n mergedNodes[nodeId] = node;\n mergedBlockIndex[nodeId] = incoming.blockIndex[nodeId];\n added.push(nodeId);\n }\n }\n\n // Mark existing nodes that weren't replaced as kept\n for (const nodeId of Object.keys(existing.nodes)) {\n if (!replaced.includes(nodeId)) {\n kept.push(nodeId);\n }\n }\n\n // Merge edges from both sides, filter to those whose endpoints survive,\n // dedupe by id (last write wins on dupes — irrelevant since edges are\n // content-derived from trigger props and identical inputs produce identical\n // edge ids).\n const edgeMap = new Map<string, CompiledEdge>();\n for (const edge of [...existing.edges, ...incoming.edges]) {\n if (mergedNodes[edge.source] && mergedNodes[edge.target]) {\n edgeMap.set(edge.id, edge);\n }\n }\n const edges = Array.from(edgeMap.values());\n\n // Order = the natural insertion order of the merged node map\n // (existing first, then newly added). No topological sort.\n const order = Object.keys(mergedNodes);\n\n // Build blocks array in the same order\n const blocks: CompiledBlock[] = order.map((nodeId) => {\n const node = mergedNodes[nodeId];\n return {\n id: node.blockId,\n type: COMPILED_BLOCK_TYPE,\n props: { ...node.props },\n };\n });\n\n // Use incoming meta (newer timestamp) but preserve existing flowId\n const meta = {\n ...incoming.meta,\n flowId: existing.meta.flowId,\n compiledAt: new Date().toISOString(),\n };\n\n return {\n merged: { meta, blocks, nodes: mergedNodes, edges, order, blockIndex: mergedBlockIndex },\n added,\n replaced,\n kept,\n };\n}\n","import type { BaseUcanFlow, CompiledFlow, CompiledFlowNode, FlowCapability, ActorConstraint, TTLConstraint, TriggerSpec } from '../../types/baseUcan';\n\n/**\n * Reconstruct a BaseUcanFlow plan from a CompiledFlow.\n *\n * This is the inverse of `compileBaseUcanFlow`. It allows the AI agent to\n * read the current flow in the same format it writes — a plain capability\n * list it can reason about, modify, and pass back to the compiler.\n *\n * This is a **pure function** — no Yjs, no side effects.\n *\n * Note: some information is lossy (e.g. conditions are stored as a JSON\n * string in props and are not fully round-tripped back to ConditionRef).\n * The core capability data (can, with, nb, trigger, actor, ttl, metadata)\n * is fully preserved.\n */\nexport function decompileToBaseUcanFlow(compiled: CompiledFlow): BaseUcanFlow {\n // Reverse of the compiler's blockIndex (blockId → nodeId), used to map\n // trigger source references — serialized as block ids in props.trigger\n // for the runtime reconciler — back into the node-id namespace the plan\n // format uses (and the compiler validates against).\n const nodeIdByBlockId: Record<string, string> = {};\n for (const [nodeId, blockId] of Object.entries(compiled.blockIndex)) {\n nodeIdByBlockId[blockId] = nodeId;\n }\n\n const capabilities: FlowCapability[] = compiled.order.map((nodeId) => {\n const node = compiled.nodes[nodeId];\n return nodeToCapability(node, nodeIdByBlockId);\n });\n\n return {\n kind: 'qi.flow.base-ucan',\n version: '1.0',\n flowId: compiled.meta.flowId,\n title: compiled.meta.title,\n goal: compiled.meta.goal,\n meta: {\n rootIssuer: compiled.meta.flowOwnerDid || undefined,\n flowUri: compiled.meta.flowUri,\n },\n capabilities,\n };\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────────────\n\nfunction nodeToCapability(node: CompiledFlowNode, nodeIdByBlockId: Record<string, string>): FlowCapability {\n const cap: FlowCapability = {\n id: node.id,\n can: node.can,\n with: node.with,\n };\n\n // ── nb (caveats) — stored as JSON string in props.inputs ──\n if (node.props.inputs) {\n try {\n const nb = JSON.parse(node.props.inputs);\n if (nb && typeof nb === 'object' && Object.keys(nb).length > 0) {\n cap.nb = nb;\n }\n } catch {\n // props.inputs wasn't valid JSON — skip\n }\n }\n\n // ── Workflow topology ──\n if (node.parallelGroup) {\n cap.parallelGroup = node.parallelGroup;\n }\n\n if (node.phase) {\n cap.phase = node.phase;\n }\n\n // ── Authorization ──\n if (node.actor) {\n cap.actor = { ...node.actor } as ActorConstraint;\n }\n\n // ── TTL — stored in individual props ──\n const ttl: TTLConstraint = {};\n if (node.props.ttlAbsoluteDueDate) ttl.absoluteDueDate = node.props.ttlAbsoluteDueDate;\n if (node.props.ttlFromEnablement) ttl.fromEnablement = node.props.ttlFromEnablement;\n if (node.props.ttlFromCommitment) ttl.fromCommitment = node.props.ttlFromCommitment;\n if (Object.keys(ttl).length > 0) {\n cap.ttl = ttl;\n }\n\n // ── Trigger — stored as JSON string in props.trigger ──\n // Mirrors how `nb` round-trips through props.inputs. Empty / missing /\n // unparseable trigger means manual (the compiler treats absent trigger\n // as type='manual'), so we omit the field in that case to keep the\n // round-tripped plan minimal.\n if (typeof node.props.trigger === 'string' && node.props.trigger.length > 0) {\n try {\n const trigger = JSON.parse(node.props.trigger) as Partial<TriggerSpec>;\n if (trigger && typeof trigger === 'object' && typeof trigger.type === 'string') {\n cap.trigger = triggerToNodeIds(trigger as TriggerSpec, nodeIdByBlockId);\n }\n } catch {\n // props.trigger wasn't valid JSON — skip, treat as manual\n }\n }\n\n // ── Human-facing metadata ──\n // Title: only set if it differs from the `can` string (compiler falls back to can)\n if (node.title && node.title !== node.can) {\n cap.title = node.title;\n }\n\n if (node.description) {\n cap.description = node.description;\n }\n\n if (node.props.icon) {\n cap.icon = node.props.icon;\n }\n\n return cap;\n}\n\n/**\n * Map trigger source references from the block-id namespace back to node\n * ids so the round-tripped plan validates against the compiler. Ids with\n * no reverse-index entry pass through unchanged — that covers documents\n * compiled before the compiler remapped trigger sources, whose triggers\n * already carry node ids.\n */\nfunction triggerToNodeIds(trigger: TriggerSpec, nodeIdByBlockId: Record<string, string>): TriggerSpec {\n if (trigger.type === 'block.event' && trigger.sourceBlockId) {\n return { ...trigger, sourceBlockId: nodeIdByBlockId[trigger.sourceBlockId] ?? trigger.sourceBlockId };\n }\n if (trigger.type === 'block.event.all' && trigger.sources) {\n return {\n ...trigger,\n sources: trigger.sources.map((src) => ({ ...src, sourceBlockId: nodeIdByBlockId[src.sourceBlockId] ?? src.sourceBlockId })),\n };\n }\n return trigger;\n}\n","import * as Y from 'yjs';\nimport { MatrixProvider } from '@ixo/matrix-crdt';\nimport type { MatrixClient } from 'matrix-js-sdk';\nimport type { BaseUcanFlow, CompiledFlow, FlowStrategy } from '../../types/baseUcan';\nimport { compileBaseUcanFlow } from './compiler';\nimport { hydrateYDocFromCompiledFlow, initializeRuntime, clearFlowState, hydrateYDocFromMergeResult, initializeRuntimeForNodes } from './hydrate';\nimport { getActionByCan } from '../actionRegistry';\nimport { writeCompiledBlocksToFragment, removeAllFlowBlocks, applyMergeResultToFragment } from './documentFragment';\nimport { readCompiledFlowFromYDoc } from './readFlow';\nimport { mergeCompiledFlows } from './mergeFlows';\nimport { decompileToBaseUcanFlow } from './decompile';\nimport { collectPhantomLegacyRun, hasLegacyRuntimeHistory, setMultiRunStorage } from '../flowEngine/runs';\n\n// ─── Public Types ───────────────────────────────────────────────────────────\n\nexport interface SetupFlowOptions {\n /** The Base UCAN flow plan to compile. */\n plan: BaseUcanFlow;\n /** Matrix room ID to hydrate the flow into. */\n roomId: string;\n /** Authenticated Matrix client. */\n matrixClient: MatrixClient;\n /** DID of the user setting up the flow. */\n creatorDid: string;\n /** Optional doc ID override (defaults to plan.flowId). */\n docId?: string;\n /**\n * Room ID of the template this flow was instantiated from, if any.\n * Recorded into the root map as `source_template_id` for lineage tracking.\n */\n templateId?: string;\n /**\n * How to apply the plan to the existing document.\n * - `full` (default): wipe existing flow state and rebuild entirely.\n * - `merge`: keep existing blocks, add new capabilities from the plan.\n * - `patch`: replace matching nodes, add new ones, keep the rest.\n */\n strategy?: FlowStrategy;\n}\n\nexport interface SetupFlowResult {\n /** The compiled flow artifacts. */\n compiled: CompiledFlow;\n /** The room ID (same as input, for convenience). */\n roomId: string;\n /** The flow ID from the plan. */\n flowId: string;\n}\n\nexport interface ReadFlowOptions {\n /** Matrix room ID to read from. */\n roomId: string;\n /** Authenticated Matrix client. */\n matrixClient: MatrixClient;\n}\n\nexport interface ReadFlowResult {\n /** The current flow plan in BaseUcanFlow format (what the agent reads/writes). */\n plan: BaseUcanFlow;\n /** The compiled flow state (lower-level representation). */\n compiled: CompiledFlow;\n /** The room ID (same as input, for convenience). */\n roomId: string;\n}\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Read the current Base UCAN flow plan from a Matrix room.\n *\n * Connects to the room, reads the Y.Doc, decompiles the flow state\n * back into a `BaseUcanFlow`, and disconnects. Returns `null` if the\n * room has no flow state.\n *\n * **This is the lower-level API.** It exists for cases where you need\n * to read a flow from a room you are NOT currently editing — e.g.\n * cross-room operations or background reads. For the common case of\n * \"read the flow the user is currently looking at,\" use\n * `readFlowFromEditor(editor)` instead. That function takes no\n * parameters from the agent and reads from the editor's existing\n * Y.Doc directly — no Matrix connection, no async, no room ID\n * resolution. The browser tool that exposes `read_flow` to the AI\n * agent should wrap `readFlowFromEditor`, not this function.\n */\nexport async function readFlowAsBaseUcan(options: ReadFlowOptions): Promise<ReadFlowResult | null> {\n const { roomId, matrixClient } = options;\n\n // `adoptRuns: false` is load-bearing, not a default being spelled out.\n // This function is documented as read-only and is pointed at rooms the caller\n // is not editing. Adoption is a *writer* — it materialises `runs` containers\n // — and there is no \"it never escapes\" get-out: `MatrixProvider` hooks\n // `doc.on('update')` in its constructor, and `ThrottledMatrixWriter`'s flush\n // is a lodash throttle with the default `leading: true`, so the very first\n // local write starts an HTTP send synchronously. `dispose()` calls\n // `.cancel()`, which drops only a pending *trailing* invocation; it cannot\n // abort a request already in flight.\n const { yDoc, provider } = await connectToRoom(roomId, matrixClient, { adoptRuns: false });\n\n try {\n const compiled = readCompiledFlowFromYDoc(yDoc);\n if (!compiled) return null;\n\n const plan = decompileToBaseUcanFlow(compiled);\n\n return { plan, compiled, roomId };\n } finally {\n provider.dispose();\n yDoc.destroy();\n }\n}\n\n/**\n * Minimal editor shape required by `readFlowFromEditor` and the active\n * editor registry. The full `IxoEditorType` is fine to pass — this is\n * just a structural lower bound so test harnesses can construct fake\n * editors without pulling in React dependencies.\n */\nexport interface ReadableEditor {\n _yDoc?: import('yjs').Doc;\n getRoomId?: () => string;\n}\n\n/**\n * Read the current flow from a specific editor instance, synchronously.\n *\n * Use this when you have an editor reference in hand (e.g. from inside a\n * React component, a test, or a multi-editor host that needs to target a\n * specific instance). For the common case of \"read the flow the user is\n * currently looking at,\" prefer the parameterless `readFlow()` below — it\n * uses the active editor registry so you don't have to thread an editor\n * reference through your call sites.\n *\n * Returns `null` ONLY when the editor's Y.Doc has no flow state at all\n * (no nodes AND no meta). An empty `flowId` string is no longer treated\n * as \"no flow\" — that was the historical bug where successful\n * `setup_flow` calls authored with `flowId: \"\"` (the documented agent\n * convention) showed up as null on subsequent reads.\n */\nexport function readFlowFromEditor(editor: ReadableEditor): ReadFlowResult | null {\n const yDoc = editor._yDoc;\n if (!yDoc) return null;\n\n const compiled = readCompiledFlowFromYDoc(yDoc);\n if (!compiled) return null;\n\n const plan = decompileToBaseUcanFlow(compiled);\n const roomId = editor.getRoomId?.() || '';\n\n return { plan, compiled, roomId };\n}\n\n// ─── Active editor registry ─────────────────────────────────────────────────\n//\n// Module-level state holding the editor instance the user is currently\n// interacting with. The collaborative editor mount hook\n// (`useCreateCollaborativeIxoEditor`) registers the editor on mount and\n// clears it on unmount.\n//\n// The registry exists so that exported library functions like `readFlow()`\n// and any agent browser tool can be parameterless. The agent doesn't have\n// to pass an editor reference; the editor package keeps track of which\n// instance is live.\n//\n// **Single-editor assumption.** This is a singleton. If a host app ever\n// mounts two editors in the same JS context, only the most recently\n// registered one is reachable through `readFlow()`. Use\n// `readFlowFromEditor(editor)` (the explicit form) when you need to target\n// a specific instance — tests and multi-editor hosts both go this route.\n\nlet activeEditor: ReadableEditor | null = null;\n\n/**\n * Register an editor as the current active editor. Called by the editor's\n * mount hook when the document is connected and ready. Pass `null` on\n * unmount to clear the registry.\n *\n * If a different editor is already registered, it is replaced silently —\n * the most recent registration wins. This matches the single-editor\n * assumption above.\n */\nexport function setActiveEditor(editor: ReadableEditor | null): void {\n activeEditor = editor;\n}\n\n/**\n * Get the currently registered active editor, or null if none is set.\n * Provided for cases where a caller wants to check the registry directly\n * (e.g. for diagnostics) without going through `readFlow()`.\n */\nexport function getActiveEditor(): ReadableEditor | null {\n return activeEditor;\n}\n\n/**\n * Read the current flow from the active editor, with no parameters at all.\n *\n * This is the parameterless API the AI agent's `read_flow` browser tool\n * should wrap. The browser tool literally becomes `read_flow: () => readFlow()`.\n *\n * Returns `null` if there is no active editor registered (e.g. the editor\n * hasn't finished mounting yet, or no editor is open in this JS context),\n * OR if the active editor's Y.Doc has no flow state at all.\n *\n * If `null` is returned and the user is referencing an existing flow, that\n * is a hard signal to STOP and report to the user — never silently rebuild,\n * because the duplicate-blocks bug is the inevitable consequence.\n */\nexport function readFlow(): ReadFlowResult | null {\n if (!activeEditor) {\n console.warn('[readFlow] No active editor registered. Did the editor finish mounting?');\n return null;\n }\n return readFlowFromEditor(activeEditor);\n}\n\n/**\n * One-shot function that compiles a Base UCAN flow plan and writes it\n * into a Matrix room's Y.Doc. After this completes, the room is a\n * normal flow that anyone can open via `useCreateCollaborativeIxoEditor`.\n *\n * Supports three strategies:\n * - `full` (default): clears any existing flow and rebuilds from scratch.\n * - `merge`: adds new capabilities alongside existing ones.\n * - `patch`: replaces matching nodes and adds new ones.\n */\nexport async function setupFlowFromBaseUcan(options: SetupFlowOptions): Promise<SetupFlowResult> {\n const { plan: rawPlan, roomId, matrixClient, creatorDid, docId, templateId, strategy = 'full' } = options;\n\n // The agent convention is \"leave flowId empty — set at instantiation.\"\n // The runtime is responsible for honoring that. If the plan came in with\n // an empty flowId, fill it from docId or roomId so the resulting Y.Doc\n // has a non-empty `qi.flow.meta.flowId`. Without this, downstream reads\n // that check the flowId field as a presence signal would silently treat\n // a real flow as missing — which was the read_flow null bug.\n const plan = rawPlan.flowId ? rawPlan : { ...rawPlan, flowId: docId || roomId };\n\n // 1. Compile the incoming plan (pure, synchronous)\n const incomingCompiled = compileBaseUcanFlow(plan, { getActionByCan });\n\n // 2. Connect to the Matrix room. This IS a writer path, so adoption is on:\n // every generation that opens the doc must converge on the same shape.\n const { yDoc, provider } = await connectToRoom(roomId, matrixClient, { adoptRuns: true });\n\n let finalCompiled: CompiledFlow;\n\n try {\n finalCompiled = applyFlowPlanToYDoc(yDoc, { plan, incomingCompiled, creatorDid, docId, templateId, strategy });\n\n // Wait for the provider to flush all writes to Matrix\n await provider.waitForFlush();\n } finally {\n provider.dispose();\n yDoc.destroy();\n }\n\n return {\n compiled: finalCompiled,\n roomId,\n flowId: plan.flowId,\n };\n}\n\nexport interface ApplyFlowPlanOptions {\n plan: BaseUcanFlow;\n /** `compileBaseUcanFlow(plan, …)` — passed in so this function stays synchronous and pure of the registry. */\n incomingCompiled: CompiledFlow;\n creatorDid: string;\n docId?: string;\n templateId?: string;\n strategy: FlowStrategy;\n /** Session run to (re-)initialise. Phase A: always the single legacy run. */\n runId?: string;\n}\n\n/**\n * Apply a compiled plan to an already-connected Y.Doc — the whole doc-mutating\n * body of {@link setupFlowFromBaseUcan}, with no Matrix in it.\n *\n * Extracted so the rebuild path is directly testable. It is the path that\n * poisons a live room if it is not run-aware: block ids are deterministic\n * (`flow_block_<nodeId>`), so a `full` rebuild that clears only the flat\n * `runtime` map leaves the pre-rebuild `completed` run entries matching the\n * newly-written blocks one-for-one, and every one of them reads back as\n * pre-completed.\n */\nexport function applyFlowPlanToYDoc(yDoc: Y.Doc, options: ApplyFlowPlanOptions): CompiledFlow {\n const { plan, incomingCompiled, creatorDid, docId, templateId, strategy, runId } = options;\n\n const root = yDoc.getMap('root');\n const fragment = yDoc.getXmlFragment('document');\n const existingFlow = readCompiledFlowFromYDoc(yDoc);\n\n if (strategy === 'full') {\n // ── Full strategy: clear existing state and rebuild ──\n if (existingFlow) {\n clearFlowState(yDoc);\n removeAllFlowBlocks(fragment);\n // Preserve per-action execution state: run facts and terminal summaries\n // are immutable history even when the live definition is replaced.\n }\n\n // Set metadata\n setRootMetadata(yDoc, root, plan, creatorDid, docId, templateId);\n\n hydrateYDocFromCompiledFlow(yDoc, incomingCompiled);\n\n if (!existingFlow) {\n initializeRuntime(yDoc, incomingCompiled, runId);\n }\n\n yDoc.transact(() => {\n writeCompiledBlocksToFragment(fragment, incomingCompiled.blocks);\n });\n\n return incomingCompiled;\n }\n\n // ── Merge / Patch strategy ──\n if (!existingFlow) {\n // No existing flow — fall back to full behavior\n setRootMetadata(yDoc, root, plan, creatorDid, docId, templateId);\n\n hydrateYDocFromCompiledFlow(yDoc, incomingCompiled);\n\n initializeRuntime(yDoc, incomingCompiled, runId);\n\n yDoc.transact(() => {\n writeCompiledBlocksToFragment(fragment, incomingCompiled.blocks);\n });\n\n return incomingCompiled;\n }\n\n // Merge or patch the incoming plan into the existing flow\n const mergeResult = mergeCompiledFlows(existingFlow, incomingCompiled, strategy);\n\n hydrateYDocFromMergeResult(yDoc, mergeResult);\n\n const nodesToInit = [...mergeResult.added, ...mergeResult.replaced];\n initializeRuntimeForNodes(yDoc, mergeResult.merged, nodesToInit, runId);\n\n yDoc.transact(() => {\n applyMergeResultToFragment(fragment, mergeResult);\n });\n\n return mergeResult.merged;\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────────────\n\ninterface ConnectToRoomOptions {\n /**\n * Whether this entry point is allowed to write. `true` collects the phantom\n * run left behind by pre-migration builds; `false` leaves the doc\n * byte-identical to what the room sent us.\n *\n * **Required, not defaulted.** Every caller must state which side of the\n * read/write line it is on, so a future read-only entry point cannot inherit\n * a writer's default by omission.\n */\n adoptRuns: boolean;\n}\n\n/** Connect to a Matrix room and return a synced Y.Doc + provider. */\nasync function connectToRoom(roomId: string, matrixClient: MatrixClient, options: ConnectToRoomOptions): Promise<{ yDoc: Y.Doc; provider: MatrixProvider }> {\n const yDoc = new Y.Doc();\n\n const client = matrixClient;\n (client as any).canSupportVoip = false;\n (client as any).clientOpts = { lazyLoadMembers: true };\n\n const provider = new MatrixProvider(\n yDoc,\n client,\n { type: 'id', id: roomId },\n {\n translator: {\n updateEventType: 'matrix-crdt.doc_update',\n snapshotEventType: 'matrix-crdt.doc_snapshot',\n },\n enableExperimentalWebrtcSync: false,\n enableAwareness: false,\n reader: { snapshotInterval: 10 },\n writer: { flushInterval: 300, retryIfForbiddenInterval: 30000 },\n }\n );\n\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`Timed out connecting to room ${roomId}`));\n }, 30000);\n\n provider.onDocumentAvailable(() => {\n clearTimeout(timeout);\n resolve();\n });\n\n provider.onDocumentUnavailable(() => {\n clearTimeout(timeout);\n reject(new Error(`Room ${roomId} is unavailable`));\n });\n\n provider.initialize().catch((err: Error) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n\n // The headless counterpart of the connect-time collection in\n // `useCollaborativeIxoEditor`: remove the phantom run that pre-migration\n // builds created here. Connecting to a room creates nothing else — a run now\n // comes only from starting a session or migrating a legacy flow.\n //\n // Gated on `options.adoptRuns` because **collection is a writer**, and this\n // helper is shared with read-only entry points. `provider.canWrite` alone is\n // not that gate: it reports whether the homeserver would accept our writes,\n // not whether this caller is entitled to make any. Nor is disposal a gate —\n // `MatrixProvider` hooks `doc.on('update')` in its constructor and the\n // throttled writer flushes on the leading edge, so the send is already in\n // flight before `dispose()` runs, and `.cancel()` only drops a queued\n // trailing flush. A documented read-only API must not create containers in\n // someone else's room.\n if (options.adoptRuns && provider.canWrite) {\n collectPhantomLegacyRun(yDoc);\n }\n\n return { yDoc, provider };\n}\n\n/** Set root metadata on the Y.Doc (shared between full and fallback paths). */\nfunction setRootMetadata(yDoc: Y.Doc, root: Y.Map<unknown>, plan: BaseUcanFlow, creatorDid: string, docId?: string, templateId?: string): void {\n yDoc.transact(() => {\n if (!root.get('@context')) root.set('@context', 'https://ixo.world/flow/0.3');\n if (!root.get('_type')) root.set('_type', 'ixo.flow.crdt');\n if (!root.get('schema_version')) root.set('schema_version', '0.3');\n if (!root.get('doc_id')) root.set('doc_id', docId || plan.flowId);\n if (!root.get('createdAt')) root.set('createdAt', new Date().toISOString());\n if (!root.get('createdBy')) root.set('createdBy', creatorDid);\n root.set('flowOwnerDid', creatorDid);\n\n // A flow created now is session-based from birth.\n //\n // The condition is the *absence of pre-session history*, not the absence of\n // the version key: version 1 is the default precisely when the key is\n // missing, so keying off that would silently latch every legacy document\n // the moment someone edited its definition — a one-way migration nobody\n // asked for. A document with no history has nothing to migrate, so latching\n // it here is the same no-op that `migrateFlowToSessions` would perform.\n if (!hasLegacyRuntimeHistory(yDoc)) setMultiRunStorage(yDoc);\n\n // Template lineage — record alongside doc_id, never overwriting an\n // existing value (e.g. one stamped at clone time).\n if (templateId && !root.get('source_template_id')) {\n root.set('source_template_id', templateId);\n }\n\n const titleText = yDoc.getText('title');\n if (titleText.length === 0 && plan.title) {\n titleText.insert(0, plan.title);\n }\n });\n}\n","import type { Doc as YDoc } from 'yjs';\nimport * as Y from 'yjs';\nimport type { CompiledFlow, CompiledFlowNode } from '../../types/baseUcan';\nimport type { MergeResult } from './mergeFlows';\nimport { resetActionState, resolveActiveRunId } from '../flowEngine/runs';\n\n/**\n * Insert compiled flow artifacts into a live collaborative editor's Y.Doc.\n *\n * This function:\n * 1. Populates qi.flow.* Yjs maps with graph state\n * 2. Returns the compiled blocks for insertion into BlockNote\n *\n * Should be called ONCE when the editor connects to an empty document.\n *\n * Note: Block insertion into BlockNote must be done by the caller via\n * `editor.insertBlocks()` because BlockNote's API is not accessible here\n * without pulling in React dependencies.\n */\nexport function hydrateYDocFromCompiledFlow(yDoc: YDoc, compiled: CompiledFlow): void {\n yDoc.transact(() => {\n // ── qi.flow.meta ──\n const flowMeta = yDoc.getMap('qi.flow.meta');\n for (const [key, value] of Object.entries(compiled.meta)) {\n if (value !== undefined) {\n flowMeta.set(key, value);\n }\n }\n\n // ── qi.flow.nodes ──\n const flowNodes = yDoc.getMap('qi.flow.nodes');\n for (const [nodeId, node] of Object.entries(compiled.nodes)) {\n flowNodes.set(nodeId, createYMapFromNode(node));\n }\n\n // ── qi.flow.edges ──\n const flowEdges = yDoc.getMap('qi.flow.edges');\n for (const edge of compiled.edges) {\n const yEdge = new Y.Map();\n yEdge.set('id', edge.id);\n yEdge.set('source', edge.source);\n yEdge.set('target', edge.target);\n yEdge.set('kind', edge.kind);\n if (edge.condition) yEdge.set('condition', edge.condition);\n flowEdges.set(edge.id, yEdge);\n }\n\n // ── qi.flow.order ──\n const flowOrder = yDoc.getArray('qi.flow.order');\n for (const nodeId of compiled.order) {\n flowOrder.push([nodeId]);\n }\n\n // ── qi.flow.blockIndex ──\n const flowBlockIndex = yDoc.getMap('qi.flow.blockIndex');\n for (const [nodeId, blockId] of Object.entries(compiled.blockIndex)) {\n flowBlockIndex.set(nodeId, blockId);\n }\n });\n}\n\n/**\n * Clear all flow graph state from a Y.Doc.\n * Used by the `full` strategy before rebuilding.\n */\nexport function clearFlowState(yDoc: YDoc): void {\n yDoc.transact(() => {\n const flowMeta = yDoc.getMap('qi.flow.meta');\n flowMeta.forEach((_, key) => flowMeta.delete(key));\n\n const flowNodes = yDoc.getMap('qi.flow.nodes');\n flowNodes.forEach((_, key) => flowNodes.delete(key));\n\n const flowEdges = yDoc.getMap('qi.flow.edges');\n flowEdges.forEach((_, key) => flowEdges.delete(key));\n\n const flowOrder = yDoc.getArray('qi.flow.order');\n if (flowOrder.length > 0) {\n flowOrder.delete(0, flowOrder.length);\n }\n\n const flowBlockIndex = yDoc.getMap('qi.flow.blockIndex');\n flowBlockIndex.forEach((_, key) => flowBlockIndex.delete(key));\n });\n}\n\n/**\n * Apply a MergeResult to the Y.Doc's flow graph state.\n *\n * - Added nodes: create new Y.Map entries\n * - Replaced nodes: delete + recreate with new data\n * - Kept nodes: untouched\n * - Edges: cleared entirely and rewritten from the merged trigger edges\n * - Order: cleared and rewritten as the merged node insertion order\n */\nexport function hydrateYDocFromMergeResult(yDoc: YDoc, mergeResult: MergeResult): void {\n const { merged, added, replaced } = mergeResult;\n\n yDoc.transact(() => {\n // ── Update meta ──\n const flowMeta = yDoc.getMap('qi.flow.meta');\n for (const [key, value] of Object.entries(merged.meta)) {\n if (value !== undefined) {\n flowMeta.set(key, value);\n }\n }\n\n // ── Add / replace nodes ──\n const flowNodes = yDoc.getMap('qi.flow.nodes');\n for (const nodeId of replaced) {\n flowNodes.delete(nodeId);\n flowNodes.set(nodeId, createYMapFromNode(merged.nodes[nodeId]));\n }\n for (const nodeId of added) {\n flowNodes.set(nodeId, createYMapFromNode(merged.nodes[nodeId]));\n }\n\n // ── Rewrite edges (derived state — always recompute) ──\n const flowEdges = yDoc.getMap('qi.flow.edges');\n flowEdges.forEach((_, key) => flowEdges.delete(key));\n for (const edge of merged.edges) {\n const yEdge = new Y.Map();\n yEdge.set('id', edge.id);\n yEdge.set('source', edge.source);\n yEdge.set('target', edge.target);\n yEdge.set('kind', edge.kind);\n if (edge.condition) yEdge.set('condition', edge.condition);\n flowEdges.set(edge.id, yEdge);\n }\n\n // ── Rewrite order (derived state — always recompute) ──\n const flowOrder = yDoc.getArray('qi.flow.order');\n if (flowOrder.length > 0) {\n flowOrder.delete(0, flowOrder.length);\n }\n for (const nodeId of merged.order) {\n flowOrder.push([nodeId]);\n }\n\n // ── Update blockIndex ──\n const flowBlockIndex = yDoc.getMap('qi.flow.blockIndex');\n for (const nodeId of [...added, ...replaced]) {\n flowBlockIndex.set(nodeId, merged.blockIndex[nodeId]);\n }\n });\n}\n\n/**\n * Initialize action state for all compiled nodes: every node reset to `idle`.\n *\n * **Takes the `Y.Doc`, not the flat `runtime` map.** This is a *reset* path, and\n * Phase A resets must land on both the run entry and the flat mirror or they\n * desynchronise permanently — see {@link resetActionState}. Seeding only the\n * flat map leaves a pre-rebuild `completed` run entry in place, and\n * `resolveActionState` rule (a) then makes the freshly-rebuilt block read as\n * already executed.\n */\nexport function initializeRuntime(yDoc: YDoc, compiled: CompiledFlow, runId?: string): void {\n // No session, nothing to seed. Authoring a flow must not create a run — and\n // `startRun` seeds its own manifest blocks the moment one is started.\n const resolvedRunId = runId ?? resolveActiveRunId(yDoc);\n if (!resolvedRunId) return;\n yDoc.transact(() => {\n for (const nodeId of compiled.order) {\n const blockId = compiled.blockIndex[nodeId];\n if (blockId) resetActionState(yDoc, resolvedRunId, blockId);\n }\n });\n}\n\n/**\n * Initialize action state for specific nodes only.\n * Used by merge/patch strategies to only initialize new or replaced nodes.\n *\n * Same dual-target reset contract as {@link initializeRuntime}.\n */\nexport function initializeRuntimeForNodes(yDoc: YDoc, compiled: CompiledFlow, nodeIds: string[], runId?: string): void {\n // Same rule as {@link initializeRuntime}: no session, no seed.\n const resolvedRunId = runId ?? resolveActiveRunId(yDoc);\n if (!resolvedRunId) return;\n yDoc.transact(() => {\n for (const nodeId of nodeIds) {\n const blockId = compiled.blockIndex[nodeId];\n if (blockId) resetActionState(yDoc, resolvedRunId, blockId);\n }\n });\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────────────\n\n/** Create a Y.Map from a CompiledFlowNode. */\nexport function createYMapFromNode(node: CompiledFlowNode): Y.Map<unknown> {\n const yNode = new Y.Map();\n yNode.set('id', node.id);\n yNode.set('blockId', node.blockId);\n yNode.set('can', node.can);\n yNode.set('with', node.with);\n yNode.set('registryType', node.registryType);\n yNode.set('title', node.title);\n yNode.set('description', node.description);\n if (node.phase) yNode.set('phase', node.phase);\n if (node.parallelGroup) yNode.set('parallelGroup', node.parallelGroup);\n if (node.actor) yNode.set('actor', node.actor);\n return yNode;\n}\n","import type { FlowAgentCommandType, FlowAgentPolicyDecision } from '../../types/flowAgent';\nimport type { StoredDelegation, UcanCapability } from '../../types/ucan';\nimport { capabilityPatternCoversCan } from '../actionRegistry/registry';\nimport type { UcanDelegationStore } from '../ucanDelegationStore';\nimport { capabilityForCommand } from './utils';\n\nconst COMMAND_CAPABILITIES: Record<FlowAgentCommandType, string> = {\n diagnose_blocker: 'flow/observe',\n assign_actor: 'flow/node/assign',\n notify_actor: 'flow/notify',\n execute_action: 'flow/node/execute',\n validate_external_state: 'flow/mutation/execute',\n archive_flow: 'flow/archive',\n propose_config_change: 'flow/config/propose',\n};\n\nexport function requiredCapabilityForCommand(type: FlowAgentCommandType, flowUri: string, nodeId: string): UcanCapability {\n return capabilityForCommand(COMMAND_CAPABILITIES[type], flowUri, nodeId);\n}\n\nexport function isCapabilityMatch(granted: UcanCapability, required: UcanCapability): boolean {\n return canMatches(granted.can, required.can) && resourceMatches(granted.with, required.with);\n}\n\n/**\n * Match a granted capability pattern against a required `can`.\n *\n * ⚠️ This is the **trusted flow-agent policy** matcher: it allows the global\n * `'*'` wildcard, so a delegation granting `can: '*'` matches every ability.\n * It is re-exported from `src/core/index.ts` — do not use it to gate public or\n * untrusted matching. For that, call `capabilityPatternCoversCan` directly and\n * leave `allowGlobalWildcard` off (the default), which rejects `'*'`.\n *\n * Note: the granted side is normalized (`normalizeCan`), so dotted legacy\n * grants such as `flow.notify` / `flow.*` now match `flow/notify` where they\n * were previously inert.\n */\nexport function canMatches(granted: string, required: string): boolean {\n return capabilityPatternCoversCan(granted, required, { allowGlobalWildcard: true });\n}\n\nexport function resourceMatches(granted: string, required: string): boolean {\n if (granted === '*' || granted === required) return true;\n if (granted.endsWith('*')) {\n const prefix = granted.slice(0, -1);\n return required.startsWith(prefix);\n }\n return false;\n}\n\nexport interface EvaluateFlowAgentPolicyParams {\n actorDid: string;\n commandType: FlowAgentCommandType;\n flowUri: string;\n nodeId: string;\n delegationStore?: UcanDelegationStore;\n delegations?: StoredDelegation[];\n now?: number;\n}\n\nexport function evaluateFlowAgentPolicy({\n actorDid,\n commandType,\n flowUri,\n nodeId,\n delegationStore,\n delegations,\n now = Date.now(),\n}: EvaluateFlowAgentPolicyParams): FlowAgentPolicyDecision {\n const required = requiredCapabilityForCommand(commandType, flowUri, nodeId);\n const candidates = delegations || delegationStore?.getByAudience(actorDid) || [];\n\n for (const delegation of candidates) {\n if (delegation.audienceDid !== actorDid) continue;\n if (delegation.expiration != null && delegation.expiration <= now) continue;\n if (!delegation.capabilities.some((capability) => isCapabilityMatch(capability, required))) continue;\n\n return {\n allowed: true,\n reason: 'Allowed by UCAN delegation',\n capability: required,\n proofCids: [delegation.cid, ...delegation.proofCids],\n };\n }\n\n return {\n allowed: false,\n reason: `Actor ${actorDid} lacks ${required.can} on ${required.with}`,\n capability: required,\n proofCids: [],\n };\n}\n","import type { FlowAgentActor, FlowAgentCommand, FlowAgentCommandType } from '../../types/flowAgent';\nimport type { UcanCapability } from '../../types/ucan';\nimport { computeAgentCommandId } from './store';\nimport { requiredCapabilityForCommand } from './policy';\nimport { createIntentHash } from './utils';\n\nexport interface CreateAgentCommandParams {\n type: FlowAgentCommandType;\n flowId: string;\n sessionRunId: string;\n flowUri: string;\n nodeId: string;\n actor: FlowAgentActor;\n reason: string;\n payload?: Record<string, unknown>;\n now?: number;\n}\n\nexport function createAgentCommand({ type, flowId, sessionRunId, flowUri, nodeId, actor, reason, payload = {}, now = Date.now() }: CreateAgentCommandParams): FlowAgentCommand {\n const capability: UcanCapability = requiredCapabilityForCommand(type, flowUri, nodeId);\n const id = computeAgentCommandId({ flowId, sessionRunId, nodeId, type, payload });\n return {\n id,\n type,\n flowId,\n sessionRunId,\n flowUri,\n nodeId,\n actorDid: actor.did,\n status: 'queued',\n capability,\n idempotencyKey: `${id}:${createIntentHash({ capability, payload })}`,\n createdAt: now,\n updatedAt: now,\n reason,\n payload,\n };\n}\n\nexport function validateAgentCommand(command: FlowAgentCommand): { valid: boolean; error?: string } {\n if (!command.id) return { valid: false, error: 'Command id is required' };\n if (!command.flowId) return { valid: false, error: 'flowId is required' };\n if (!command.sessionRunId) return { valid: false, error: 'sessionRunId is required' };\n if (!command.flowUri) return { valid: false, error: 'flowUri is required' };\n if (!command.nodeId) return { valid: false, error: 'nodeId is required' };\n if (!command.actorDid) return { valid: false, error: 'actorDid is required' };\n if (!command.capability?.can || !command.capability?.with) return { valid: false, error: 'capability is required' };\n if (!command.idempotencyKey) return { valid: false, error: 'idempotencyKey is required' };\n\n if (isExternalMutation(command.type) && !command.payload.validator) {\n return {\n valid: false,\n error: `${command.type} requires payload.validator for post-action read-back validation`,\n };\n }\n\n if (command.type === 'propose_config_change' && !command.payload.proposal) {\n return { valid: false, error: 'Config changes must be expressed as payload.proposal' };\n }\n\n return { valid: true };\n}\n\nexport function isExternalMutation(type: FlowAgentCommandType): boolean {\n return type === 'validate_external_state';\n}\n","import type { FlowAgentActor, FlowAgentContext } from '../../types/flowAgent';\nimport type { IxoEditorType } from '../../types/editor';\nimport type { Doc } from 'yjs';\n\nexport interface BuildFlowAgentContextParams {\n yDoc: Doc;\n flowId: string;\n sessionRunId: string;\n flowUri?: string;\n actor: FlowAgentActor;\n blocks?: unknown[];\n documentBlocks?: unknown[];\n editor?: IxoEditorType;\n now?: () => number;\n}\n\n/**\n * Builds the host-facing runtime context expected by the Flow Agent.\n *\n * Headless hosts own Matrix login, room joins, and Y.Doc sync. Once a host has\n * a live room document and an agent identity, this helper gives it the stable\n * context shape to pass into `tickFlowAgent` or `FlowAgentService`.\n */\nexport function buildFlowAgentContext({\n yDoc,\n flowId,\n sessionRunId,\n flowUri = `ixo:flow:${flowId}`,\n actor,\n blocks,\n documentBlocks,\n editor,\n now,\n}: BuildFlowAgentContextParams): FlowAgentContext {\n return {\n yDoc,\n flowId,\n sessionRunId,\n flowUri,\n actor,\n ...(blocks ? { blocks } : {}),\n ...(documentBlocks ? { documentBlocks } : {}),\n ...(editor ? { editor } : {}),\n ...(now ? { now } : {}),\n };\n}\n","import type { Map as YMap } from 'yjs';\nimport type { FlowAgentLease } from '../../types/flowAgent';\n\nexport const DEFAULT_FLOW_AGENT_LEASE_TTL_MS = 60_000;\n\nexport interface AcquireFlowAgentLeaseParams {\n leases: YMap<FlowAgentLease>;\n commandId: string;\n sessionRunId: string;\n nodeId: string;\n actorDid: string;\n now?: number;\n ttlMs?: number;\n}\n\nexport function acquireFlowAgentLease({\n leases,\n commandId,\n sessionRunId,\n nodeId,\n actorDid,\n now = Date.now(),\n ttlMs = DEFAULT_FLOW_AGENT_LEASE_TTL_MS,\n}: AcquireFlowAgentLeaseParams): FlowAgentLease | null {\n const current = leases.get(commandId);\n if (current && current.expiresAt > now && current.actorDid !== actorDid) {\n return null;\n }\n\n const nextEpoch = current ? current.epoch + 1 : 1;\n const lease: FlowAgentLease = {\n id: `${commandId}:lease:${nextEpoch}`,\n commandId,\n sessionRunId,\n nodeId,\n actorDid,\n acquiredAt: now,\n expiresAt: now + ttlMs,\n epoch: nextEpoch,\n };\n\n leases.set(commandId, lease);\n return lease;\n}\n\nexport function validateFlowAgentLease(leases: YMap<FlowAgentLease>, lease: FlowAgentLease, now = Date.now()): boolean {\n const current = leases.get(lease.commandId);\n return !!current && current.actorDid === lease.actorDid && current.epoch === lease.epoch && current.expiresAt > now;\n}\n\nexport function releaseFlowAgentLease(leases: YMap<FlowAgentLease>, lease: FlowAgentLease): boolean {\n const current = leases.get(lease.commandId);\n if (!current || current.actorDid !== lease.actorDid || current.epoch !== lease.epoch) return false;\n leases.delete(lease.commandId);\n return true;\n}\n\nexport function cleanupExpiredFlowAgentLeases(leases: YMap<FlowAgentLease>, now = Date.now()): FlowAgentLease[] {\n const expired: FlowAgentLease[] = [];\n leases.forEach((lease, commandId) => {\n if (lease.expiresAt <= now) {\n expired.push(lease);\n leases.delete(commandId);\n }\n });\n return expired;\n}\n","import type { FlowNodeRuntimeState } from '../../types/authorization';\nimport type { CompletionVerification } from '../flowEngine/verifiedCompletion';\nimport { deriveBlockPhase } from '../flowEngine/blockPhase';\nimport type { FlowAgentBlockerCause, FlowAgentNodeSnapshot, FlowAgentPublicNodeState } from '../../types/flowAgent';\nimport { getAssigneeDid, getBlockActionType, getBlockId, getBlockTitle, getBlockType, getDueAt, getBlockProps, parseJsonProp } from './utils';\n\ninterface ConditionConfig {\n enabled?: boolean;\n conditions?: Array<Record<string, unknown>>;\n}\n\nexport interface ClassifyNodeStateInput {\n block: unknown;\n runtime: FlowNodeRuntimeState;\n now: number;\n pendingInvocationCount?: number;\n /**\n * Verification of a `completed` runtime entry (see\n * `flowEngine/verifiedCompletion.ts`). When provided and 'unverified', the\n * node classifies as Blocked instead of Done — the planner must not advance\n * past a completion that lacks proof or a valid invocation. Omitted ⇒\n * legacy behavior (completed = Done).\n */\n completionVerification?: CompletionVerification;\n}\n\nexport function classifyBlockerCause(block: unknown, runtime: FlowNodeRuntimeState): FlowAgentBlockerCause | undefined {\n const props = getBlockProps(block);\n if (runtime.error?.code === 'missing_ucan') return 'missing_ucan';\n if (runtime.error?.code === 'validation_mismatch') return 'validation_mismatch';\n if (runtime.error?.code === 'external_confirmation_pending') return 'external_confirmation_pending';\n if (runtime.error) return 'service_error';\n\n const conditions = parseJsonProp<ConditionConfig>(props.conditions, {});\n if (conditions.enabled && Array.isArray(conditions.conditions) && conditions.conditions.length > 0) {\n return 'failed_upstream';\n }\n\n const inputs = parseJsonProp<Record<string, unknown>>(props.inputs, {});\n const requiredInputs = parseJsonProp<string[]>(props.requiredInputs, []);\n if (requiredInputs.some((key) => inputs[key] == null || inputs[key] === '')) {\n return 'missing_input';\n }\n\n return undefined;\n}\n\nexport function classifyNodeState({ block, runtime, now, pendingInvocationCount = 0, completionVerification }: ClassifyNodeStateInput): FlowAgentPublicNodeState {\n const derived = deriveBlockPhase({\n runtime,\n actionType: getBlockActionType(block),\n completionVerification,\n pendingInvocationCount,\n });\n\n // `failed` covers plain failures, `needs_verification` (a side-effecting\n // action that ran but couldn't prove it did — never auto-retry, that would\n // double-execute), unverified completions, and unknown state strings from\n // newer clients. All of them are dead-ends the planner must not advance\n // past or queue an execute for; Blocked routes them to diagnosis instead.\n if (derived.phase === 'failed') return 'Blocked';\n if (derived.phase === 'complete') return 'Done';\n // A repeatable ('many') block that has fired stays a standing capability —\n // it never latches Done while invocations are queued on it. With an empty\n // queue there is nothing for the planner to do, which is what Done means\n // here; the block itself remains invocable.\n if (derived.detail === 'standing' && pendingInvocationCount === 0) return 'Done';\n if (runtime.error) return 'Blocked';\n\n const dueAt = getDueAt(block);\n if (dueAt != null && dueAt <= now) return 'Overdue';\n\n return 'Pending';\n}\n\nexport function snapshotNode(\n block: unknown,\n runtime: FlowNodeRuntimeState,\n now: number,\n pendingInvocationCount = 0,\n completionVerification?: CompletionVerification\n): FlowAgentNodeSnapshot {\n const nodeId = getBlockId(block);\n if (!nodeId) {\n throw new Error('Cannot snapshot a block without an id');\n }\n\n const publicState = classifyNodeState({ block, runtime, now, pendingInvocationCount, completionVerification });\n const dueAt = getDueAt(block);\n const assigneeDid = getAssigneeDid(block);\n\n const snapshot: FlowAgentNodeSnapshot = {\n nodeId,\n blockType: getBlockType(block),\n runtime,\n publicState,\n pendingInvocationCount,\n };\n\n const actionType = getBlockActionType(block);\n if (actionType) snapshot.actionType = actionType;\n\n const title = getBlockTitle(block);\n if (title) snapshot.title = title;\n\n if (publicState === 'Blocked') {\n if (runtime.state === 'needs_verification') {\n snapshot.blockerCause = 'awaiting_verification';\n } else if (runtime.state === 'completed' && completionVerification?.status === 'unverified') {\n snapshot.blockerCause = 'unverified_completion';\n } else {\n snapshot.blockerCause = classifyBlockerCause(block, runtime) || 'unknown';\n }\n }\n\n if (assigneeDid) snapshot.assigneeDid = assigneeDid;\n if (dueAt != null) snapshot.dueAt = dueAt;\n\n return snapshot;\n}\n","import type { FlowAgentCommand } from '../../types/flowAgent';\nimport { getBlockActionType, getBlockProps, parseJsonProp } from './utils';\n\nexport type FlowAgentActionExecutionMode = 'saved-input' | 'runtime-input-required' | 'human-only';\n\nexport interface FlowAgentActionExecutionPolicy {\n mode: FlowAgentActionExecutionMode;\n requiredRuntimeInputs: string[];\n}\n\nexport interface FlowAgentExecuteActionValidation {\n valid: boolean;\n reason?: string;\n mode: FlowAgentActionExecutionMode;\n missingRuntimeInputs: string[];\n}\n\nconst RUNTIME_INPUT_REQUIRED_ACTIONS = new Set(['qi/form.submit', 'qi/human.form.submit', 'qi/human.checkbox.set', 'qi/protocol.select']);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction parseStringList(value: unknown): string[] {\n const parsed = parseJsonProp<unknown>(value, []);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string' && item.length > 0);\n}\n\nfunction normalizeMode(value: unknown): FlowAgentActionExecutionMode | undefined {\n if (value === 'saved-input' || value === 'saved_input' || value === 'savedInput') return 'saved-input';\n if (value === 'runtime-input-required' || value === 'runtime_input_required' || value === 'runtimeInputRequired') return 'runtime-input-required';\n if (value === 'human-only' || value === 'human_only' || value === 'humanOnly') return 'human-only';\n return undefined;\n}\n\nfunction parseExecutionConfig(value: unknown): Partial<FlowAgentActionExecutionPolicy> {\n if (value == null || value === '') return {};\n if (typeof value === 'string') {\n const directMode = normalizeMode(value);\n if (directMode) return { mode: directMode };\n }\n\n const parsed = parseJsonProp<Record<string, unknown>>(value, {});\n if (!isRecord(parsed)) return {};\n\n return {\n mode: normalizeMode(parsed.mode),\n requiredRuntimeInputs: parseStringList(parsed.requiredRuntimeInputs),\n };\n}\n\nfunction inferDefaultMode(actionType: string | undefined, requiredRuntimeInputs: string[]): FlowAgentActionExecutionMode {\n if (requiredRuntimeInputs.length > 0) return 'runtime-input-required';\n if (actionType && RUNTIME_INPUT_REQUIRED_ACTIONS.has(actionType)) return 'runtime-input-required';\n return 'saved-input';\n}\n\nexport function getFlowAgentActionExecutionPolicy(block: unknown): FlowAgentActionExecutionPolicy {\n const props = getBlockProps(block);\n const actionType = getBlockActionType(block);\n const config = parseExecutionConfig(props.flowAgentExecution || props.flowAgentExecutionMode || props.agentExecutionMode);\n const requiredRuntimeInputs = [\n ...(config.requiredRuntimeInputs || []),\n ...parseStringList(props.requiredRuntimeInputs || props.runtimeRequiredInputs || props.flowAgentRequiredRuntimeInputs),\n ];\n\n return {\n mode: config.mode || inferDefaultMode(actionType, requiredRuntimeInputs),\n requiredRuntimeInputs: Array.from(new Set(requiredRuntimeInputs)),\n };\n}\n\nexport function getCommandRuntimeInputs(payload: FlowAgentCommand['payload']): Record<string, unknown> | undefined {\n return isRecord(payload.runtimeInputs) ? payload.runtimeInputs : undefined;\n}\n\nexport function validateFlowAgentExecuteActionPayload(block: unknown, payload: FlowAgentCommand['payload']): FlowAgentExecuteActionValidation {\n const policy = getFlowAgentActionExecutionPolicy(block);\n if (policy.mode === 'human-only') {\n return {\n valid: false,\n mode: policy.mode,\n missingRuntimeInputs: [],\n reason: 'Action requires human execution and cannot be run by the Flow Agent',\n };\n }\n\n if (policy.mode !== 'runtime-input-required') {\n return { valid: true, mode: policy.mode, missingRuntimeInputs: [] };\n }\n\n const runtimeInputs = getCommandRuntimeInputs(payload);\n const missingRuntimeInputs =\n policy.requiredRuntimeInputs.length > 0\n ? policy.requiredRuntimeInputs.filter((key) => runtimeInputs?.[key] == null || runtimeInputs[key] === '')\n : runtimeInputs\n ? []\n : ['runtimeInputs'];\n\n if (missingRuntimeInputs.length > 0) {\n return {\n valid: false,\n mode: policy.mode,\n missingRuntimeInputs,\n reason:\n policy.requiredRuntimeInputs.length > 0\n ? `Missing required runtimeInputs: ${missingRuntimeInputs.join(', ')}`\n : 'Action requires runtimeInputs before the Flow Agent can execute it',\n };\n }\n\n return { valid: true, mode: policy.mode, missingRuntimeInputs: [] };\n}\n","import type { Doc } from 'yjs';\nimport type {\n FlowAgentActor,\n FlowAgentCommand,\n FlowAgentCommandResult,\n FlowAgentContext,\n FlowAgentExecutor,\n FlowAgentNodeSnapshot,\n FlowAgentTickResult,\n} from '../../types/flowAgent';\nimport type { StoredDelegation } from '../../types/ucan';\nimport type { UcanDelegationStore } from '../ucanDelegationStore';\nimport { readPendingInvocations } from '../flowEngine/triggers';\nimport { readActionState } from '../flowEngine/runs';\nimport { createAgentCommand, validateAgentCommand } from './commands';\nimport { acquireFlowAgentLease, releaseFlowAgentLease, validateFlowAgentLease } from './lease';\nimport { evaluateFlowAgentPolicy } from './policy';\nimport { appendAgentLedgerEvent, getFlowAgentMaps, queueAgentCommand, readQueuedAgentCommands, updateAgentCommand } from './store';\nimport { getAssigneeDid, getBlockActionType, getBlockId, getBlockProps, parseJsonProp } from './utils';\nimport { snapshotNode } from './state';\nimport { validateFlowAgentExecuteActionPayload } from './actionExecutionPolicy';\nimport { verifyCompletion } from '../flowEngine/verifiedCompletion';\nimport type { StoredInvocation } from '../../types/ucan';\nimport { evaluateBlockExecutionEligibilityForRun, parseConditionConfigStrict } from '../flowEngine/conditions';\n\nconst BLOCKER_DIAGNOSIS_VERSION = 2;\n\nexport interface FlowAgentOrchestratorOptions {\n delegationStore?: UcanDelegationStore;\n delegations?: StoredDelegation[];\n candidateActors?: FlowAgentActor[];\n executor?: FlowAgentExecutor;\n leaseTtlMs?: number;\n archiveWhenDone?: boolean;\n}\n\ninterface InputsValidation {\n valid: boolean;\n reason?: string;\n}\n\nfunction getBlocks(context: FlowAgentContext): unknown[] {\n const flattened: unknown[] = [];\n const visit = (block: unknown) => {\n flattened.push(block);\n const children = (block as { children?: unknown[] } | null)?.children;\n if (Array.isArray(children)) children.forEach(visit);\n };\n (context.blocks || context.editor?.document || []).forEach(visit);\n return flattened;\n}\n\nfunction getConditionDocument(context: FlowAgentContext): unknown[] {\n return context.documentBlocks || context.blocks || context.editor?.document || [];\n}\n\n/**\n * IGNITION PHASE A: the planner's read of a node's action state.\n *\n * This used to be a raw `yDoc.getMap<Record<string, any>>('runtime').get(nodeId)`\n * — the flat map, unresolved — while its structural twin in `execution.ts`\n * (`getRuntimeRecord`) had already been converted to the waist. The generic type\n * argument is why nobody noticed: the guard's regex era matched\n * `getMap\\s*(?:<[^>]*>)?\\s*\\(` and `[^>]*` cannot cross the inner `>` of\n * `Record<string, any>`, so the line was invisible to every rule.\n *\n * It matters more than a read usually would: the value goes straight to\n * `verifyCompletion` and `snapshotNode`, which is what decides whether to queue\n * `execute_action`. A block whose latest state reached the run container but not\n * the flat mirror reads here as never having run → the planner re-queues a\n * side-effecting action. That is §9.1's double-execution hazard on the read side.\n *\n * `readActionState` resolves the run entry against the flat mirror through the\n * freshness predicate, so under dual-write it returns the same value and where\n * the two disagree it returns the fresher one.\n */\nfunction getRuntime(yDoc: Doc, sessionRunId: string, nodeId: string): Record<string, any> {\n const value = readActionState(yDoc, sessionRunId, nodeId);\n return value && typeof value === 'object' ? (value as Record<string, any>) : {};\n}\n\nfunction validateInputs(block: unknown): InputsValidation {\n const props = getBlockProps(block);\n const inputs = parseJsonProp<Record<string, unknown>>(props.inputs, {});\n const requiredInputs = parseJsonProp<string[]>(props.requiredInputs, []);\n const missing = requiredInputs.filter((key) => inputs[key] == null || inputs[key] === '');\n if (missing.length > 0) {\n return { valid: false, reason: `Missing required inputs: ${missing.join(', ')}` };\n }\n return { valid: true };\n}\n\nfunction chooseActor(block: unknown, options: FlowAgentOrchestratorOptions): FlowAgentActor | undefined {\n const props = getBlockProps(block);\n const actionType = getBlockActionType(block);\n const requiredSkill = typeof props.requiredSkill === 'string' ? props.requiredSkill : actionType;\n if (!options.candidateActors || options.candidateActors.length === 0) return undefined;\n if (!requiredSkill) return options.candidateActors[0];\n return options.candidateActors.find((actor) => actor.skills?.includes(requiredSkill)) || options.candidateActors[0];\n}\n\nfunction canQueueCommand(type: FlowAgentCommand['type'], nodeId: string, context: FlowAgentContext, options: FlowAgentOrchestratorOptions): boolean {\n return evaluateFlowAgentPolicy({\n actorDid: context.actor.did,\n commandType: type,\n flowUri: context.flowUri,\n nodeId,\n delegationStore: options.delegationStore,\n delegations: options.delegations,\n now: context.now?.() || Date.now(),\n }).allowed;\n}\n\nfunction safeAppendAgentLedgerEvent(yDoc: Doc, event: Parameters<typeof appendAgentLedgerEvent>[1]): void {\n try {\n appendAgentLedgerEvent(yDoc, event);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to append flow-agent ledger event';\n if (message.includes('Unexpected content type') || message.includes('already been defined with a different constructor')) {\n return;\n }\n throw error;\n }\n}\n\nfunction queueIfAuthorized(\n context: FlowAgentContext,\n options: FlowAgentOrchestratorOptions,\n type: FlowAgentCommand['type'],\n nodeId: string,\n reason: string,\n payload: Record<string, unknown>\n): FlowAgentCommand | null {\n const now = context.now?.() || Date.now();\n const policy = evaluateFlowAgentPolicy({\n actorDid: context.actor.did,\n commandType: type,\n flowUri: context.flowUri,\n nodeId,\n delegationStore: options.delegationStore,\n delegations: options.delegations,\n now,\n });\n\n safeAppendAgentLedgerEvent(context.yDoc, {\n type: 'agent.decision',\n flowId: context.flowId,\n sessionRunId: context.sessionRunId,\n nodeId,\n actorDid: context.actor.did,\n timestamp: now,\n details: {\n commandType: type,\n allowed: policy.allowed,\n reason: policy.reason,\n capability: policy.capability,\n },\n });\n\n if (!policy.allowed) return null;\n\n const command = createAgentCommand({\n type,\n flowId: context.flowId,\n sessionRunId: context.sessionRunId,\n flowUri: context.flowUri,\n nodeId,\n actor: context.actor,\n reason,\n payload,\n now,\n });\n const validation = validateAgentCommand(command);\n if (!validation.valid) {\n safeAppendAgentLedgerEvent(context.yDoc, {\n type: 'agent.validation',\n flowId: context.flowId,\n sessionRunId: context.sessionRunId,\n nodeId,\n commandId: command.id,\n actorDid: context.actor.did,\n timestamp: now,\n details: { valid: false, error: validation.error },\n });\n return null;\n }\n return queueAgentCommand(context.yDoc, command).created ? command : null;\n}\n\nfunction statusForResult(result: FlowAgentCommandResult): FlowAgentCommand['status'] {\n if (result.status) return result.status;\n if (!result.success) return 'failed';\n return result.confirmed === false ? 'awaiting_readback' : 'confirmed';\n}\n\nfunction planForSnapshot(context: FlowAgentContext, options: FlowAgentOrchestratorOptions, block: unknown, snapshot: FlowAgentNodeSnapshot): FlowAgentCommand[] {\n const queued: FlowAgentCommand[] = [];\n const actionType = getBlockActionType(block);\n\n if (snapshot.publicState === 'Done') {\n return queued;\n }\n\n if (snapshot.publicState === 'Overdue') {\n const command = queueIfAuthorized(context, options, 'notify_actor', snapshot.nodeId, 'Action node is overdue', {\n assigneeDid: snapshot.assigneeDid,\n dueAt: snapshot.dueAt,\n severity: 'overdue',\n });\n if (command) queued.push(command);\n return queued;\n }\n\n if (snapshot.publicState === 'Blocked') {\n const command = queueIfAuthorized(context, options, 'diagnose_blocker', snapshot.nodeId, 'Action node is blocked and requires diagnosis', {\n cause: snapshot.blockerCause || 'unknown',\n error: snapshot.runtime.error,\n diagnosisVersion: BLOCKER_DIAGNOSIS_VERSION,\n });\n if (command) queued.push(command);\n return queued;\n }\n\n const assigneeDid = getAssigneeDid(block);\n if (!assigneeDid) {\n const actor = chooseActor(block, options);\n const command = queueIfAuthorized(context, options, 'assign_actor', snapshot.nodeId, 'Action node has no assigned actor', {\n targetActorDid: actor?.did,\n targetMatrixUserId: actor?.matrixUserId,\n requiredActionType: actionType,\n });\n if (command) queued.push(command);\n return queued;\n }\n\n const inputValidation = validateInputs(block);\n if (!inputValidation.valid) {\n const command = queueIfAuthorized(context, options, 'diagnose_blocker', snapshot.nodeId, inputValidation.reason || 'Action node inputs are not ready', {\n cause: 'missing_input',\n });\n if (command) queued.push(command);\n return queued;\n }\n\n if (actionType && canQueueCommand('execute_action', snapshot.nodeId, context, options)) {\n const pendingInvocation = readPendingInvocations(context.yDoc, snapshot.nodeId, context.sessionRunId)[0];\n const payload = {\n actionType,\n ...(pendingInvocation ? { pendingInvocationId: pendingInvocation.id } : {}),\n };\n const actionValidation = validateFlowAgentExecuteActionPayload(block, payload);\n if (!actionValidation.valid) {\n const commandType = actionValidation.mode === 'human-only' ? 'notify_actor' : 'diagnose_blocker';\n const command = queueIfAuthorized(context, options, commandType, snapshot.nodeId, actionValidation.reason || 'Action node cannot be executed by Flow Agent yet', {\n cause: actionValidation.mode === 'runtime-input-required' ? 'missing_input' : 'unknown',\n requiredActionType: actionType,\n requiredRuntimeInputs: actionValidation.missingRuntimeInputs,\n severity: actionValidation.mode === 'human-only' ? 'attention' : undefined,\n });\n if (command) queued.push(command);\n return queued;\n }\n\n const command = queueIfAuthorized(context, options, 'execute_action', snapshot.nodeId, 'Action node is pending and executable', {\n ...payload,\n });\n if (command) queued.push(command);\n return queued;\n }\n\n const notifyCommand = queueIfAuthorized(context, options, 'notify_actor', snapshot.nodeId, 'Action node is pending but the Flow Agent cannot execute it', {\n assigneeDid,\n requiredActionType: actionType,\n severity: 'attention',\n });\n if (notifyCommand) queued.push(notifyCommand);\n return queued;\n}\n\nexport function planRalphLoopCommands(\n context: FlowAgentContext,\n options: FlowAgentOrchestratorOptions = {}\n): { snapshots: FlowAgentNodeSnapshot[]; queuedCommands: FlowAgentCommand[]; flowDone: boolean } {\n const now = context.now?.() || Date.now();\n const blocks = getBlocks(context);\n const conditionDocument = getConditionDocument(context);\n const snapshots: FlowAgentNodeSnapshot[] = [];\n const queuedCommands: FlowAgentCommand[] = [];\n\n const invocationsMap = context.yDoc.getMap('invocations');\n const schemaVersionRaw = context.yDoc.getMap('root').get('schema_version');\n const schemaVersion = typeof schemaVersionRaw === 'string' ? schemaVersionRaw : undefined;\n const getInvocation = (cid: string) => invocationsMap.get(cid) as StoredInvocation | undefined;\n\n for (const block of blocks) {\n const nodeId = getBlockId(block);\n const actionType = getBlockActionType(block);\n if (!nodeId) continue;\n const pendingInvocationCount = readPendingInvocations(context.yDoc, nodeId, context.sessionRunId).length;\n const runtime = getRuntime(context.yDoc, context.sessionRunId, nodeId);\n // The planner never advances past a completion that lacks proof or (on\n // UCAN-enforced flows) a valid success invocation — see verifiedCompletion.ts.\n const completionVerification = verifyCompletion({\n runtime,\n blockId: nodeId,\n actionType,\n getInvocation,\n schemaVersion,\n });\n const snapshot = snapshotNode(block, runtime, now, pendingInvocationCount, completionVerification);\n try {\n const eligibility = evaluateBlockExecutionEligibilityForRun(\n parseConditionConfigStrict(getBlockProps(block).conditions),\n conditionDocument,\n context.yDoc,\n context.sessionRunId\n );\n if (!eligibility.eligible && snapshot.publicState !== 'Done') {\n snapshot.publicState = 'Blocked';\n snapshot.blockerCause = 'failed_upstream';\n }\n } catch {\n if (snapshot.publicState !== 'Done') {\n snapshot.publicState = 'Blocked';\n snapshot.blockerCause = 'validation_mismatch';\n }\n }\n snapshots.push(snapshot);\n queuedCommands.push(...planForSnapshot(context, options, block, snapshot));\n }\n\n const flowDone = snapshots.length > 0 && snapshots.every((snapshot) => snapshot.publicState === 'Done');\n // Completion is a readiness signal only. A run closes through the explicit\n // flow/run.close capability; legacy archive behaviour is opt-in.\n if (flowDone && options.archiveWhenDone === true) {\n const archiveCommand = queueIfAuthorized(context, options, 'archive_flow', context.flowId, 'All Ralph loop action nodes are done', {\n restartIfRepeats: true,\n });\n if (archiveCommand) queuedCommands.push(archiveCommand);\n }\n\n return { snapshots, queuedCommands, flowDone };\n}\n\nasync function callExecutor(command: FlowAgentCommand, context: FlowAgentContext, executor: FlowAgentExecutor): Promise<FlowAgentCommandResult> {\n switch (command.type) {\n case 'execute_action':\n return executor.executeAction ? executor.executeAction(command, context) : { commandId: command.id, success: false, error: 'No executeAction handler configured' };\n case 'assign_actor':\n return executor.assignActor ? executor.assignActor(command, context) : { commandId: command.id, success: false, error: 'No assignActor handler configured' };\n case 'notify_actor':\n return executor.notifyActor ? executor.notifyActor(command, context) : { commandId: command.id, success: false, error: 'No notifyActor handler configured' };\n case 'validate_external_state':\n return executor.validateExternalState\n ? executor.validateExternalState(command, context)\n : { commandId: command.id, success: false, error: 'No validateExternalState handler configured' };\n case 'archive_flow':\n return executor.archiveFlow ? executor.archiveFlow(command, context) : { commandId: command.id, success: false, error: 'No archiveFlow handler configured' };\n case 'propose_config_change':\n return executor.proposeConfigChange\n ? executor.proposeConfigChange(command, context)\n : { commandId: command.id, success: false, error: 'No proposeConfigChange handler configured' };\n case 'diagnose_blocker':\n return executor.diagnoseBlocker ? executor.diagnoseBlocker(command, context) : { commandId: command.id, success: false, error: 'No diagnoseBlocker handler configured' };\n }\n}\n\nexport async function executeQueuedAgentCommands(context: FlowAgentContext, options: FlowAgentOrchestratorOptions = {}): Promise<FlowAgentCommandResult[]> {\n const executor = options.executor;\n if (!executor) return [];\n\n const now = context.now?.() || Date.now();\n const { leases } = getFlowAgentMaps(context.yDoc);\n const results: FlowAgentCommandResult[] = [];\n\n for (const command of readQueuedAgentCommands(context.yDoc, context.sessionRunId)) {\n const validation = validateAgentCommand(command);\n if (!validation.valid) {\n updateAgentCommand(context.yDoc, command.id, { status: 'failed', error: validation.error, updatedAt: now });\n results.push({ commandId: command.id, success: false, error: validation.error });\n continue;\n }\n\n const policy = evaluateFlowAgentPolicy({\n actorDid: context.actor.did,\n commandType: command.type,\n flowUri: context.flowUri,\n nodeId: command.nodeId,\n delegationStore: options.delegationStore,\n delegations: options.delegations,\n now,\n });\n\n if (!policy.allowed) {\n updateAgentCommand(context.yDoc, command.id, { status: 'skipped', error: policy.reason, updatedAt: now });\n results.push({ commandId: command.id, success: false, error: policy.reason });\n continue;\n }\n\n const lease = acquireFlowAgentLease({\n leases,\n commandId: command.id,\n sessionRunId: context.sessionRunId,\n nodeId: command.nodeId,\n actorDid: context.actor.did,\n now,\n ttlMs: options.leaseTtlMs,\n });\n\n if (!lease) {\n continue;\n }\n\n updateAgentCommand(context.yDoc, command.id, { status: 'running', lease, updatedAt: now });\n\n try {\n const result = await callExecutor({ ...command, lease, status: 'running' }, context, executor);\n if (!validateFlowAgentLease(leases, lease, context.now?.() || Date.now())) {\n const leaseError = 'Lease expired or was superseded before command commit';\n updateAgentCommand(context.yDoc, command.id, { status: 'failed', error: leaseError, updatedAt: context.now?.() || Date.now() });\n results.push({ commandId: command.id, success: false, error: leaseError });\n continue;\n }\n\n updateAgentCommand(context.yDoc, command.id, {\n status: statusForResult(result),\n error: result.error,\n updatedAt: context.now?.() || Date.now(),\n });\n\n safeAppendAgentLedgerEvent(context.yDoc, {\n type: result.success ? 'agent.validation' : 'agent.escalation',\n flowId: context.flowId,\n sessionRunId: context.sessionRunId,\n nodeId: command.nodeId,\n commandId: command.id,\n actorDid: context.actor.did,\n timestamp: context.now?.() || Date.now(),\n details: {\n success: result.success,\n confirmed: result.confirmed,\n output: result.output,\n error: result.error,\n },\n });\n\n results.push(result);\n } finally {\n releaseFlowAgentLease(leases, lease);\n }\n }\n\n return results;\n}\n\nexport async function tickFlowAgent(context: FlowAgentContext, options: FlowAgentOrchestratorOptions = {}): Promise<FlowAgentTickResult> {\n const plan = planRalphLoopCommands(context, options);\n const executedCommands = await executeQueuedAgentCommands(context, options);\n return {\n flowDone: plan.flowDone,\n snapshots: plan.snapshots,\n queuedCommands: plan.queuedCommands,\n executedCommands,\n };\n}\n","import type { Doc } from 'yjs';\nimport type { ActionHandlers, ActionServices } from '../actionRegistry/types';\nimport { executeActionBlock } from '../flowEngine';\nimport { createYDocRuntimeManager } from '../flowEngine/runtime';\nimport { readActionState, resetActionState, resolveRunIdForExecution } from '../flowEngine/runs';\nimport type { FlowNodeRuntimeState } from '../../types/authorization';\nimport type { UcanService } from '../../services/ucanService';\nimport type { StoredDelegation } from '../../types/ucan';\nimport type { InvocationStore } from '../invocationStore';\nimport type { UcanDelegationStore } from '../ucanDelegationStore';\nimport type { FlowAgentCommand, FlowAgentCommandResult, FlowAgentContext, FlowAgentExecutor } from '../../types/flowAgent';\nimport { acquireFlowAgentLease, releaseFlowAgentLease, validateFlowAgentLease } from './lease';\nimport { evaluateFlowAgentPolicy } from './policy';\nimport { appendAgentLedgerEvent, getFlowAgentMaps, readAgentCommands, readQueuedAgentCommands, updateAgentCommand } from './store';\nimport { getBlockId, getBlockProps } from './utils';\nimport { validateAgentCommand } from './commands';\nimport { getCommandRuntimeInputs, validateFlowAgentExecuteActionPayload } from './actionExecutionPolicy';\nimport type { RunEventAppender } from '../flowEngine/runLifecycle';\nimport { boundRunActionOutput, readPendingRunTimelineEvents, retryPendingRunTimelineEvents } from '../flowEngine/runTimeline';\n\nexport interface ExecuteFlowAgentCoreCommandOptions {\n ucanService: UcanService;\n pin: string;\n actorType: 'entity' | 'user';\n entityRoomId?: string;\n actionServices?: ActionServices;\n actionHandlers?: ActionHandlers;\n delegationStore?: UcanDelegationStore;\n delegations?: StoredDelegation[];\n invocationStore?: InvocationStore;\n leaseTtlMs?: number;\n flowOwnerDid?: string;\n schemaVersion?: string;\n runEventLog?: RunEventAppender;\n now?: () => number;\n}\n\nexport interface ExecuteQueuedFlowAgentCoreCommandsOptions extends ExecuteFlowAgentCoreCommandOptions {\n executor?: FlowAgentExecutor;\n commandTypes?: FlowAgentCommand['type'][];\n}\n\nconst DEFAULT_SCHEMA_VERSION = '1.0.0';\n\nfunction resolveExecutionContext(context: FlowAgentContext): FlowAgentContext {\n const sessionRunId = resolveRunIdForExecution(context.yDoc, context.sessionRunId);\n return sessionRunId === context.sessionRunId ? context : { ...context, sessionRunId };\n}\n\nfunction safeAppendAgentLedgerEvent(yDoc: Doc, event: Parameters<typeof appendAgentLedgerEvent>[1]): void {\n try {\n appendAgentLedgerEvent(yDoc, event);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to append flow-agent ledger event';\n if (message.includes('Unexpected content type') || message.includes('already been defined with a different constructor')) {\n return;\n }\n throw error;\n }\n}\n\n/**\n * IGNITION PHASE A: this module used to carry a **private duplicate** of the\n * runtime manager writing straight to `yDoc.getMap('runtime')`. Converting\n * `flowEngine/runtime.ts` did nothing for it — it had to be deleted, not\n * patched — so the flow agent is now on the shared, run-scoped manager and\n * every write below dual-writes the run entry and the flat mirror.\n */\nfunction getRuntimeRecord(yDoc: Doc, sessionRunId: string, nodeId: string): Record<string, unknown> {\n return readActionState(yDoc, sessionRunId, nodeId) as unknown as Record<string, unknown>;\n}\n\n/**\n * Strip the blocker (`state`, `error`) off a node's runtime and stamp the\n * diagnosis metadata.\n *\n * This is a **replace**, not a merge — dropping `state` and `error` by\n * destructuring is the whole point — which makes it the single most dangerous\n * statement in the flow agent under a live adoption gate: written flat-only it\n * downgrades the block to an unstarted-looking entry that the freshness\n * predicate can never materialise, leaving the run entry stuck on the failed\n * state forever. `resetActionState` writes the *identical* object to both\n * sides in one transaction, so the two converge and there is nothing left for\n * adoption to strand.\n */\nfunction clearRuntimeBlocker(yDoc: Doc, sessionRunId: string, nodeId: string, updates: Record<string, unknown>): void {\n const current = getRuntimeRecord(yDoc, sessionRunId, nodeId);\n const { state: _state, error: _error, ...rest } = current;\n resetActionState(yDoc, sessionRunId, nodeId, {\n ...rest,\n ...updates,\n } as FlowNodeRuntimeState);\n}\n\nfunction findContextBlock(context: FlowAgentContext, nodeId: string): Record<string, unknown> | null {\n const visit = (blocks: unknown[]): Record<string, unknown> | null => {\n for (const entry of blocks) {\n if (getBlockId(entry) === nodeId && entry && typeof entry === 'object') {\n return entry as Record<string, unknown>;\n }\n const children = (entry as { children?: unknown[] } | null)?.children;\n if (Array.isArray(children)) {\n const found = visit(children);\n if (found) return found;\n }\n }\n return null;\n };\n return visit(context.blocks || context.documentBlocks || context.editor?.document || []);\n}\n\ntype YXmlAttributeReader = {\n getAttribute: (key: string) => unknown;\n};\n\nfunction getXmlAttribute<T>(element: YXmlAttributeReader, key: string): T | undefined {\n return element.getAttribute(key) as T | undefined;\n}\n\nfunction setXmlAttribute(element: { setAttribute: (key: string, value: unknown) => unknown }, key: string, value: unknown): void {\n (element as unknown as { setAttribute: (key: string, value: unknown) => void }).setAttribute(key, value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\ntype YXmlContainerLike = {\n toArray: () => unknown[];\n};\n\ntype YXmlElementLike = YXmlContainerLike & {\n nodeName: string;\n getAttribute: (key: string) => unknown;\n setAttribute: (key: string, value: unknown) => unknown;\n};\n\nfunction isYXmlContainerLike(value: unknown): value is YXmlContainerLike {\n return value != null && typeof value === 'object' && typeof (value as { toArray?: unknown }).toArray === 'function';\n}\n\nfunction isYXmlElementLike(value: unknown): value is YXmlElementLike {\n return (\n isYXmlContainerLike(value) &&\n typeof (value as { nodeName?: unknown }).nodeName === 'string' &&\n typeof (value as { getAttribute?: unknown }).getAttribute === 'function' &&\n typeof (value as { setAttribute?: unknown }).setAttribute === 'function'\n );\n}\n\nfunction getElementBlockId(element: YXmlElementLike): string | undefined {\n const directId = getXmlAttribute<string>(element, 'id');\n if (typeof directId === 'string' && directId.length > 0) return directId;\n\n const attrs = getXmlAttribute<Record<string, unknown>>(element, 'attrs');\n const attrsId = isRecord(attrs) ? attrs.id : undefined;\n return typeof attrsId === 'string' && attrsId.length > 0 ? attrsId : undefined;\n}\n\nfunction updateXmlElementProps(element: YXmlElementLike, blockId: string, propsPatch: Record<string, unknown>): void {\n const attrs = getXmlAttribute<Record<string, unknown>>(element, 'attrs');\n if (isRecord(attrs)) {\n const existingProps = isRecord(attrs.props) ? attrs.props : {};\n setXmlAttribute(element, 'attrs', {\n ...attrs,\n id: typeof attrs.id === 'string' ? attrs.id : blockId,\n props: {\n ...existingProps,\n ...propsPatch,\n },\n });\n }\n\n for (const [key, value] of Object.entries(propsPatch)) {\n element.setAttribute(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n}\n\nfunction findXmlElementById(container: YXmlContainerLike, blockId: string): YXmlElementLike | null {\n for (const node of container.toArray()) {\n if (!isYXmlElementLike(node)) continue;\n const id = getElementBlockId(node);\n if (id === blockId) return node;\n const nested = findXmlElementById(node, blockId);\n if (nested) return nested;\n }\n return null;\n}\n\nfunction updateDocumentBlockProps(yDoc: Doc, blockId: string, propsPatch: Record<string, unknown>): boolean {\n const target = findXmlElementById(yDoc.getXmlFragment('document'), blockId);\n if (!target) return false;\n\n updateXmlElementProps(target, blockId, propsPatch);\n\n const content = target.toArray().find((node): node is YXmlElementLike => isYXmlElementLike(node) && node.nodeName !== 'blockGroup');\n if (content) {\n updateXmlElementProps(content, blockId, propsPatch);\n }\n\n return true;\n}\n\nfunction assignActorInYDoc(yDoc: Doc, command: FlowAgentCommand, context: FlowAgentContext): Record<string, unknown> {\n const targetActorDid = typeof command.payload.targetActorDid === 'string' && command.payload.targetActorDid.length > 0 ? command.payload.targetActorDid : context.actor.did;\n const targetMatrixUserId = typeof command.payload.targetMatrixUserId === 'string' ? command.payload.targetMatrixUserId : undefined;\n const assignment = {\n assignedActor: {\n did: targetActorDid,\n avatar: '',\n displayName: targetMatrixUserId || targetActorDid,\n },\n assignedBy: {\n did: context.actor.did,\n avatar: '',\n displayName: context.actor.displayName || context.actor.matrixUserId || '',\n },\n assignedTimestamp: new Date(context.now?.() || Date.now()).toISOString(),\n };\n const assignmentJson = JSON.stringify(assignment);\n\n const updatedDocument = updateDocumentBlockProps(yDoc, command.nodeId, {\n assignment: assignmentJson,\n });\n\n if (!updatedDocument) {\n throw new Error(`Block ${command.nodeId} was not found for assignment`);\n }\n\n const runtime = createYDocRuntimeManager(yDoc, context.sessionRunId);\n runtime.update(command.nodeId, {\n assignedActorDid: targetActorDid,\n assignedByDid: context.actor.did,\n assignedAt: assignment.assignedTimestamp,\n lastCommandId: command.id,\n } as Record<string, unknown>);\n\n return assignment;\n}\n\nasync function executeAssignActorCommand(command: FlowAgentCommand, context: FlowAgentContext, options: ExecuteFlowAgentCoreCommandOptions): Promise<FlowAgentCommandResult> {\n const capability = { can: 'flow/node/assign', with: `${context.flowUri}:${command.nodeId}` };\n const proofs = await options.ucanService.findValidProofs(context.actor.did, capability);\n if (!proofs.found || !proofs.proofCids) {\n return {\n commandId: command.id,\n success: false,\n error: proofs.error || 'No valid delegation found for assignment',\n };\n }\n\n const result = await options.ucanService.executeWithInvocation(\n {\n invokerDid: context.actor.did,\n invokerType: options.actorType,\n entityRoomId: options.entityRoomId,\n capability,\n proofs: proofs.proofCids,\n pin: options.pin,\n },\n async () => assignActorInYDoc(context.yDoc, command, context),\n context.flowId,\n command.nodeId,\n context.sessionRunId\n );\n\n return {\n commandId: command.id,\n success: result.success,\n confirmed: result.success,\n output:\n result.actionResult && typeof result.actionResult === 'object'\n ? { assignment: result.actionResult as Record<string, unknown>, invocationCid: result.invocationCid }\n : { invocationCid: result.invocationCid },\n error: result.error,\n };\n}\n\nasync function recoverPendingActionTimeline(\n command: FlowAgentCommand,\n context: FlowAgentContext,\n options: ExecuteFlowAgentCoreCommandOptions\n): Promise<FlowAgentCommandResult | undefined> {\n const pendingTimeline = readPendingRunTimelineEvents(context.yDoc, context.sessionRunId, command.nodeId);\n if (pendingTimeline.length === 0) return undefined;\n if (!options.runEventLog) {\n return {\n commandId: command.id,\n success: false,\n confirmed: false,\n status: 'awaiting_readback',\n error: 'Canonical run history is pending and no run event log is available for replay.',\n };\n }\n const replay = await retryPendingRunTimelineEvents({\n yDoc: context.yDoc,\n sessionRunId: context.sessionRunId,\n blockId: command.nodeId,\n eventLog: options.runEventLog,\n now: options.now || context.now,\n });\n const current = readActionState(context.yDoc, context.sessionRunId, command.nodeId);\n const replayedOutput = boundRunActionOutput(current.output || {}).output;\n const replayStatus: FlowAgentCommand['status'] =\n replay.remaining > 0 || current.state === 'awaiting_readback' ? 'awaiting_readback' : current.state === 'completed' ? 'confirmed' : 'failed';\n return {\n commandId: command.id,\n success: replayStatus === 'confirmed',\n confirmed: replayStatus === 'confirmed',\n status: replayStatus,\n output: {\n ...replayedOutput,\n ...(current.lastEventId ? { lastEventId: current.lastEventId } : {}),\n replayedTimelineEvents: replay.attempted,\n remainingTimelineEvents: replay.remaining,\n },\n ...(replay.remaining > 0\n ? { error: 'Canonical run history replay remains incomplete.' }\n : replayStatus === 'failed'\n ? {\n error: current.error?.message || 'The action completed in a non-confirmable terminal state.',\n }\n : {}),\n completionState:\n current.state === 'completed'\n ? 'completed'\n : current.state === 'needs_verification'\n ? 'needs_verification'\n : current.state === 'awaiting_readback'\n ? 'awaiting_readback'\n : 'failed',\n };\n}\n\nasync function executeActionCommand(command: FlowAgentCommand, context: FlowAgentContext, options: ExecuteFlowAgentCoreCommandOptions): Promise<FlowAgentCommandResult> {\n const recoveredTimeline = await recoverPendingActionTimeline(command, context, options);\n if (recoveredTimeline) return recoveredTimeline;\n\n const actionType = typeof command.payload.actionType === 'string' ? command.payload.actionType : undefined;\n if (!actionType) {\n return { commandId: command.id, success: false, error: 'execute_action command is missing payload.actionType' };\n }\n\n const block = findContextBlock(context, command.nodeId);\n if (!block) {\n return { commandId: command.id, success: false, error: `Block ${command.nodeId} was not found in runtime context` };\n }\n\n const props = getBlockProps(block);\n if (typeof props.actionType === 'string' && props.actionType !== actionType) {\n return {\n commandId: command.id,\n success: false,\n error: `execute_action payload.actionType ${actionType} does not match block actionType ${props.actionType}`,\n };\n }\n\n const runtimeInputs = command.payload.runtimeInputs;\n if (runtimeInputs != null && !isRecord(runtimeInputs)) {\n return { commandId: command.id, success: false, error: 'execute_action payload.runtimeInputs must be an object when provided' };\n }\n\n const inputValidation = validateFlowAgentExecuteActionPayload(block, command.payload);\n if (!inputValidation.valid) {\n return {\n commandId: command.id,\n success: false,\n confirmed: false,\n status: inputValidation.mode === 'human-only' ? 'skipped' : 'failed',\n error: inputValidation.reason,\n };\n }\n\n const pendingInvocationId = typeof command.payload.pendingInvocationId === 'string' ? command.payload.pendingInvocationId : undefined;\n const outcome = await executeActionBlock({\n editorOrYDoc: context.editor || context.yDoc,\n // The SESSION run (runs.ts), not the per-execution audit id. Constant in\n // Phase A; passed explicitly so the headless path is already shaped for\n // Phase B run selection instead of falling back to a doc-level default.\n runId: context.sessionRunId,\n block,\n blockId: command.nodeId,\n document: (context.documentBlocks || context.blocks || context.editor?.document || []) as any[],\n actorDid: context.actor.did,\n actorType: options.actorType,\n entityRoomId: options.entityRoomId,\n ucanService: options.ucanService,\n invocationStore: options.invocationStore,\n services: options.actionServices || {},\n handlers: options.actionHandlers,\n runtimeInputs: getCommandRuntimeInputs(command.payload),\n pendingInvocationId,\n pin: options.pin,\n flowUri: context.flowUri,\n flowId: context.flowId,\n flowOwnerDid: options.flowOwnerDid || '',\n schemaVersion: options.schemaVersion || DEFAULT_SCHEMA_VERSION,\n runEventLog: options.runEventLog,\n now: options.now || context.now,\n });\n const persisted = readActionState(context.yDoc, context.sessionRunId, command.nodeId);\n const durableOutput = boundRunActionOutput(persisted.output || {}).output;\n const pendingAfterExecution = readPendingRunTimelineEvents(context.yDoc, context.sessionRunId, command.nodeId);\n const timelinePending = pendingAfterExecution.length > 0;\n\n return {\n commandId: command.id,\n success: outcome.success,\n confirmed: !timelinePending && outcome.success && outcome.completionState === 'completed',\n ...(timelinePending ? { status: 'awaiting_readback' as const } : {}),\n output: {\n ...durableOutput,\n ...(persisted.lastEventId ? { lastEventId: persisted.lastEventId } : {}),\n ...(outcome.invocationCid ? { invocationCid: outcome.invocationCid } : {}),\n ...(outcome.capabilityId ? { capabilityId: outcome.capabilityId } : {}),\n // Execution audit id under both names: `runId` is what flow-manager and\n // flow-agent read today (deprecated), `executionId` is the forward name.\n ...(outcome.runId ? { runId: outcome.runId } : {}),\n ...(outcome.executionId ? { executionId: outcome.executionId } : {}),\n ...(pendingInvocationId ? { pendingInvocationId, pendingInvocationRemoved: outcome.pendingInvocationRemoved } : {}),\n completionState: outcome.completionState,\n ...(timelinePending ? { remainingTimelineEvents: pendingAfterExecution.length } : {}),\n },\n error: timelinePending ? 'The action effect completed, but canonical run history is pending replay.' : outcome.error,\n completionState: outcome.completionState,\n };\n}\n\nfunction getRecoverableBlockerReason(runtime: Record<string, unknown>): string | null {\n const error = runtime.error;\n const message =\n error && typeof error === 'object' && typeof (error as Record<string, unknown>).message === 'string'\n ? ((error as Record<string, unknown>).message as string)\n : typeof error === 'string'\n ? error\n : undefined;\n\n if (!message) return null;\n if (message.includes('Invalid DID') && message.includes(\"must start with 'did:'\")) {\n return 'matrix_did_normalization';\n }\n if (message.includes('Failed to parse URL from undefined')) {\n return 'http_endpoint_input_normalization';\n }\n if (message.includes('Unexpected content type') || message.includes('already been defined with a different constructor')) {\n return 'audit_trail_shape';\n }\n return null;\n}\n\nfunction resetFailedActionCommands(context: FlowAgentContext, nodeId: string, now: number): string[] {\n const { outbox } = getFlowAgentMaps(context.yDoc);\n const resetIds: string[] = [];\n outbox.forEach((command) => {\n if (command.sessionRunId !== context.sessionRunId || command.nodeId !== nodeId || command.type !== 'execute_action' || command.status !== 'failed') {\n return;\n }\n outbox.set(command.id, {\n ...command,\n status: 'queued',\n error: undefined,\n lease: undefined,\n updatedAt: now,\n reason: `Retry after blocker diagnosis: ${command.reason}`,\n });\n resetIds.push(command.id);\n });\n return resetIds;\n}\n\nasync function executeDiagnoseBlockerCommand(command: FlowAgentCommand, context: FlowAgentContext, options: ExecuteFlowAgentCoreCommandOptions): Promise<FlowAgentCommandResult> {\n const now = options.now?.() || context.now?.() || Date.now();\n const runtime = getRuntimeRecord(context.yDoc, context.sessionRunId, command.nodeId);\n const recovery = getRecoverableBlockerReason(runtime);\n\n if (!recovery) {\n return {\n commandId: command.id,\n success: true,\n confirmed: true,\n output: {\n blockerCause: command.payload.cause || 'unknown',\n recovery: 'manual_intervention_required',\n },\n };\n }\n\n clearRuntimeBlocker(context.yDoc, context.sessionRunId, command.nodeId, {\n diagnosedAt: now,\n diagnosedByDid: context.actor.did,\n lastDiagnosisCommandId: command.id,\n lastRecovery: recovery,\n });\n const resetCommandIds = resetFailedActionCommands(context, command.nodeId, now);\n\n return {\n commandId: command.id,\n success: true,\n confirmed: true,\n output: {\n blockerCause: command.payload.cause || 'unknown',\n recovery,\n resetCommandIds,\n },\n };\n}\n\nexport async function executeFlowAgentCoreCommand(\n command: FlowAgentCommand,\n context: FlowAgentContext,\n options: ExecuteFlowAgentCoreCommandOptions\n): Promise<FlowAgentCommandResult> {\n const executionContext = resolveExecutionContext(context);\n switch (command.type) {\n case 'assign_actor':\n return executeAssignActorCommand(command, executionContext, options);\n case 'execute_action':\n return executeActionCommand(command, executionContext, options);\n case 'diagnose_blocker':\n return executeDiagnoseBlockerCommand(command, executionContext, options);\n default:\n return { commandId: command.id, success: false, error: `No editor-core executor for ${command.type}` };\n }\n}\n\nasync function callConfiguredExecutor(\n command: FlowAgentCommand,\n context: FlowAgentContext,\n options: ExecuteQueuedFlowAgentCoreCommandsOptions\n): Promise<FlowAgentCommandResult | undefined> {\n if (!options.executor) return undefined;\n switch (command.type) {\n case 'assign_actor':\n return options.executor.assignActor?.(command, context);\n case 'execute_action':\n return options.executor.executeAction?.(command, context);\n case 'notify_actor':\n return options.executor.notifyActor?.(command, context);\n case 'diagnose_blocker':\n return options.executor.diagnoseBlocker?.(command, context);\n default:\n return undefined;\n }\n}\n\nfunction statusForResult(result: FlowAgentCommandResult): FlowAgentCommand['status'] {\n if (result.status) return result.status;\n if (!result.success) return 'failed';\n return result.confirmed === false ? 'awaiting_readback' : 'confirmed';\n}\n\nexport async function executeQueuedFlowAgentCoreCommands(context: FlowAgentContext, options: ExecuteQueuedFlowAgentCoreCommandsOptions): Promise<FlowAgentCommandResult[]> {\n context = resolveExecutionContext(context);\n const now = options.now?.() || context.now?.() || Date.now();\n const { leases } = getFlowAgentMaps(context.yDoc);\n const results: FlowAgentCommandResult[] = [];\n const queued = readQueuedAgentCommands(context.yDoc, context.sessionRunId);\n const queuedIds = new Set(queued.map((command) => command.id));\n const retainedTimelineRecoveries = readAgentCommands(context.yDoc, context.sessionRunId).filter(\n (command) =>\n command.status === 'awaiting_readback' &&\n command.type === 'execute_action' &&\n !queuedIds.has(command.id) &&\n readPendingRunTimelineEvents(context.yDoc, context.sessionRunId, command.nodeId).length > 0\n );\n\n for (const command of [...retainedTimelineRecoveries, ...queued]) {\n if (options.commandTypes && !options.commandTypes.includes(command.type)) {\n continue;\n }\n\n const validation = validateAgentCommand(command);\n if (!validation.valid) {\n updateAgentCommand(context.yDoc, command.id, { status: 'failed', error: validation.error, updatedAt: now });\n results.push({ commandId: command.id, success: false, error: validation.error });\n continue;\n }\n\n const policy = evaluateFlowAgentPolicy({\n actorDid: context.actor.did,\n commandType: command.type,\n flowUri: context.flowUri,\n nodeId: command.nodeId,\n delegationStore: options.delegationStore,\n delegations: options.delegations,\n now,\n });\n if (!policy.allowed) {\n updateAgentCommand(context.yDoc, command.id, { status: 'skipped', error: policy.reason, updatedAt: now });\n results.push({ commandId: command.id, success: false, error: policy.reason });\n continue;\n }\n\n const lease = acquireFlowAgentLease({\n leases,\n commandId: command.id,\n sessionRunId: context.sessionRunId,\n nodeId: command.nodeId,\n actorDid: context.actor.did,\n now,\n ttlMs: options.leaseTtlMs,\n });\n if (!lease) continue;\n\n updateAgentCommand(context.yDoc, command.id, { status: 'running', lease, updatedAt: now });\n\n try {\n const runningCommand = { ...command, lease, status: 'running' as const };\n const result = (await Promise.resolve(callConfiguredExecutor(runningCommand, context, options))) || (await executeFlowAgentCoreCommand(runningCommand, context, options));\n const normalized = result || {\n commandId: command.id,\n success: false,\n error: `No executor configured for ${command.type}`,\n };\n\n if (!validateFlowAgentLease(leases, lease, options.now?.() || context.now?.() || Date.now())) {\n const error = 'Lease expired or was superseded before command commit';\n updateAgentCommand(context.yDoc, command.id, { status: 'failed', error, updatedAt: options.now?.() || context.now?.() || Date.now() });\n results.push({ commandId: command.id, success: false, error });\n continue;\n }\n\n updateAgentCommand(context.yDoc, command.id, {\n status: statusForResult(normalized),\n error: normalized.error,\n updatedAt: options.now?.() || context.now?.() || Date.now(),\n });\n safeAppendAgentLedgerEvent(context.yDoc, {\n type: normalized.success ? 'agent.validation' : 'agent.escalation',\n flowId: context.flowId,\n sessionRunId: context.sessionRunId,\n nodeId: command.nodeId,\n commandId: command.id,\n actorDid: context.actor.did,\n timestamp: options.now?.() || context.now?.() || Date.now(),\n details: {\n success: normalized.success,\n confirmed: normalized.confirmed,\n output: boundRunActionOutput(normalized.output || {}).output,\n error: normalized.error,\n },\n });\n results.push(normalized);\n } finally {\n releaseFlowAgentLease(leases, lease);\n }\n }\n\n return results;\n}\n","import type { FlowAgentContext, FlowAgentTickResult } from '../../types/flowAgent';\nimport type { FlowAgentOrchestratorOptions } from './orchestrator';\nimport { tickFlowAgent } from './orchestrator';\n\nexport interface FlowAgentServiceOptions extends FlowAgentOrchestratorOptions {\n intervalMs?: number;\n onTick?: (result: FlowAgentTickResult) => void | Promise<void>;\n onError?: (error: unknown) => void;\n}\n\n/**\n * Headless-service adapter boundary.\n *\n * Host applications own Matrix login, room joins, and Y.Doc sync. Once they\n * have a live Y.Doc/editor snapshot, this service provides the deterministic\n * Ralph-loop tick and command execution cycle.\n */\nexport class FlowAgentService {\n private timer: ReturnType<typeof setInterval> | null = null;\n private running = false;\n\n constructor(\n private readonly context: FlowAgentContext,\n private readonly options: FlowAgentServiceOptions = {}\n ) {}\n\n async tick(): Promise<FlowAgentTickResult> {\n if (this.running) {\n return {\n flowDone: false,\n snapshots: [],\n queuedCommands: [],\n executedCommands: [],\n };\n }\n\n this.running = true;\n try {\n const result = await tickFlowAgent(this.context, this.options);\n await this.options.onTick?.(result);\n return result;\n } catch (error) {\n this.options.onError?.(error);\n throw error;\n } finally {\n this.running = false;\n }\n }\n\n start(): void {\n if (this.timer) return;\n const intervalMs = this.options.intervalMs || 30_000;\n this.timer = setInterval(() => {\n this.tick().catch((error) => {\n this.options.onError?.(error);\n });\n }, intervalMs);\n }\n\n stop(): void {\n if (!this.timer) return;\n clearInterval(this.timer);\n this.timer = null;\n }\n}\n"],"mappings":"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","names":["storedDelegation","actions","output","missing","actions","seen","claimId","BASELINE_OUTPUT","normalizeDecision","actions","members","SENSITIVE_PLAINTEXT_KEYS","SENSITIVE_PLAINTEXT_KEYS","CollectionStateEnum","transactionHash","collectionId","result","granteeAddress","transactionHash","roleLabel","roleLabel","formatCoin","USDC_DENOM","DECIMALS","formatCoin","formatCoin","formatQuota","USDC_DENOM","formatCoin","Y","LEGACY_RUNTIME_MAP_KEY","LEGACY_RUNTIME_MAP_KEY","actions","value","Y","getNodeOutput","getNodeOutput","XERO_WORK_ITEMS_MAP_NAME","XERO_WORK_TERMINAL_MAP_NAME","fnv1a32","flattenBlocks","next","Y","fnv1a32","fnv1a32","CROCKFORD","getNodeOutput","fieldPath","Y","executionId","Y","isYDoc","getYDoc","parseInputs","getRuntime","getEditor","makeExecutionId","getReconcileEditor","parseOutputRef","Y","Y","Y","Y","getRuntime","command","safeAppendAgentLedgerEvent","isRecord","statusForResult"]}
|