@lssm/lib.communication-spec 3.1.1
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/README.md +201 -0
- package/dist/browser/capabilities/comms-ai.capabilities.js +1 -0
- package/dist/browser/capabilities/communication-os.capability-ids.js +1 -0
- package/dist/browser/capabilities/ecosystem-messaging.capabilities.js +1 -0
- package/dist/browser/capabilities/index.js +1 -0
- package/dist/browser/commands/comms-ai.commands.js +1 -0
- package/dist/browser/commands/index.js +1 -0
- package/dist/browser/contracts/agent-communication.js +1 -0
- package/dist/browser/contracts/agent-lifecycle-projection.js +1 -0
- package/dist/browser/contracts/agent-surface-control.js +1 -0
- package/dist/browser/contracts/ai-assistance.operations.js +1 -0
- package/dist/browser/contracts/artifact-digest.js +1 -0
- package/dist/browser/contracts/canonical-agent-conversation.js +1 -0
- package/dist/browser/contracts/channel-preferences.js +1 -0
- package/dist/browser/contracts/channel-routing.js +1 -0
- package/dist/browser/contracts/collaboration.operations.js +1 -0
- package/dist/browser/contracts/customer-live-chat-grant.operations.js +1 -0
- package/dist/browser/contracts/delivery-eligibility.js +1 -0
- package/dist/browser/contracts/delivery-fallback-eligibility-validation.js +1 -0
- package/dist/browser/contracts/delivery-fallback-validation.js +1 -0
- package/dist/browser/contracts/delivery-fallback.js +1 -0
- package/dist/browser/contracts/delivery-intent-validation.js +1 -0
- package/dist/browser/contracts/delivery-intent.js +1 -0
- package/dist/browser/contracts/delivery-progress.js +1 -0
- package/dist/browser/contracts/discord-community-intelligence.operations.js +1 -0
- package/dist/browser/contracts/discord-community.events.js +1 -0
- package/dist/browser/contracts/discord-community.models.js +1 -0
- package/dist/browser/contracts/discord-community.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-attachment.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-auth.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-binding.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-connection-subscription.events.js +1 -0
- package/dist/browser/contracts/ecosystem-governed-work-v2.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-governed-work.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-identity-v3.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-identity.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-message.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-messaging.dtos.js +0 -0
- package/dist/browser/contracts/ecosystem-messaging.events.js +1 -0
- package/dist/browser/contracts/ecosystem-messaging.models.js +1 -0
- package/dist/browser/contracts/ecosystem-navigation-v3.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-webhook.operations.js +1 -0
- package/dist/browser/contracts/ecosystem-workspace.operations.js +1 -0
- package/dist/browser/contracts/enums.js +1 -0
- package/dist/browser/contracts/erasure.operations.js +1 -0
- package/dist/browser/contracts/events.js +1 -0
- package/dist/browser/contracts/index.js +1 -0
- package/dist/browser/contracts/ingestion.js +1 -0
- package/dist/browser/contracts/ingress-admission-policy.js +1 -0
- package/dist/browser/contracts/ingress-admission.js +1 -0
- package/dist/browser/contracts/models.js +1 -0
- package/dist/browser/contracts/operations.js +1 -0
- package/dist/browser/contracts/persistence.js +1 -0
- package/dist/browser/contracts/preference-resolution.js +1 -0
- package/dist/browser/contracts/query.operations.js +1 -0
- package/dist/browser/contracts/sequence-intent.js +1 -0
- package/dist/browser/contracts/sovereignty.js +1 -0
- package/dist/browser/contracts/support-internal-note.operations.js +1 -0
- package/dist/browser/contracts/thread-link-kind.js +1 -0
- package/dist/browser/contracts/thread-message.operations.js +1 -0
- package/dist/browser/events/index.js +1 -0
- package/dist/browser/fixtures/agent-omnichannel-primitives.js +1 -0
- package/dist/browser/fixtures/agent-omnichannel.js +1 -0
- package/dist/browser/fixtures/gtm-learning-loop-neutral.parts.js +1 -0
- package/dist/browser/fixtures/index.js +1 -0
- package/dist/browser/fixtures/normalized-ingestion.js +1 -0
- package/dist/browser/index.js +1 -0
- package/dist/browser/queries/index.js +1 -0
- package/dist/browser/types/domain-command.js +0 -0
- package/dist/browser/types/index.js +1 -0
- package/dist/browser/validation/domain-command.js +1 -0
- package/dist/browser/validation/index.js +1 -0
- package/dist/capabilities/comms-ai.capabilities.d.ts +72 -0
- package/dist/capabilities/comms-ai.capabilities.js +2 -0
- package/dist/capabilities/communication-os-capability-boundary.test.d.ts +1 -0
- package/dist/capabilities/communication-os.capability-ids.d.ts +39 -0
- package/dist/capabilities/communication-os.capability-ids.js +2 -0
- package/dist/capabilities/communication-os.capability-ids.test.d.ts +1 -0
- package/dist/capabilities/ecosystem-messaging.capabilities.d.ts +9 -0
- package/dist/capabilities/ecosystem-messaging.capabilities.js +2 -0
- package/dist/capabilities/index.d.ts +4 -0
- package/dist/capabilities/index.js +2 -0
- package/dist/commands/comms-ai.commands.d.ts +272 -0
- package/dist/commands/comms-ai.commands.js +2 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.js +2 -0
- package/dist/contracts/agent-communication.d.ts +108 -0
- package/dist/contracts/agent-communication.js +2 -0
- package/dist/contracts/agent-communication.test.d.ts +1 -0
- package/dist/contracts/agent-lifecycle-projection.d.ts +98 -0
- package/dist/contracts/agent-lifecycle-projection.js +2 -0
- package/dist/contracts/agent-lifecycle-projection.test.d.ts +1 -0
- package/dist/contracts/agent-surface-control.d.ts +210 -0
- package/dist/contracts/agent-surface-control.js +2 -0
- package/dist/contracts/agent-surface-control.test.d.ts +1 -0
- package/dist/contracts/ai-assistance.operations.d.ts +187 -0
- package/dist/contracts/ai-assistance.operations.js +2 -0
- package/dist/contracts/artifact-digest.d.ts +3 -0
- package/dist/contracts/artifact-digest.js +2 -0
- package/dist/contracts/canonical-agent-conversation.d.ts +46 -0
- package/dist/contracts/canonical-agent-conversation.js +2 -0
- package/dist/contracts/canonical-agent-conversation.test.d.ts +1 -0
- package/dist/contracts/channel-preferences.d.ts +115 -0
- package/dist/contracts/channel-preferences.js +2 -0
- package/dist/contracts/channel-routing.d.ts +58 -0
- package/dist/contracts/channel-routing.js +2 -0
- package/dist/contracts/channel-routing.test.d.ts +1 -0
- package/dist/contracts/collaboration.operations.d.ts +315 -0
- package/dist/contracts/collaboration.operations.js +2 -0
- package/dist/contracts/customer-live-chat-grant.operations.d.ts +132 -0
- package/dist/contracts/customer-live-chat-grant.operations.js +2 -0
- package/dist/contracts/delivery-contracts.test.d.ts +1 -0
- package/dist/contracts/delivery-eligibility.d.ts +126 -0
- package/dist/contracts/delivery-eligibility.js +2 -0
- package/dist/contracts/delivery-eligibility.test.d.ts +1 -0
- package/dist/contracts/delivery-fallback-eligibility-validation.d.ts +6 -0
- package/dist/contracts/delivery-fallback-eligibility-validation.js +2 -0
- package/dist/contracts/delivery-fallback-validation.d.ts +24 -0
- package/dist/contracts/delivery-fallback-validation.js +2 -0
- package/dist/contracts/delivery-fallback.d.ts +117 -0
- package/dist/contracts/delivery-fallback.js +2 -0
- package/dist/contracts/delivery-intent-validation.d.ts +13 -0
- package/dist/contracts/delivery-intent-validation.js +2 -0
- package/dist/contracts/delivery-intent.d.ts +137 -0
- package/dist/contracts/delivery-intent.js +2 -0
- package/dist/contracts/delivery-progress.d.ts +61 -0
- package/dist/contracts/delivery-progress.js +2 -0
- package/dist/contracts/discord-community-intelligence.operations.d.ts +405 -0
- package/dist/contracts/discord-community-intelligence.operations.js +2 -0
- package/dist/contracts/discord-community.events.d.ts +162 -0
- package/dist/contracts/discord-community.events.js +2 -0
- package/dist/contracts/discord-community.models.d.ts +167 -0
- package/dist/contracts/discord-community.models.js +2 -0
- package/dist/contracts/discord-community.operations.d.ts +663 -0
- package/dist/contracts/discord-community.operations.js +2 -0
- package/dist/contracts/discord-community.test.d.ts +1 -0
- package/dist/contracts/ecosystem-attachment.operations.d.ts +129 -0
- package/dist/contracts/ecosystem-attachment.operations.js +2 -0
- package/dist/contracts/ecosystem-auth.operations.d.ts +345 -0
- package/dist/contracts/ecosystem-auth.operations.js +2 -0
- package/dist/contracts/ecosystem-binding.operations.d.ts +231 -0
- package/dist/contracts/ecosystem-binding.operations.js +2 -0
- package/dist/contracts/ecosystem-connection-subscription.events.d.ts +332 -0
- package/dist/contracts/ecosystem-connection-subscription.events.js +2 -0
- package/dist/contracts/ecosystem-governed-work-v2.operations.d.ts +234 -0
- package/dist/contracts/ecosystem-governed-work-v2.operations.js +2 -0
- package/dist/contracts/ecosystem-governed-work.operations.d.ts +265 -0
- package/dist/contracts/ecosystem-governed-work.operations.js +2 -0
- package/dist/contracts/ecosystem-governed-work.operations.test.d.ts +1 -0
- package/dist/contracts/ecosystem-identity-v3.operations.d.ts +65 -0
- package/dist/contracts/ecosystem-identity-v3.operations.js +2 -0
- package/dist/contracts/ecosystem-identity.operations.d.ts +174 -0
- package/dist/contracts/ecosystem-identity.operations.js +2 -0
- package/dist/contracts/ecosystem-identity.operations.test.d.ts +1 -0
- package/dist/contracts/ecosystem-message.operations.d.ts +1092 -0
- package/dist/contracts/ecosystem-message.operations.js +2 -0
- package/dist/contracts/ecosystem-messaging.dtos.d.ts +68 -0
- package/dist/contracts/ecosystem-messaging.dtos.js +1 -0
- package/dist/contracts/ecosystem-messaging.dtos.test.d.ts +1 -0
- package/dist/contracts/ecosystem-messaging.events.d.ts +608 -0
- package/dist/contracts/ecosystem-messaging.events.js +2 -0
- package/dist/contracts/ecosystem-messaging.models.d.ts +386 -0
- package/dist/contracts/ecosystem-messaging.models.js +2 -0
- package/dist/contracts/ecosystem-messaging.test.d.ts +1 -0
- package/dist/contracts/ecosystem-navigation-v3.operations.d.ts +149 -0
- package/dist/contracts/ecosystem-navigation-v3.operations.js +2 -0
- package/dist/contracts/ecosystem-webhook.operations.d.ts +187 -0
- package/dist/contracts/ecosystem-webhook.operations.js +2 -0
- package/dist/contracts/ecosystem-workspace.operations.d.ts +590 -0
- package/dist/contracts/ecosystem-workspace.operations.js +2 -0
- package/dist/contracts/enums.d.ts +9 -0
- package/dist/contracts/enums.js +2 -0
- package/dist/contracts/erasure.operations.d.ts +114 -0
- package/dist/contracts/erasure.operations.js +2 -0
- package/dist/contracts/erasure.test.d.ts +1 -0
- package/dist/contracts/events.d.ts +174 -0
- package/dist/contracts/events.js +2 -0
- package/dist/contracts/index.d.ts +43 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/ingestion.d.ts +169 -0
- package/dist/contracts/ingestion.js +2 -0
- package/dist/contracts/ingress-admission-policy.d.ts +14 -0
- package/dist/contracts/ingress-admission-policy.js +2 -0
- package/dist/contracts/ingress-admission.d.ts +184 -0
- package/dist/contracts/ingress-admission.js +2 -0
- package/dist/contracts/ingress-admission.test.d.ts +1 -0
- package/dist/contracts/models.d.ts +851 -0
- package/dist/contracts/models.js +2 -0
- package/dist/contracts/operations.d.ts +5 -0
- package/dist/contracts/operations.js +2 -0
- package/dist/contracts/persistence.d.ts +353 -0
- package/dist/contracts/persistence.js +2 -0
- package/dist/contracts/persistence.test.d.ts +1 -0
- package/dist/contracts/preference-resolution.d.ts +154 -0
- package/dist/contracts/preference-resolution.js +2 -0
- package/dist/contracts/preference-resolution.test.d.ts +1 -0
- package/dist/contracts/query.operations.d.ts +600 -0
- package/dist/contracts/query.operations.js +2 -0
- package/dist/contracts/sequence-intent.d.ts +103 -0
- package/dist/contracts/sequence-intent.js +2 -0
- package/dist/contracts/sequence-intent.test.d.ts +1 -0
- package/dist/contracts/sovereignty.d.ts +164 -0
- package/dist/contracts/sovereignty.js +2 -0
- package/dist/contracts/support-internal-note.operations.d.ts +309 -0
- package/dist/contracts/support-internal-note.operations.js +2 -0
- package/dist/contracts/support-internal-note.operations.test.d.ts +1 -0
- package/dist/contracts/thread-link-kind.d.ts +20 -0
- package/dist/contracts/thread-link-kind.js +2 -0
- package/dist/contracts/thread-message.operations.d.ts +485 -0
- package/dist/contracts/thread-message.operations.js +2 -0
- package/dist/events/index.d.ts +4 -0
- package/dist/events/index.js +2 -0
- package/dist/fixtures/agent-omnichannel-primitives.d.ts +240 -0
- package/dist/fixtures/agent-omnichannel-primitives.js +2 -0
- package/dist/fixtures/agent-omnichannel.d.ts +682 -0
- package/dist/fixtures/agent-omnichannel.js +2 -0
- package/dist/fixtures/agent-omnichannel.test.d.ts +1 -0
- package/dist/fixtures/gtm-learning-loop-neutral.parts.d.ts +20 -0
- package/dist/fixtures/gtm-learning-loop-neutral.parts.js +2 -0
- package/dist/fixtures/index.d.ts +3 -0
- package/dist/fixtures/index.js +2 -0
- package/dist/fixtures/normalized-ingestion.d.ts +102 -0
- package/dist/fixtures/normalized-ingestion.js +2 -0
- package/dist/fixtures/normalized-ingestion.test.d.ts +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +2 -0
- package/dist/node/capabilities/comms-ai.capabilities.js +1 -0
- package/dist/node/capabilities/communication-os.capability-ids.js +1 -0
- package/dist/node/capabilities/ecosystem-messaging.capabilities.js +1 -0
- package/dist/node/capabilities/index.js +1 -0
- package/dist/node/commands/comms-ai.commands.js +1 -0
- package/dist/node/commands/index.js +1 -0
- package/dist/node/contracts/agent-communication.js +1 -0
- package/dist/node/contracts/agent-lifecycle-projection.js +1 -0
- package/dist/node/contracts/agent-surface-control.js +1 -0
- package/dist/node/contracts/ai-assistance.operations.js +1 -0
- package/dist/node/contracts/artifact-digest.js +1 -0
- package/dist/node/contracts/canonical-agent-conversation.js +1 -0
- package/dist/node/contracts/channel-preferences.js +1 -0
- package/dist/node/contracts/channel-routing.js +1 -0
- package/dist/node/contracts/collaboration.operations.js +1 -0
- package/dist/node/contracts/customer-live-chat-grant.operations.js +1 -0
- package/dist/node/contracts/delivery-eligibility.js +1 -0
- package/dist/node/contracts/delivery-fallback-eligibility-validation.js +1 -0
- package/dist/node/contracts/delivery-fallback-validation.js +1 -0
- package/dist/node/contracts/delivery-fallback.js +1 -0
- package/dist/node/contracts/delivery-intent-validation.js +1 -0
- package/dist/node/contracts/delivery-intent.js +1 -0
- package/dist/node/contracts/delivery-progress.js +1 -0
- package/dist/node/contracts/discord-community-intelligence.operations.js +1 -0
- package/dist/node/contracts/discord-community.events.js +1 -0
- package/dist/node/contracts/discord-community.models.js +1 -0
- package/dist/node/contracts/discord-community.operations.js +1 -0
- package/dist/node/contracts/ecosystem-attachment.operations.js +1 -0
- package/dist/node/contracts/ecosystem-auth.operations.js +1 -0
- package/dist/node/contracts/ecosystem-binding.operations.js +1 -0
- package/dist/node/contracts/ecosystem-connection-subscription.events.js +1 -0
- package/dist/node/contracts/ecosystem-governed-work-v2.operations.js +1 -0
- package/dist/node/contracts/ecosystem-governed-work.operations.js +1 -0
- package/dist/node/contracts/ecosystem-identity-v3.operations.js +1 -0
- package/dist/node/contracts/ecosystem-identity.operations.js +1 -0
- package/dist/node/contracts/ecosystem-message.operations.js +1 -0
- package/dist/node/contracts/ecosystem-messaging.dtos.js +0 -0
- package/dist/node/contracts/ecosystem-messaging.events.js +1 -0
- package/dist/node/contracts/ecosystem-messaging.models.js +1 -0
- package/dist/node/contracts/ecosystem-navigation-v3.operations.js +1 -0
- package/dist/node/contracts/ecosystem-webhook.operations.js +1 -0
- package/dist/node/contracts/ecosystem-workspace.operations.js +1 -0
- package/dist/node/contracts/enums.js +1 -0
- package/dist/node/contracts/erasure.operations.js +1 -0
- package/dist/node/contracts/events.js +1 -0
- package/dist/node/contracts/index.js +1 -0
- package/dist/node/contracts/ingestion.js +1 -0
- package/dist/node/contracts/ingress-admission-policy.js +1 -0
- package/dist/node/contracts/ingress-admission.js +1 -0
- package/dist/node/contracts/models.js +1 -0
- package/dist/node/contracts/operations.js +1 -0
- package/dist/node/contracts/persistence.js +1 -0
- package/dist/node/contracts/preference-resolution.js +1 -0
- package/dist/node/contracts/query.operations.js +1 -0
- package/dist/node/contracts/sequence-intent.js +1 -0
- package/dist/node/contracts/sovereignty.js +1 -0
- package/dist/node/contracts/support-internal-note.operations.js +1 -0
- package/dist/node/contracts/thread-link-kind.js +1 -0
- package/dist/node/contracts/thread-message.operations.js +1 -0
- package/dist/node/events/index.js +1 -0
- package/dist/node/fixtures/agent-omnichannel-primitives.js +1 -0
- package/dist/node/fixtures/agent-omnichannel.js +1 -0
- package/dist/node/fixtures/gtm-learning-loop-neutral.parts.js +1 -0
- package/dist/node/fixtures/index.js +1 -0
- package/dist/node/fixtures/normalized-ingestion.js +1 -0
- package/dist/node/index.js +1 -0
- package/dist/node/queries/index.js +1 -0
- package/dist/node/types/domain-command.js +0 -0
- package/dist/node/types/index.js +1 -0
- package/dist/node/validation/domain-command.js +1 -0
- package/dist/node/validation/index.js +1 -0
- package/dist/package-exports.test.d.ts +1 -0
- package/dist/queries/index.d.ts +4 -0
- package/dist/queries/index.js +2 -0
- package/dist/types/domain-command.d.ts +54 -0
- package/dist/types/domain-command.js +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +2 -0
- package/dist/validation/domain-command.d.ts +3 -0
- package/dist/validation/domain-command.js +2 -0
- package/dist/validation/index.d.ts +53 -0
- package/dist/validation/index.js +2 -0
- package/package.json +1227 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineCommand as s}from"@lssm/lib.contracts-spec";import{defineSchemaModel as o,ScalarTypeEnum as i}from"@lssm/lib.schema";import{defineSchemaModel as t,ScalarTypeEnum as e}from"@lssm/lib.schema";import{defineEnum as a}from"@lssm/lib.schema";var n=a("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),u=a("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),l=a("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),d=a("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),c=a("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),r=a("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),y=a("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),m=a("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),w=a("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);var S=t({name:"ChannelAccount",description:"A channel account belonging to a participant",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:n,isOptional:!1},externalId:{type:e.String_unsecure(),isOptional:!1},displayName:{type:e.String_unsecure(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},isPrimary:{type:e.Boolean(),isOptional:!1,defaultValue:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),_=t({name:"IdentityLink",description:"Proposed or confirmed relationship between participant identities",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},candidateParticipantId:{type:e.String_unsecure(),isOptional:!1},status:{type:r,isOptional:!1,defaultValue:"generated"},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),E=t({name:"CommunicationParticipant",description:"A person or system that participates in conversations",fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!0},email:{type:e.EmailAddress(),isOptional:!0},accounts:{type:S,isArray:!0,isOptional:!1},identityLinks:{type:_,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),A=t({name:"Attachment",description:"A file or media attachment on a message",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},mimeType:{type:e.String_unsecure(),isOptional:!0},sizeBytes:{type:e.Int_unsecure(),isOptional:!0},url:{type:e.URL(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0}}}),I=t({name:"ThreadLink",description:"Link between a thread and an external business object (V2: rich-reference objectRef replaces V1 objectType/objectId)",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},objectRef:{type:e.JSONObject(),isOptional:!1},relation:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),T=t({name:"MessageIntent",description:"Classified message or thread intent with confidence and evidence",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},category:{type:y,isOptional:!1},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},evidenceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),C=t({name:"CommunicationMessage",description:"A single message within a communication thread",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:n,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},externalMessageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},bodyNormalized:{type:e.String_unsecure(),isOptional:!0},status:{type:l,isOptional:!1,defaultValue:"received"},intent:{type:T,isOptional:!0},attachments:{type:A,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),N=t({name:"CommunicationFormIntake",description:"Declarative source reference for a communication message mapped into an entity-bound form intake result",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:n,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},entityKey:{type:e.String_unsecure(),isOptional:!1},projectionKind:{type:e.String_unsecure(),isOptional:!1},formKey:{type:e.String_unsecure(),isOptional:!0},formVersion:{type:e.String_unsecure(),isOptional:!0},completionProfileKey:{type:e.String_unsecure(),isOptional:!0},acceptedValues:{type:e.JSONObject(),isOptional:!1},completionDebt:{type:e.JSONObject(),isArray:!0,isOptional:!1},captureStatus:{type:e.String_unsecure(),isOptional:!1,defaultValue:"accepted"},completionStatus:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),M=t({name:"CommunicationThread",description:"A conversation thread spanning one or more channels",fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!0},status:{type:u,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:n,isArray:!0,isOptional:!1},links:{type:I,isArray:!0,isOptional:!0},assignedTo:{type:e.String_unsecure(),isOptional:!0},priority:{type:e.String_unsecure(),isOptional:!0},tags:{type:e.String_unsecure(),isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),f=t({name:"CommunicationAction",description:"Structured action extracted from a conversation",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},owner:{type:e.String_unsecure(),isOptional:!0},deadline:{type:e.DateTime(),isOptional:!0},blockers:{type:e.String_unsecure(),isArray:!0,isOptional:!0},sourceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},safetyMode:{type:m,isOptional:!1,defaultValue:"draft_only"}}}),g=t({name:"ReplyDraft",description:"An AI-generated or human-authored reply draft",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},status:{type:d,isOptional:!1,defaultValue:"drafted"},generatedBy:{type:e.String_unsecure(),isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},promptVersion:{type:e.String_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},reviewedAt:{type:e.DateTime(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),k=t({name:"HandoffPacket",description:"A structured handoff between owners, teams, or systems",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},status:{type:c,isOptional:!1,defaultValue:"created"},fromOwner:{type:e.String_unsecure(),isOptional:!1},toOwner:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!1},keyFacts:{type:e.String_unsecure(),isArray:!0,isOptional:!0},openQuestions:{type:e.String_unsecure(),isArray:!0,isOptional:!0},requiredActions:{type:f,isArray:!0,isOptional:!0},evidenceLinks:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),O=t({name:"CommunicationSummary",description:"AI-generated summary of a thread or message range",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},content:{type:e.String_unsecure(),isOptional:!1},facts:{type:e.JSONObject(),isArray:!0,isOptional:!0},actions:{type:f,isArray:!0,isOptional:!0},decisions:{type:e.JSONObject(),isArray:!0,isOptional:!0},risks:{type:e.JSONObject(),isArray:!0,isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1}}}),h=t({name:"AgentSuggestion",description:"An AI-generated suggestion attached to a thread or message",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},suggestionType:{type:e.String_unsecure(),isOptional:!1},content:{type:e.String_unsecure(),isOptional:!1},status:{type:r,isOptional:!1,defaultValue:"generated"},modelName:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}});var p=["platform.communication-os","platform.ai-routing"],L=s({meta:{key:"comms.thread.summarize",version:"1.0.0",stability:"experimental",owners:[...p],tags:["comms","ai","thread","summarize"],description:"Produce a persona-scoped summary of a communication thread via the AI routing layer",goal:"Give each persona a concise, role-appropriate digest of a thread without exposing cross-persona data",context:"Capability-gated AI operation. Auditor variant omits PII and redacts sensitive identifiers. "+"Draft-only — summary is returned to caller, not persisted by this command. "+"Handler routes to the appropriate model via lib.ai-agent provider selection."},io:{input:o({name:"CommsThreadSummarizeInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},messageIds:{type:i.String_unsecure(),isArray:!0,isOptional:!0},audiencePersona:{type:i.String_unsecure(),isOptional:!0}}}),output:O,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},INSUFFICIENT_MESSAGES:{description:"Thread has too few messages to produce a meaningful summary",http:422,when:"Thread contains fewer messages than the minimum required for summarization"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"},CONTENT_POLICY_BLOCKED:{description:"Summary blocked by content safety policy",http:422,when:"Thread content triggers a content policy gate; summary cannot be generated without redaction"}}},policy:{auth:"user"}}),P=s({meta:{key:"comms.reply.draft",version:"1.0.0",stability:"experimental",owners:[...p],tags:["comms","ai","reply","draft"],description:"Generate a context-aware reply draft via the AI routing layer",goal:"Produce a safe, policy-checked reply draft that the actor can review and send",context:"Capability-gated AI operation. Not available to auditor persona. Draft status reflects policy evaluation: requires_review when policy gates apply. Handler calls communication.reply.draft internals after capability check."},io:{input:o({name:"CommsReplyDraftInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},messageId:{type:i.String_unsecure(),isOptional:!0},instruction:{type:i.String_unsecure(),isOptional:!0},toneHint:{type:i.String_unsecure(),isOptional:!0}}}),output:g,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},POLICY_BLOCKED:{description:"Reply draft blocked by content or safety policy",http:422,when:"Thread content or instruction triggers a policy gate; draft cannot be generated"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"},DRAFT_LIMIT_EXCEEDED:{description:"Too many pending drafts exist for this thread",http:429,when:"Actor has reached the maximum number of unreviewed drafts on this thread"}}},policy:{auth:"user"}}),H=s({meta:{key:"comms.handoff.suggest",version:"1.0.0",stability:"experimental",owners:[...p],tags:["comms","ai","handoff","suggest"],description:"Suggest whether a thread warrants a handoff and to whom, via the AI routing layer",goal:"Surface handoff opportunities with evidence before the actor decides to act",context:"AI suggestion only — does not create a HandoffPacket. "+"Handler evaluates thread urgency, owner gaps, and work-graph signals to produce a ranked suggestion. Auditor variant is read-only and may not trigger the `communication.handoff.create` action."},io:{input:o({name:"CommsHandoffSuggestInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},suggestedToOwner:{type:i.String_unsecure(),isOptional:!0},context:{type:i.String_unsecure(),isOptional:!0}}}),output:h,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},INSUFFICIENT_CONTEXT:{description:"Thread has insufficient context to produce a handoff suggestion",http:422,when:"Thread is too short or lacks ownership/urgency signals for the model to reason about"},HANDOFF_NOT_WARRANTED:{description:"Analysis concludes no handoff is needed at this time",http:422,when:"Thread signals are below the handoff threshold; caller should surface this as a no-op result rather than an error"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"}}},policy:{auth:"user"}});export{H as CommsHandoffSuggestCommand,P as CommsReplyDraftCommand,L as CommsThreadSummarizeCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineCommand as L}from"@lssm/lib.contracts-spec";import{defineSchemaModel as O,ScalarTypeEnum as c}from"@lssm/lib.schema";import{defineEnum as y}from"@lssm/lib.schema";var C=y("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),N=y("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),K=y("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),Q=y("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),Ae=y("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),le=y("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),Te=y("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),J=y("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),Ee=y("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{defineSchemaModel as r,ScalarTypeEnum as e}from"@lssm/lib.schema";var $e=r({name:"ChannelAccount",description:"A channel account belonging to a participant",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:C,isOptional:!1},externalId:{type:e.String_unsecure(),isOptional:!1},displayName:{type:e.String_unsecure(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},isPrimary:{type:e.Boolean(),isOptional:!1,defaultValue:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),Y=r({name:"IdentityLink",description:"Proposed or confirmed relationship between participant identities",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},candidateParticipantId:{type:e.String_unsecure(),isOptional:!1},status:{type:le,isOptional:!1,defaultValue:"generated"},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),Xt=r({name:"CommunicationParticipant",description:"A person or system that participates in conversations",fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!0},email:{type:e.EmailAddress(),isOptional:!0},accounts:{type:$e,isArray:!0,isOptional:!1},identityLinks:{type:Y,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),et=r({name:"Attachment",description:"A file or media attachment on a message",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},mimeType:{type:e.String_unsecure(),isOptional:!0},sizeBytes:{type:e.Int_unsecure(),isOptional:!0},url:{type:e.URL(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0}}}),E=r({name:"ThreadLink",description:"Link between a thread and an external business object (V2: rich-reference objectRef replaces V1 objectType/objectId)",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},objectRef:{type:e.JSONObject(),isOptional:!1},relation:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),de=r({name:"MessageIntent",description:"Classified message or thread intent with confidence and evidence",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},category:{type:Te,isOptional:!1},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},evidenceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),j=r({name:"CommunicationMessage",description:"A single message within a communication thread",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:C,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},externalMessageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},bodyNormalized:{type:e.String_unsecure(),isOptional:!0},status:{type:K,isOptional:!1,defaultValue:"received"},intent:{type:de,isOptional:!0},attachments:{type:et,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),Zt=r({name:"CommunicationFormIntake",description:"Declarative source reference for a communication message mapped into an entity-bound form intake result",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:C,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},entityKey:{type:e.String_unsecure(),isOptional:!1},projectionKind:{type:e.String_unsecure(),isOptional:!1},formKey:{type:e.String_unsecure(),isOptional:!0},formVersion:{type:e.String_unsecure(),isOptional:!0},completionProfileKey:{type:e.String_unsecure(),isOptional:!0},acceptedValues:{type:e.JSONObject(),isOptional:!1},completionDebt:{type:e.JSONObject(),isArray:!0,isOptional:!1},captureStatus:{type:e.String_unsecure(),isOptional:!1,defaultValue:"accepted"},completionStatus:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),k=r({name:"CommunicationThread",description:"A conversation thread spanning one or more channels",fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!0},status:{type:N,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:C,isArray:!0,isOptional:!1},links:{type:E,isArray:!0,isOptional:!0},assignedTo:{type:e.String_unsecure(),isOptional:!0},priority:{type:e.String_unsecure(),isOptional:!0},tags:{type:e.String_unsecure(),isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),X=r({name:"CommunicationAction",description:"Structured action extracted from a conversation",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},owner:{type:e.String_unsecure(),isOptional:!0},deadline:{type:e.DateTime(),isOptional:!0},blockers:{type:e.String_unsecure(),isArray:!0,isOptional:!0},sourceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},safetyMode:{type:J,isOptional:!1,defaultValue:"draft_only"}}}),P=r({name:"ReplyDraft",description:"An AI-generated or human-authored reply draft",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},status:{type:Q,isOptional:!1,defaultValue:"drafted"},generatedBy:{type:e.String_unsecure(),isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},promptVersion:{type:e.String_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},reviewedAt:{type:e.DateTime(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),Me=r({name:"HandoffPacket",description:"A structured handoff between owners, teams, or systems",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},status:{type:Ae,isOptional:!1,defaultValue:"created"},fromOwner:{type:e.String_unsecure(),isOptional:!1},toOwner:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!1},keyFacts:{type:e.String_unsecure(),isArray:!0,isOptional:!0},openQuestions:{type:e.String_unsecure(),isArray:!0,isOptional:!0},requiredActions:{type:X,isArray:!0,isOptional:!0},evidenceLinks:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),Z=r({name:"CommunicationSummary",description:"AI-generated summary of a thread or message range",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},content:{type:e.String_unsecure(),isOptional:!1},facts:{type:e.JSONObject(),isArray:!0,isOptional:!0},actions:{type:X,isArray:!0,isOptional:!0},decisions:{type:e.JSONObject(),isArray:!0,isOptional:!0},risks:{type:e.JSONObject(),isArray:!0,isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1}}}),ee=r({name:"AgentSuggestion",description:"An AI-generated suggestion attached to a thread or message",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},suggestionType:{type:e.String_unsecure(),isOptional:!1},content:{type:e.String_unsecure(),isOptional:!1},status:{type:le,isOptional:!1,defaultValue:"generated"},modelName:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}});var B=["platform.communication-os"],an=L({meta:{key:"communication.decision.extract",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","decision","extract"],description:"Extract decisions and open questions from a thread",goal:"Make buried decisions reviewable with source references",context:"Read-only/draft-only operation for summaries and handoffs"},io:{input:O({name:"ExtractDecisionsInput",fields:{threadId:{type:c.String_unsecure(),isOptional:!1}}}),output:O({name:"ExtractDecisionsOutput",fields:{decisions:{type:c.JSONObject(),isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),sn=L({meta:{key:"communication.risk.extract",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","risk","blocker"],description:"Extract risks and blockers from a thread",goal:"Surface blockers, policy risks, and unresolved dependencies",context:"Read-only/draft-only operation for triage and escalation"},io:{input:O({name:"ExtractRisksInput",fields:{threadId:{type:c.String_unsecure(),isOptional:!1}}}),output:O({name:"ExtractRisksOutput",fields:{risks:{type:c.JSONObject(),isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),rn=L({meta:{key:"communication.reply.draft",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","reply","draft"],description:"Draft a reply using thread context and policy",goal:"Generate a safe, context-aware reply draft",context:"Draft-only operation; policy may require review or block the draft"},io:{input:O({name:"DraftReplyInput",fields:{threadId:{type:c.String_unsecure(),isOptional:!1},messageId:{type:c.String_unsecure(),isOptional:!0},instruction:{type:c.String_unsecure(),isOptional:!0}}}),output:P},policy:{auth:"user"}}),cn=L({meta:{key:"communication.reply.send",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","reply","send"],description:"Send an approved reply through its channel",goal:"Deliver a reply only when policy allows",context:"Policy-executable operation; every sent reply must be auditable"},io:{input:O({name:"SendReplyInput",fields:{draftId:{type:c.String_unsecure(),isOptional:!1}}}),output:O({name:"SendReplyOutput",fields:{draftId:{type:c.String_unsecure(),isOptional:!1},status:{type:Q,isOptional:!1},sentAt:{type:c.DateTime(),isOptional:!0}}})},policy:{auth:"user"}}),pn=L({meta:{key:"communication.reply.blockByPolicy",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","reply","policy","blocked"],description:"Record that a reply was blocked by policy",goal:"Keep blocked reply decisions explicit and auditable",context:"Used by reply policy gates before any outbound side effect"},io:{input:O({name:"BlockReplyByPolicyInput",fields:{draftId:{type:c.String_unsecure(),isOptional:!1},policyRef:{type:c.String_unsecure(),isOptional:!1},reason:{type:c.String_unsecure(),isOptional:!1}}}),output:P},policy:{auth:"admin"}});import{defineCommand as q}from"@lssm/lib.contracts-spec";import{defineSchemaModel as te,ScalarTypeEnum as p}from"@lssm/lib.schema";var G=["platform.communication-os"],fn=q({meta:{key:"communication.handoff.create",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","handoff"],description:"Create a handoff packet for a thread",goal:"Transfer context safely between owners or systems",context:"Requires evidence links and does not close source thread automatically"},io:{input:te({name:"CreateHandoffInput",fields:{threadId:{type:p.String_unsecure(),isOptional:!1},fromOwner:{type:p.String_unsecure(),isOptional:!1},toOwner:{type:p.String_unsecure(),isOptional:!1},reason:{type:p.String_unsecure(),isOptional:!0}}}),output:Me},policy:{auth:"user"}}),gn=q({meta:{key:"communication.threadLink.propose",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","thread-link","propose"],description:"Propose a link between a thread and a business object",goal:"Let future vertical consumers bind domain objects without changing the core",context:"Draft-only operation; domain packs own object semantics"},io:{input:E,output:E},policy:{auth:"user"}}),hn=q({meta:{key:"communication.identityLink.propose",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","identity","propose"],description:"Propose a participant identity link",goal:"Resolve cross-channel identities without reckless auto-merge",context:"Draft-only operation; high-impact merges require human review"},io:{input:Y,output:Y},policy:{auth:"user"}}),On=q({meta:{key:"communication.escalation.request",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","escalation"],description:"Request human escalation for a thread",goal:"Surface high-risk, blocked, or unresolved conversations to a human owner",context:"Policy-executable operation that emits escalation evidence"},io:{input:te({name:"EscalateToHumanInput",fields:{threadId:{type:p.String_unsecure(),isOptional:!1},reason:{type:p.String_unsecure(),isOptional:!1},targetOwner:{type:p.String_unsecure(),isOptional:!0}}}),output:ee},policy:{auth:"user"}}),Sn=q({meta:{key:"communication.feedback.record",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","feedback"],description:"Record human feedback on a suggestion, draft, or extraction",goal:"Make AI correction signals auditable and replayable",context:"Used by review surfaces and future evaluation runs"},io:{input:te({name:"RecordHumanFeedbackInput",fields:{targetId:{type:p.String_unsecure(),isOptional:!1},targetType:{type:p.String_unsecure(),isOptional:!1},outcome:{type:Ee,isOptional:!1},notes:{type:p.String_unsecure(),isOptional:!0}}}),output:te({name:"RecordHumanFeedbackOutput",fields:{feedbackId:{type:p.String_unsecure(),isOptional:!1},safetyMode:{type:J,isOptional:!1}}})},policy:{auth:"user"}});import{defineCommand as De,defineQuery as ct,docId as pt}from"@lssm/lib.contracts-spec";import{defineEnum as Ve,defineSchemaModel as ge,ScalarTypeEnum as u}from"@lssm/lib.schema";import{defineEnum as S,defineSchemaModel as f,ScalarTypeEnum as t}from"@lssm/lib.schema";var tt=S("CommunicationSpaceKind",["personal","organization"]),nt=S("CommunicationPrincipalKind",["human","agent","system"]),it=S("CommunicationConnectionPlacement",["device","managed_cloud","self_hosted"]),In=S("CommunicationConnectionNetwork",["email","sms","slack","teams","telegram","whatsapp","discord","matrix"]),ot=S("CommunicationEncryptionMode",["client_encrypted","governed_server_indexable"]),at=S("CommunicationMembershipState",["active","revoked"]),Re=S("CommunicationReceiptKind",["delivered","read"]),st=S("CommunicationConnectionHealth",["connecting","healthy","degraded","offline","revoked"]),ne={id:"communication-os.ecosystem-messaging.v2",title:"CommunicationOS ecosystem messaging contracts",body:"Versioned, workspace-scoped contracts for personal and organization spaces, rooms, human and agent membership, hybrid channel connections, synchronized messages, and revocable outbound authority. CommunicationSpec remains canonical; provider protocols are adapters. V1 thread and draft-only operations remain unchanged.",kind:"reference",route:"/docs/communication-os/ecosystem-messaging-v2",visibility:"public"},_=f({name:"CommunicationScopeV2",description:"Strict tenant, workspace, and space boundary for messaging state",fields:{tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1}}}),ie=f({name:"CommunicationSpaceV2",description:"Personal or organization messaging boundary under one account",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},name:{type:t.String_unsecure(),isOptional:!1},kind:{type:tt,isOptional:!1},encryptionMode:{type:ot,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1}}}),bn=f({name:"CommunicationPrincipalV2",description:"Auditable human, agent, or system identity",fields:{id:{type:t.String_unsecure(),isOptional:!1},kind:{type:nt,isOptional:!1},displayName:{type:t.String_unsecure(),isOptional:!1},ownerPrincipalId:{type:t.String_unsecure(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1}}}),oe=f({name:"CommunicationRoomV2",description:"Room or direct-message projection inside one space",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},name:{type:t.String_unsecure(),isOptional:!0},roomKind:{type:t.String_unsecure(),isOptional:!1},connectionIds:{type:t.String_unsecure(),isArray:!0,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),me=f({name:"CommunicationRoomMembershipV2",description:"Revocable principal membership and room-scoped capabilities",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},roomId:{type:t.String_unsecure(),isOptional:!1},principalId:{type:t.String_unsecure(),isOptional:!1},role:{type:t.String_unsecure(),isOptional:!1},state:{type:at,isOptional:!1},capabilities:{type:t.String_unsecure(),isArray:!0,isOptional:!1},expiresAt:{type:t.DateTime(),isOptional:!0},revokedAt:{type:t.DateTime(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1}}}),ye=f({name:"CommunicationChannelConnectionV2",description:"Credential-reference-only local, managed, or self-hosted channel connection",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},network:{type:t.String_unsecure(),isOptional:!1},placement:{type:it,isOptional:!1},externalAccountRef:{type:t.String_unsecure(),isOptional:!1},credentialRef:{type:t.String_unsecure(),isOptional:!1},health:{type:st,isOptional:!1},capabilities:{type:t.String_unsecure(),isArray:!0,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),rt=f({name:"CommunicationAttachmentV2",description:"Public-safe metadata for an opaque, scope-bound message attachment",fields:{id:{type:t.String_unsecure(),isOptional:!1},name:{type:t.String_unsecure(),isOptional:!1},mimeType:{type:t.String_unsecure(),isOptional:!1},sizeBytes:{type:t.Int_unsecure(),isOptional:!1},sha256:{type:t.String_unsecure(),isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1}}}),w=f({name:"CommunicationMessageV2",description:"Canonical room message with explicit author and encryption posture",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},roomId:{type:t.String_unsecure(),isOptional:!1},authorPrincipalId:{type:t.String_unsecure(),isOptional:!1},connectionId:{type:t.String_unsecure(),isOptional:!0},externalMessageId:{type:t.String_unsecure(),isOptional:!0},body:{type:t.String_unsecure(),isOptional:!0},encryptedEnvelope:{type:t.JSONObject(),isOptional:!0},attachments:{type:rt,isArray:!0,isOptional:!0},replyToMessageId:{type:t.String_unsecure(),isOptional:!0},revision:{type:t.Int_unsecure(),isOptional:!1},deletedAt:{type:t.DateTime(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),fe=f({name:"CommunicationAuthorityGrantV2",description:"Explicit, revocable messaging authority granted to one principal",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},roomId:{type:t.String_unsecure(),isOptional:!0},connectionId:{type:t.String_unsecure(),isOptional:!0},principalId:{type:t.String_unsecure(),isOptional:!1},capabilities:{type:t.String_unsecure(),isArray:!0,isOptional:!1},grantedBy:{type:t.String_unsecure(),isOptional:!1},expiresAt:{type:t.DateTime(),isOptional:!0},revokedAt:{type:t.DateTime(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1}}});var he=["platform.communication-os"],ut={id:"communication-os.governed-work.v1",title:"CommunicationOS governed work contracts",body:"Persisted, scope-isolated reviews for identity, drafts, actions, handoffs, escalations, triage, summaries, agents, consent, retention, and policy. Managed decisions require current manager authority and every transition appends evidence.",kind:"reference",route:"/docs/communication-os/governed-work-v1",visibility:"public"},Oe=[pt(ut.id)],lt=Ve("CommunicationGovernedWorkKind",["identity_review","draft","action","handoff","escalation","triage","summary","agent","consent","retention","policy"]),Ne=Ve("CommunicationGovernedWorkStatus",["pending","approved","rejected","blocked","resolved","revoked"]),ae=ge({name:"CommunicationGovernedWorkV1",fields:{id:{type:u.String_unsecure(),isOptional:!1},kind:{type:lt,isOptional:!1},status:{type:Ne,isOptional:!1},title:{type:u.String_unsecure(),isOptional:!1},threadId:{type:u.String_unsecure(),isOptional:!0},details:{type:u.JSONObject(),isOptional:!1},revision:{type:u.Int_unsecure(),isOptional:!1},createdBy:{type:u.String_unsecure(),isOptional:!1},createdAt:{type:u.DateTime(),isOptional:!1},updatedBy:{type:u.String_unsecure(),isOptional:!1},updatedAt:{type:u.DateTime(),isOptional:!1}}}),An=ct({meta:{key:"communication.governed_work.list",version:"1.0.0",stability:"experimental",owners:[...he],tags:["communication","governance","work","query"],description:"List governed work in one authorized messaging space",goal:"Drive review queues from replayable state rather than fixtures",context:"The server derives scope and filters optional kinds",docId:Oe},io:{input:_,output:ge({name:"ListCommunicationGovernedWorkV1Output",fields:{items:{type:ae,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),dt=De({meta:{key:"communication.governed_work.create",version:"1.0.0",stability:"experimental",owners:[...he],tags:["communication","governance","work","create"],description:"Create one idempotent governed work item",goal:"Start an accountable review from a real user or runtime action",context:"Client-supplied tenant or principal authority is rejected",docId:Oe},io:{input:ae,output:ae},policy:{auth:"user"}}),mt=De({meta:{key:"communication.governed_work.transition",version:"1.0.0",stability:"experimental",owners:[...he],tags:["communication","governance","work","transition"],description:"Apply one policy-valid governed work transition",goal:"Record approval, denial, resolution, blocking, or revocation evidence",context:"Managed kinds require current manager authority and terminal transitions fail closed",docId:Oe},io:{input:ge({name:"TransitionCommunicationGovernedWorkV1Input",fields:{workId:{type:u.String_unsecure(),isOptional:!1},status:{type:Ne,isOptional:!1},reason:{type:u.String_unsecure(),isOptional:!0}}}),output:ae},policy:{auth:"user"}});import{defineCommand as yt,defineQuery as Pe,docId as ft}from"@lssm/lib.contracts-spec";import{defineEnum as gt,defineSchemaModel as M,ScalarTypeEnum as o}from"@lssm/lib.schema";var Se=["platform.communication-os"],ht={id:"communication-os.identity-resolution.v1",title:"CommunicationOS identity resolution contracts",body:"Scope-isolated account and contact projections plus a human-reviewed identity merge or rejection lifecycle. Provider credentials and raw identity evidence never enter public outputs.",kind:"reference",route:"/docs/communication-os/identity-resolution-v1",visibility:"public"},_e=[ft(ht.id)],je=gt("CommunicationIdentityReviewStatus",["pending","merged","rejected"]),Ot=M({name:"CommunicationAccountV2",description:"Public-safe provider account projection in one authorized space",fields:{id:{type:o.String_unsecure(),isOptional:!1},network:{type:o.String_unsecure(),isOptional:!1},externalAccountRef:{type:o.String_unsecure(),isOptional:!1},placement:{type:o.String_unsecure(),isOptional:!1},health:{type:o.String_unsecure(),isOptional:!1},createdAt:{type:o.DateTime(),isOptional:!1},updatedAt:{type:o.DateTime(),isOptional:!1}}}),St=M({name:"CommunicationContactV2",description:"Participant projection derived from persisted scoped messages",fields:{principalId:{type:o.String_unsecure(),isOptional:!1},displayName:{type:o.String_unsecure(),isOptional:!0},roomIds:{type:o.String_unsecure(),isArray:!0,isOptional:!1},messageCount:{type:o.Int_unsecure(),isOptional:!1},lastSeenAt:{type:o.DateTime(),isOptional:!1}}}),_t=M({name:"ListCommunicationAccountsV2Output",fields:{accounts:{type:Ot,isArray:!0,isOptional:!1}}}),vt=M({name:"ListCommunicationContactsV2Output",fields:{contacts:{type:St,isArray:!0,isOptional:!1}}}),Dn=Pe({meta:{key:"communication.account.list",version:"2.0.0",stability:"experimental",owners:[...Se],tags:["communication","account","identity"],description:"List public-safe provider accounts in one authorized space",goal:"Expose account readiness without leaking credential references",context:"Authority is derived by the server from the authenticated scope",docId:_e},io:{input:_,output:_t},policy:{auth:"user"}}),Vn=Pe({meta:{key:"communication.contact.list",version:"2.0.0",stability:"experimental",owners:[...Se],tags:["communication","contact","identity"],description:"List persisted participant projections in one authorized space",goal:"Provide a real scoped contact index without provider identity leakage",context:"Contacts are replayable projections, never transient UI inference",docId:_e},io:{input:_,output:vt},policy:{auth:"user"}}),It=yt({meta:{key:"communication.identity.decide",version:"1.0.0",stability:"experimental",owners:[...Se],tags:["communication","identity","review","governance"],description:"Merge or reject one pending identity review",goal:"Require an auditable human decision before cross-channel identity linkage",context:"Only authorized managers may decide and each review is single-transition",docId:_e},io:{input:M({name:"DecideCommunicationIdentityV1Input",fields:{reviewId:{type:o.String_unsecure(),isOptional:!1},decision:{type:je,isOptional:!1},reason:{type:o.String_unsecure(),isOptional:!0}}}),output:M({name:"DecideCommunicationIdentityV1Output",fields:{reviewId:{type:o.String_unsecure(),isOptional:!1},status:{type:je,isOptional:!1},revision:{type:o.Int_unsecure(),isOptional:!1}}})},policy:{auth:"admin"}});import{defineCommand as A,defineQuery as Ge,docId as bt}from"@lssm/lib.contracts-spec";import{defineSchemaModel as v,ScalarTypeEnum as n}from"@lssm/lib.schema";var g=["platform.communication-os"],h=[bt(ne.id)],ze={VALIDATION_FAILED:{description:"Message content, replay key, or attachment references are invalid.",http:422,when:"The request is malformed, empty, duplicated, or exceeds a declared limit."},FORBIDDEN:{description:"The authenticated principal cannot access or mutate the selected room.",http:403,when:"Workspace, space, room membership, connection binding, or send authority is absent."},SERVICE_UNAVAILABLE:{description:"The scoped messaging runtime or search projection is unavailable.",http:503,when:"A required durable runtime dependency cannot safely answer the operation."}},Bn=A({meta:{key:"communication.message.send",version:"2.1.0",stability:"experimental",owners:[...g],tags:["communication","message","send","authority"],description:"Send a canonical room message as an explicitly attributed principal",goal:"Give authorized humans and agents the same audited messaging path",context:"The runtime must re-evaluate membership, authority, consent, encryption posture, and connection policy immediately before dispatch",docId:h},io:{input:w,output:w},policy:{auth:"user"}}),xt=v({name:"SendCommunicationMessageV3Input",fields:{workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},connectionId:{type:n.String_unsecure(),isOptional:!0},idempotencyKey:{type:n.String_unsecure(),isOptional:!1},body:{type:n.String_unsecure(),isOptional:!0},encryptedEnvelope:{type:n.JSONObject(),isOptional:!0},attachmentIds:{type:n.String_unsecure(),isArray:!0,isOptional:!0},replyToMessageId:{type:n.String_unsecure(),isOptional:!0}}}),qn=A({meta:{key:"communication.message.send",version:"3.0.0",stability:"experimental",owners:[...g],tags:["communication","message","send","authority","idempotency"],description:"Send a canonical room message from a JSON-safe, replay-safe client intent",goal:"Keep tenant, author, revision, identifiers, and timestamps server-owned",context:"The runtime derives tenant and author from the authenticated context, verifies workspace/space/room membership and attachment ownership, then applies the idempotency key before dispatch",docId:h},io:{input:xt,output:w,errors:ze},policy:{auth:"user"}}),Ue=v({name:"MutateCommunicationMessageV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},messageId:{type:n.String_unsecure(),isOptional:!1},actorPrincipalId:{type:n.String_unsecure(),isOptional:!1},body:{type:n.String_unsecure(),isOptional:!0},encryptedEnvelope:{type:n.JSONObject(),isOptional:!0},expectedRevision:{type:n.Int_unsecure(),isOptional:!1}}}),Gn=A({meta:{key:"communication.message.edit",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","edit"],description:"Edit a message with optimistic revision protection",goal:"Preserve provider edits in the canonical event journal without rewriting history",context:"Unsupported provider edits must return an explicit capability error rather than silently diverge",docId:h},io:{input:Ue,output:w},policy:{auth:"user"}}),zn=A({meta:{key:"communication.message.delete",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","delete"],description:"Append an auditable message deletion or provider-retention marker",goal:"Represent local and provider deletion honestly across heterogeneous networks",context:"The event journal retains non-content evidence even when message content is erased",docId:h},io:{input:Ue,output:w},policy:{auth:"user"}}),Le=v({name:"CommunicationReactionV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},messageId:{type:n.String_unsecure(),isOptional:!1},principalId:{type:n.String_unsecure(),isOptional:!1},reaction:{type:n.String_unsecure(),isOptional:!1},active:{type:n.Boolean(),isOptional:!1}}}),Un=A({meta:{key:"communication.reaction.set",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","reaction"],description:"Add or remove a reaction on a canonical message",goal:"Normalize lightweight acknowledgement across supported networks",context:"Adapters report unsupported reactions explicitly",docId:h},io:{input:Le,output:Le},policy:{auth:"user"}}),Be=v({name:"CommunicationReceiptV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},messageId:{type:n.String_unsecure(),isOptional:!1},principalId:{type:n.String_unsecure(),isOptional:!1},kind:{type:Re,isOptional:!1},occurredAt:{type:n.DateTime(),isOptional:!1}}}),Fn=A({meta:{key:"communication.receipt.record",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","receipt"],description:"Record a delivered or read receipt",goal:"Keep unread and delivery projections consistent across clients",context:"Privacy policy may suppress outbound read receipts per space or connection",docId:h},io:{input:Be,output:Be},policy:{auth:"user"}}),qe=v({name:"CommunicationInboxStateV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},principalId:{type:n.String_unsecure(),isOptional:!1},pinned:{type:n.Boolean(),isOptional:!1},archived:{type:n.Boolean(),isOptional:!1},snoozedUntil:{type:n.DateTime(),isOptional:!0},reminderAt:{type:n.DateTime(),isOptional:!0}}}),Hn=A({meta:{key:"communication.inbox-state.set",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","inbox","pin","archive","snooze","reminder"],description:"Set one principal's pin, archive, snooze, and reminder state",goal:"Synchronize inbox organization without leaking message content",context:"Personal inbox state is principal-private even inside organization workspaces",docId:h},io:{input:qe,output:qe},policy:{auth:"user"}}),Ct=v({name:"SearchCommunicationMessagesV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},query:{type:n.String_unsecure(),isOptional:!1},roomIds:{type:n.String_unsecure(),isArray:!0,isOptional:!0},limit:{type:n.Int_unsecure(),isOptional:!0}}}),Fe=v({name:"SearchCommunicationMessagesV2Output",fields:{messages:{type:w,isArray:!0,isOptional:!1},nextCursor:{type:n.String_unsecure(),isOptional:!0}}}),Wn=Ge({meta:{key:"communication.message.search",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","search"],description:"Search messages within exactly one authorized space",goal:"Provide cross-network search without cross-space index leakage",context:"Client-encrypted spaces search a local decrypted projection; server-indexable spaces use governed indexes",docId:h},io:{input:Ct,output:Fe},policy:{auth:"user"}}),kt=v({name:"SearchCommunicationMessagesV3Input",fields:{workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},query:{type:n.String_unsecure(),isOptional:!1},roomIds:{type:n.String_unsecure(),isArray:!0,isOptional:!0},limit:{type:n.Int_unsecure(),isOptional:!0}}}),Kn=Ge({meta:{key:"communication.message.search",version:"3.0.0",stability:"experimental",owners:[...g],tags:["communication","message","search","authority"],description:"Search messages inside the authenticated tenant and an authorized selected space",goal:"Remove client-supplied tenant authority from canonical search transport",context:"The runtime derives tenant from the authenticated context and verifies workspace, space, and optional room filters before querying any index",docId:h},io:{input:kt,output:Fe,errors:ze},policy:{auth:"user"}}),Qn={key:"communication.message.replay-authority",version:"1.0.0",invariants:["Recheck current room membership and connection authority before returning a prior send result.","A request key cannot substitute principal, room, connection, text, subject, HTML, metadata, encryption envelope, reply target or attachment IDs.","Queued acceptance is not provider delivery.","Requested attachments require a complete resolved manifest; missing attachment support must not silently send an incomplete message."]},Jn={key:"communication.message.queue-custody",version:"1.0.0",invariants:["An external send requires a durable journal-and-outbox adapter before it can be accepted.","Queued acceptance requires an exact persisted delivery record for the accepted message, connection and scope.","Outbox-key conflicts cannot silently drop provider delivery or report false success.","Message delivery uses delivery:<send idempotency key>; alternate delivery keys cannot duplicate a prior accepted message.","Message identity allocated by an atomic journal replay remains the delivery target; retries do not refer to discarded candidate IDs."]},Yn={key:"communication.delivery.context-reproof",version:"1.0.0",invariants:["Resolve the current delivery context before adapter access and again after provider health checks immediately before send.","Changed recipient, connection, credential binding, content, reply, attachment or routing metadata invalidates the pending send.","Missing or changed context yields a definitive rejection without invoking provider.send.","Journal delivery resolution requires current active sender membership and applicable agent grants; revoked or deleted messages cannot resolve for sending.","Context reproof supplements canonical Runtime Node authority and does not replace its approval or effect fence."]};import{defineCommand as R,defineQuery as He,docId as wt}from"@lssm/lib.contracts-spec";import{defineSchemaModel as se,ScalarTypeEnum as d}from"@lssm/lib.schema";var I=["platform.communication-os"],b=[wt(ne.id)],ti=R({meta:{key:"communication.space.create",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","space","workspace"],description:"Create an isolated personal or organization messaging space",goal:"Keep messages, identities, agents, search, and policy inside one explicit boundary",context:"The caller must already have access to the containing tenant and workspace",docId:b},io:{input:ie,output:ie},policy:{auth:"user"}}),ni=R({meta:{key:"communication.room.create",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","room","membership"],description:"Create a room or direct-message projection inside one space",goal:"Give humans and agents one canonical collaboration container",context:"Connection-backed rooms retain provider identifiers only through connection references",docId:b},io:{input:oe,output:oe},policy:{auth:"user"}}),At=se({name:"ListCommunicationSpacesV2Output",fields:{spaces:{type:ie,isArray:!0,isOptional:!1}}}),ii=He({meta:{key:"communication.space.list",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","space","workspace","query"],description:"List messaging spaces visible inside an authorized scope",goal:"Make space switching explicit without crossing an isolation boundary",context:"The authorization layer resolves accessible scopes; this query never widens the supplied scope",docId:b},io:{input:_,output:At},policy:{auth:"user"}}),Tt=se({name:"ListCommunicationRoomsV2Output",fields:{rooms:{type:oe,isArray:!0,isOptional:!1}}}),oi=He({meta:{key:"communication.room.list",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","room","workspace","query"],description:"List canonical rooms inside one authorized messaging space",goal:"Drive inbox and room navigation from a replayable projection",context:"Rooms are projected only from the append-only journal partition selected by the supplied scope",docId:b},io:{input:_,output:Tt},policy:{auth:"user"}}),ai=R({meta:{key:"communication.membership.set",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","membership","agent","authority"],description:"Add, update, or revoke a human, agent, or system room membership",goal:"Make every participant and its capabilities explicit and auditable",context:"Revocation takes effect before the next effect-bearing operation",docId:b},io:{input:me,output:me},policy:{auth:"admin"}}),si=R({meta:{key:"communication.authority.set",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","agent","authority","revocation"],description:"Grant or revoke scoped messaging authority for one principal",goal:"Permit human-equivalent agents without implicit or unbounded send access",context:"The runtime re-evaluates active membership, grant scope, expiry, and channel policy immediately before dispatch",docId:b},io:{input:fe,output:fe},policy:{auth:"admin"}}),ri=R({meta:{key:"communication.connection.connect",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","connection","hybrid","credentials"],description:"Register a device, managed-cloud, or self-hosted channel connection",goal:"Use one provider-neutral connection contract across all clients and workers",context:"Only a secret-manager reference may be persisted; raw provider credentials are forbidden",docId:b},io:{input:ye,output:ye},policy:{auth:"user"}}),Et=se({name:"SyncCommunicationConnectionV2Input",fields:{tenantId:{type:d.String_unsecure(),isOptional:!1},workspaceId:{type:d.String_unsecure(),isOptional:!1},spaceId:{type:d.String_unsecure(),isOptional:!1},connectionId:{type:d.String_unsecure(),isOptional:!1},cursor:{type:d.String_unsecure(),isOptional:!0},limit:{type:d.Int_unsecure(),isOptional:!0}}}),Mt=se({name:"SyncCommunicationConnectionV2Output",fields:{connectionId:{type:d.String_unsecure(),isOptional:!1},nextCursor:{type:d.String_unsecure(),isOptional:!0},acceptedEventIds:{type:d.String_unsecure(),isArray:!0,isOptional:!1},hasMore:{type:d.Boolean(),isOptional:!1}}}),ci=R({meta:{key:"communication.connection.sync",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","connection","sync","cursor"],description:"Advance an authenticated channel connection from a cursor",goal:"Provide deterministic, resumable synchronization across device and server workers",context:"Duplicate provider events must be suppressed by their connection-scoped idempotency key",docId:b},io:{input:Et,output:Mt},policy:{auth:"user"}});import{defineCommand as Nt,defineQuery as jt}from"@lssm/lib.contracts-spec/operations";import{defineSchemaModel as pe,ScalarTypeEnum as s}from"@lssm/lib.schema";import{defineEnum as D,defineSchemaModel as ve,ScalarTypeEnum as a}from"@lssm/lib.schema";var Rt=D("ResidencyRegion",["eu","eu_fr","eu_de","us","uk","apac","self_managed"]),Dt=D("HostingMode",["saas","self_host","on_prem"]),re=D("DataClass",["message_body","participant_identity","channel_account","attachment","ai_derived","audit_evidence"]),ce=D("ConsentBasis",["consent","contract","legal_obligation","legitimate_interest"]),Ie=D("ConsentStatus",["granted","withdrawn","expired","not_recorded"]),Vt=ve({name:"RetentionWindow",description:"Documented retention window for a single governed data class.",fields:{dataClass:{type:re,isOptional:!1},retentionDays:{type:a.Int_unsecure(),isOptional:!1},basis:{type:ce,isOptional:!1},description:{type:a.String_unsecure(),isOptional:!0}}}),li=ve({name:"SovereigntyProfile",description:"Residency, retention, sovereign LLM provider and hosting posture for a tenant.",fields:{id:{type:a.String_unsecure(),isOptional:!1},tenantId:{type:a.String_unsecure(),isOptional:!1},residencyRegion:{type:Rt,isOptional:!1,defaultValue:"eu"},hostingMode:{type:Dt,isOptional:!1,defaultValue:"saas"},llmProviderId:{type:a.String_unsecure(),isOptional:!1},retentionWindows:{type:Vt,isArray:!0,isOptional:!1},dataResidencyEnforced:{type:a.Boolean(),isOptional:!1,defaultValue:!0},createdAt:{type:a.DateTime(),isOptional:!1},updatedAt:{type:a.DateTime(),isOptional:!1}}}),di=ve({name:"SubjectConsent",description:"Recorded RGPD consent decision for a single data subject.",fields:{id:{type:a.String_unsecure(),isOptional:!1},tenantId:{type:a.String_unsecure(),isOptional:!1},subjectId:{type:a.String_unsecure(),isOptional:!1},basis:{type:ce,isOptional:!1},status:{type:Ie,isOptional:!1,defaultValue:"not_recorded"},grantedAt:{type:a.DateTime(),isOptional:!0},withdrawnAt:{type:a.DateTime(),isOptional:!0},expiresAt:{type:a.DateTime(),isOptional:!0},evidenceRef:{type:a.String_unsecure(),isOptional:!0}}}),We=D("ErasureOutcome",["erased_local","erased_local_and_channel","erased_local_provider_retained_documented"]);var Ke=["platform.communication-os"],hi=Nt({meta:{key:"communication.subject.erase",version:"1.0.0",stability:"experimental",owners:[...Ke],tags:["communication","gdpr","rgpd","erasure","sovereignty"],description:"Erase a data subject across local persistence and channel providers",goal:"Honor a GDPR/RGPD right-to-erasure request with an auditable, three-state outcome that documents irrecoverable provider retention rather than failing closed",context:"Governed by ContractSpec Connect; handler emits a local delete descriptor plus ChannelAdapter.eraseSubject; provider-unrecallable channels (email/SMTP) resolve to a documented retention window from the Sovereignty Profile"},io:{input:pe({name:"EraseSubjectInput",description:"Right-to-erasure request for a single data subject.",fields:{tenantId:{type:s.String_unsecure(),isOptional:!1},subjectId:{type:s.String_unsecure(),isOptional:!1},requestedBy:{type:s.String_unsecure(),isOptional:!1},reason:{type:s.String_unsecure(),isOptional:!0},dataClasses:{type:re,isArray:!0,isOptional:!0}}}),output:pe({name:"EraseSubjectOutput",description:"Three-state erasure outcome with optional documented provider retention.",fields:{subjectId:{type:s.String_unsecure(),isOptional:!1},outcome:{type:We,isOptional:!1},localDeleted:{type:s.Boolean(),isOptional:!1},channelErased:{type:s.Boolean(),isOptional:!1},providerRetainedDataClass:{type:re,isOptional:!0},providerRetentionDays:{type:s.Int_unsecure(),isOptional:!0},retentionWindowRef:{type:s.String_unsecure(),isOptional:!0},auditEventRef:{type:s.String_unsecure(),isOptional:!1},erasedAt:{type:s.DateTime(),isOptional:!1}}}),errors:{SUBJECT_NOT_FOUND:{description:"No data subject exists for the provided subjectId",http:404,when:"subjectId does not resolve to any local persistence record"},SOVEREIGNTY_PROFILE_MISSING:{description:"No Sovereignty Profile is configured for the tenant; retention window cannot be documented",http:422,when:"A provider cannot recall data but no documented retention window exists to reference"},CHANNEL_ADAPTER_UNAVAILABLE:{description:"The channel adapter required to attempt provider erasure could not be reached",http:503,when:"ChannelAdapter.eraseSubject cannot be invoked; erasure fails closed rather than reporting an unverified outcome"},ERASURE_NOT_AUTHORIZED:{description:"The requesting actor is not authorized to erase this subject",http:403,when:"Policy gate denies the erasure request for the actor/tenant"}}},policy:{auth:"admin"}}),Oi=jt({meta:{key:"communication.subject.consent.check",version:"1.0.0",stability:"experimental",owners:[...Ke],tags:["communication","gdpr","rgpd","consent"],description:"Check the recorded RGPD consent state for a data subject",goal:"Let runtime gate processing on a subject lawful basis before side effects",context:"Read-only; returns the recorded consent status and lawful basis, never mutates consent"},io:{input:pe({name:"CheckSubjectConsentInput",fields:{tenantId:{type:s.String_unsecure(),isOptional:!1},subjectId:{type:s.String_unsecure(),isOptional:!1}}}),output:pe({name:"CheckSubjectConsentOutput",fields:{subjectId:{type:s.String_unsecure(),isOptional:!1},status:{type:Ie,isOptional:!1},basis:{type:ce,isOptional:!0},mayProcess:{type:s.Boolean(),isOptional:!1}}})},policy:{auth:"admin"}});import{defineCommand as Pt,defineQuery as be}from"@lssm/lib.contracts-spec/operations";import{defineSchemaModel as T,ScalarTypeEnum as l}from"@lssm/lib.schema";var ue=["platform.communication-os"],xi=Pt({meta:{key:"communication.thread.updateStatus",version:"1.0.0",stability:"experimental",owners:[...ue],tags:["communication","thread","status"],description:"Update a thread lifecycle status",goal:"Move operational conversations through explicit lifecycle states",context:"Runtime must enforce valid transitions from lifecycle definitions"},io:{input:T({name:"UpdateThreadStatusInput",fields:{threadId:{type:l.String_unsecure(),isOptional:!1},status:{type:N,isOptional:!1},reason:{type:l.String_unsecure(),isOptional:!0}}}),output:k},policy:{auth:"user"}}),Ci=be({meta:{key:"communication.thread.get",version:"1.0.0",stability:"experimental",owners:[...ue],tags:["communication","thread","get"],description:"Get a thread by ID with messages and links",goal:"Retrieve full thread context",context:"Read-only operation for inbox views, detail views, and agent context"},io:{input:T({name:"GetThreadInput",fields:{threadId:{type:l.String_unsecure(),isOptional:!1}}}),output:T({name:"GetThreadOutput",fields:{thread:{type:k,isOptional:!1},messages:{type:j,isArray:!0,isOptional:!1},links:{type:E,isArray:!0,isOptional:!0}}})},policy:{auth:"user"}}),ki=be({meta:{key:"communication.thread.search",version:"1.0.0",stability:"experimental",owners:[...ue],tags:["communication","thread","search"],description:"Search threads by status, participant, channel, or linked object",goal:"Find relevant conversations quickly",context:"Read-only operation for operational inboxes, agent search, and dashboards"},io:{input:T({name:"SearchThreadsInput",fields:{status:{type:N,isOptional:!0},participantId:{type:l.String_unsecure(),isOptional:!0},channelType:{type:C,isOptional:!0},linkedKindId:{type:l.String_unsecure(),isOptional:!0},linkedInstanceId:{type:l.String_unsecure(),isOptional:!0},assignedTo:{type:l.String_unsecure(),isOptional:!0},limit:{type:l.Int_unsecure(),isOptional:!0,defaultValue:20}}}),output:T({name:"SearchThreadsOutput",fields:{threads:{type:k,isArray:!0,isOptional:!1},total:{type:l.Int_unsecure(),isOptional:!1},hasMore:{type:l.Boolean(),isOptional:!1}}})},policy:{auth:"user"}}),wi=be({meta:{key:"communication.message.list",version:"1.0.0",stability:"experimental",owners:[...ue],tags:["communication","message","list"],description:"List messages for a thread",goal:"Provide ordered message context without loading unrelated operational state",context:"Read-only operation for inboxes, agent context, and handoff evidence"},io:{input:T({name:"ListMessagesInput",fields:{threadId:{type:l.String_unsecure(),isOptional:!1}}}),output:T({name:"ListMessagesOutput",fields:{messages:{type:j,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}});import{defineCommand as U}from"@lssm/lib.contracts-spec/operations";import{defineSchemaModel as z,ScalarTypeEnum as x}from"@lssm/lib.schema";var F=["platform.communication-os"],Di=U({meta:{key:"communication.thread.create",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","thread","create"],description:"Create a communication thread from normalized input",goal:"Persist a reusable conversation container before downstream work binds to it",context:"Used by ingest flows and generic operational inbox consumers"},io:{input:k,output:k},policy:{auth:"admin"}}),Vi=U({meta:{key:"communication.message.ingest",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","message","ingest"],description:"Ingest an inbound message from a channel adapter",goal:"Normalize and store an inbound message for triage",context:"Called by channel adapters after webhook verification and deduplication"},io:{input:j,output:z({name:"IngestMessageOutput",fields:{messageId:{type:x.String_unsecure(),isOptional:!1},threadId:{type:x.String_unsecure(),isOptional:!1},status:{type:K,isOptional:!1}}})},policy:{auth:"admin"}}),Ni=U({meta:{key:"communication.intent.classify",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","intent","classify"],description:"Classify the intent of a message or thread",goal:"Route and triage based on intent category and confidence",context:"Read-only AI operation; returns suggestion state, not canonical truth"},io:{input:z({name:"ClassifyIntentInput",fields:{threadId:{type:x.String_unsecure(),isOptional:!1},messageId:{type:x.String_unsecure(),isOptional:!0}}}),output:de},policy:{auth:"admin"}}),ji=U({meta:{key:"communication.summary.generate",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","summary"],description:"Generate a summary of a thread",goal:"Produce a concise summary with facts, actions, decisions, risks, and source references",context:"Draft-only AI operation used for handoffs, inbox views, and agent context"},io:{input:z({name:"GenerateSummaryInput",fields:{threadId:{type:x.String_unsecure(),isOptional:!1},messageIds:{type:x.String_unsecure(),isArray:!0,isOptional:!0}}}),output:Z},policy:{auth:"user"}}),Pi=U({meta:{key:"communication.action.extract",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","action","extract"],description:"Extract implied actions from a thread",goal:"Turn conversation text into structured work candidates with evidence",context:"Draft-only AI operation; does not mutate external work items"},io:{input:z({name:"ExtractActionsInput",fields:{threadId:{type:x.String_unsecure(),isOptional:!1},messageIds:{type:x.String_unsecure(),isArray:!0,isOptional:!0}}}),output:z({name:"ExtractActionsOutput",fields:{actions:{type:X,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}});import{defineCommand as Qe,defineEvent as Je,defineQuery as Lt,docId as Bt}from"@lssm/lib.contracts-spec";import{defineEnum as Ye,defineSchemaModel as V,ScalarTypeEnum as i}from"@lssm/lib.schema";var H=["platform.communication-os","platform.support-os"],qt={id:"communication-os.support-internal-note.v1",title:"CommunicationOS private Support note authority",body:"CommunicationOS owns private note content and immutable evidence. SupportOS stores only opaque note and evidence references. Service requests derive tenant, workspace, actor, audience, and capabilities from a short-lived AuthOS grant; verification is redacted and never returns note content.",kind:"reference",route:"/docs/communication-os/support-internal-notes-v1",visibility:"public"},W=[Bt(qt.id)],Xe=Ye("CommunicationSupportInternalNoteVisibility",["internal"]),Gt=V({name:"CommunicationSupportInternalNoteCreateV1Input",fields:{caseRef:{type:i.String_unsecure(),isOptional:!1},body:{type:i.String_unsecure(),isOptional:!1},idempotencyKey:{type:i.String_unsecure(),isOptional:!1}}}),zt=V({name:"CommunicationSupportInternalNoteCreateForIntentV1Input",fields:{caseRef:{type:i.String_unsecure(),isOptional:!1},intentRef:{type:i.String_unsecure(),isOptional:!1},body:{type:i.String_unsecure(),isOptional:!1},idempotencyKey:{type:i.String_unsecure(),isOptional:!1}}}),xe=V({name:"CommunicationSupportInternalNoteEvidenceV1",fields:{noteRef:{type:i.String_unsecure(),isOptional:!1},caseRef:{type:i.String_unsecure(),isOptional:!1},evidenceRef:{type:i.String_unsecure(),isOptional:!1},visibility:{type:Xe,isOptional:!1},createdAt:{type:i.DateTime(),isOptional:!1}}}),Ze=V({name:"CommunicationSupportInternalNoteIntentEvidenceV1",fields:{...xe.config.fields,intentRef:{type:i.String_unsecure(),isOptional:!1},deliveryRef:{type:i.String_unsecure(),isOptional:!1},grantEvidenceRef:{type:i.String_unsecure(),isOptional:!1}}}),Ut=V({name:"CommunicationSupportInternalNoteVerifyV1Input",fields:{caseRef:{type:i.String_unsecure(),isOptional:!1},noteRef:{type:i.String_unsecure(),isOptional:!1},evidenceRef:{type:i.String_unsecure(),isOptional:!1}}}),Ft=V({name:"CommunicationSupportInternalNoteVerificationV1",fields:{status:{type:Ye("CommunicationSupportInternalNoteVerificationStatus",["verified"]),isOptional:!1},caseRef:{type:i.String_unsecure(),isOptional:!1},noteRef:{type:i.String_unsecure(),isOptional:!1},evidenceRef:{type:i.String_unsecure(),isOptional:!1},visibility:{type:Xe,isOptional:!1}}}),Ht=Qe({meta:{key:"communication.support.internal-note.create",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","private"],description:"Create one encrypted private Support note in CommunicationOS",goal:"Keep note content in CommunicationOS while SupportOS stores opaque evidence",context:"Server scope and actor come only from a short-lived AuthOS downstream grant",docId:W},io:{input:Gt,output:xe},policy:{auth:"admin"}}),Wt=Qe({meta:{key:"communication.support.internal-note.create-for-intent",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","private","reconciliation"],description:"Create an encrypted Support note bound to a body-free SupportOS intent",goal:"Make cross-service note attachment replayable without copying content",context:"The short-lived AuthOS grant binds scope and actor; the intent is opaque, redacted correlation metadata",docId:W},io:{input:zt,output:Ze},policy:{auth:"admin"}}),Ki=Lt({meta:{key:"communication.support.internal-note.verify",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","verify"],description:"Verify exact private-note evidence without returning content",goal:"Let SupportOS validate its opaque note reference at the authority boundary",context:"The query requires exact tenant, workspace, case, note, evidence, audience, and capability binding",docId:W},io:{input:Ut,output:Ft},policy:{auth:"admin"}}),Qi=Je({meta:{key:"communication.support.internal-note.created",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","event"],description:"Immutable redacted evidence that a private Support note was created",docId:W},payload:xe}),Ji=Je({meta:{key:"communication.support.internal-note.reconciliation-ready",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","reconciliation"],description:"Redacted durable delivery evidence for a SupportOS note intent",docId:W},payload:Ze}),Yi={create:"communication.support.internal-note.create",createForIntent:"communication.support.internal-note.create-for-intent",verify:"communication.support.internal-note.verify"};import{defineCommand as Ce}from"@lssm/lib.contracts-spec";import{defineSchemaModel as ke,ScalarTypeEnum as m}from"@lssm/lib.schema";var we=["platform.communication-os","platform.ai-routing"],to=Ce({meta:{key:"comms.thread.summarize",version:"1.0.0",stability:"experimental",owners:[...we],tags:["comms","ai","thread","summarize"],description:"Produce a persona-scoped summary of a communication thread via the AI routing layer",goal:"Give each persona a concise, role-appropriate digest of a thread without exposing cross-persona data",context:"Capability-gated AI operation. Auditor variant omits PII and redacts sensitive identifiers. "+"Draft-only — summary is returned to caller, not persisted by this command. "+"Handler routes to the appropriate model via lib.ai-agent provider selection."},io:{input:ke({name:"CommsThreadSummarizeInput",fields:{threadId:{type:m.String_unsecure(),isOptional:!1},messageIds:{type:m.String_unsecure(),isArray:!0,isOptional:!0},audiencePersona:{type:m.String_unsecure(),isOptional:!0}}}),output:Z,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},INSUFFICIENT_MESSAGES:{description:"Thread has too few messages to produce a meaningful summary",http:422,when:"Thread contains fewer messages than the minimum required for summarization"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"},CONTENT_POLICY_BLOCKED:{description:"Summary blocked by content safety policy",http:422,when:"Thread content triggers a content policy gate; summary cannot be generated without redaction"}}},policy:{auth:"user"}}),no=Ce({meta:{key:"comms.reply.draft",version:"1.0.0",stability:"experimental",owners:[...we],tags:["comms","ai","reply","draft"],description:"Generate a context-aware reply draft via the AI routing layer",goal:"Produce a safe, policy-checked reply draft that the actor can review and send",context:"Capability-gated AI operation. Not available to auditor persona. Draft status reflects policy evaluation: requires_review when policy gates apply. Handler calls communication.reply.draft internals after capability check."},io:{input:ke({name:"CommsReplyDraftInput",fields:{threadId:{type:m.String_unsecure(),isOptional:!1},messageId:{type:m.String_unsecure(),isOptional:!0},instruction:{type:m.String_unsecure(),isOptional:!0},toneHint:{type:m.String_unsecure(),isOptional:!0}}}),output:P,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},POLICY_BLOCKED:{description:"Reply draft blocked by content or safety policy",http:422,when:"Thread content or instruction triggers a policy gate; draft cannot be generated"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"},DRAFT_LIMIT_EXCEEDED:{description:"Too many pending drafts exist for this thread",http:429,when:"Actor has reached the maximum number of unreviewed drafts on this thread"}}},policy:{auth:"user"}}),io=Ce({meta:{key:"comms.handoff.suggest",version:"1.0.0",stability:"experimental",owners:[...we],tags:["comms","ai","handoff","suggest"],description:"Suggest whether a thread warrants a handoff and to whom, via the AI routing layer",goal:"Surface handoff opportunities with evidence before the actor decides to act",context:"AI suggestion only — does not create a HandoffPacket. "+"Handler evaluates thread urgency, owner gaps, and work-graph signals to produce a ranked suggestion. Auditor variant is read-only and may not trigger the `communication.handoff.create` action."},io:{input:ke({name:"CommsHandoffSuggestInput",fields:{threadId:{type:m.String_unsecure(),isOptional:!1},suggestedToOwner:{type:m.String_unsecure(),isOptional:!0},context:{type:m.String_unsecure(),isOptional:!0}}}),output:ee,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},INSUFFICIENT_CONTEXT:{description:"Thread has insufficient context to produce a handoff suggestion",http:422,when:"Thread is too short or lacks ownership/urgency signals for the model to reason about"},HANDOFF_NOT_WARRANTED:{description:"Analysis concludes no handoff is needed at this time",http:422,when:"Thread signals are below the handoff threshold; caller should surface this as a no-op result rather than an error"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"}}},policy:{auth:"user"}});export{pn as BlockReplyByPolicyCommand,Yn as COMMUNICATION_DELIVERY_REPROOF_CONTRACT,Jn as COMMUNICATION_MESSAGE_QUEUE_CUSTODY_CONTRACT,Qn as COMMUNICATION_MESSAGE_REPLAY_CONTRACT,Oi as CheckSubjectConsentQuery,Ni as ClassifyIntentCommand,io as CommsHandoffSuggestCommand,no as CommsReplyDraftCommand,to as CommsThreadSummarizeCommand,ri as ConnectCommunicationChannelV2Command,dt as CreateCommunicationGovernedWorkV1Command,ni as CreateCommunicationRoomV2Command,ti as CreateCommunicationSpaceV2Command,Wt as CreateCommunicationSupportInternalNoteForIntentV1Command,Ht as CreateCommunicationSupportInternalNoteV1Command,fn as CreateHandoffCommand,Di as CreateThreadCommand,It as DecideCommunicationIdentityV1Command,zn as DeleteCommunicationMessageV2Command,rn as DraftReplyCommand,Gn as EditCommunicationMessageV2Command,hi as EraseSubjectCommand,On as EscalateToHumanCommand,Pi as ExtractActionsCommand,an as ExtractDecisionsCommand,sn as ExtractRisksCommand,ji as GenerateSummaryCommand,Ci as GetThreadQuery,Vi as IngestMessageCommand,oi as ListCommunicationRoomsV2Query,ii as ListCommunicationSpacesV2Query,wi as ListMessagesQuery,hn as ProposeIdentityLinkCommand,gn as ProposeThreadLinkCommand,Fn as RecordCommunicationReceiptV2Command,Sn as RecordHumanFeedbackCommand,Wn as SearchCommunicationMessagesV2Query,Kn as SearchCommunicationMessagesV3Query,ki as SearchThreadsQuery,Bn as SendCommunicationMessageV2Command,qn as SendCommunicationMessageV3Command,xt as SendCommunicationMessageV3Input,cn as SendReplyCommand,si as SetCommunicationAuthorityGrantV2Command,Hn as SetCommunicationInboxStateV2Command,ai as SetCommunicationMembershipV2Command,Un as SetCommunicationReactionV2Command,ci as SyncCommunicationConnectionV2Command,mt as TransitionCommunicationGovernedWorkV1Command,xi as UpdateThreadStatusCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as o}from"zod";var d="1.0.0",g="1.0.0",y={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},t=o.string().trim().min(1),a=o.string().datetime({offset:!0}),f=o.string().regex(/^sha256:[a-f0-9]{64}$/),p=o.object({ref:t,digest:f}).strict(),r=p.extend({revision:o.number().int().positive()}).strict(),m=o.object({tenantRef:t,workspaceRef:t.optional(),spaceRef:t.optional(),subjectRef:t}).strict(),h=o.object({schemaVersion:o.literal(d),profileRef:t,revision:o.number().int().positive(),agentRef:t,applicationRef:t,scope:m,routeBindings:o.array(r),connectionRefs:o.array(t),preferenceSet:r,policyRefs:o.array(t).min(1),evidenceRefs:o.array(t).min(1),createdAt:a,updatedAt:a,profileDigest:f}).strict().superRefine((e,i)=>{for(let s of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[s]).size!==e[s].length)i.addIssue({code:o.ZodIssueCode.custom,path:[s],message:`${s} must be unique`});let n=e.routeBindings.map((s)=>s.ref);if(new Set(n).size!==n.length)i.addIssue({code:o.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),C=o.object({schemaVersion:o.literal(g),linkRef:t,profile:r,agentRef:t,applicationRef:t,scope:m,runRef:t.optional(),taskRef:t.optional(),helpRequestRef:t.optional(),approvalRequestRef:t.optional(),backgroundResultRef:t.optional(),canonicalConversation:p.optional(),session:r.optional(),correlationRef:t,evidenceRefs:o.array(t).min(1)}).strict().superRefine((e,i)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)i.addIssue({code:o.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)i.addIssue({code:o.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function u(e,i){return e.tenantRef===i.tenantRef&&e.workspaceRef===i.workspaceRef&&e.spaceRef===i.spaceRef&&e.subjectRef===i.subjectRef}function v(e){let i=[];for(let n of["agentRef","applicationRef"])if(e.profile[n]!==e.lifecycleLink[n])i.push(`Lifecycle ${n} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)i.push("Lifecycle profile binding does not match the agent profile");if(!u(e.profile.scope,e.lifecycleLink.scope))i.push("Lifecycle scope does not match the agent profile");return i}function V(e){let{intent:i,progress:n}=e,s=[];if(n.deliveryRef!==i.deliveryRef||n.intent.ref!==i.deliveryRef||n.intent.digest!==i.deliveryDigest)s.push("Progress delivery does not match the intent");if(!u(n.scope,i.scope))s.push("Progress scope does not match the intent");if(n.recipientRef!==i.recipientRefs[0])s.push("Progress recipient does not match the intent");let c=i.requestedRoutes.find((l)=>l.ref===n.route.ref);if(!c||c.revision!==n.route.revision||c.digest!==n.route.digest)s.push("Progress route was not requested by the intent");if(Date.parse(n.occurredAt)<Date.parse(i.createdAt)||Date.parse(n.occurredAt)>Date.parse(i.expiresAt))s.push("Progress occurred outside the intent validity window");return s}export{g as COMMUNICATION_AGENT_LIFECYCLE_LINK_SCHEMA_VERSION,d as COMMUNICATION_AGENT_PROFILE_SCHEMA_VERSION,C as CommunicationAgentLifecycleLinkV1Schema,y as CommunicationAgentOmnichannelDocBlock,h as CommunicationAgentProfileV1Schema,p as CommunicationArtifactBindingV1Schema,f as CommunicationDigestV1Schema,m as CommunicationScopeBindingV1Schema,r as CommunicationVersionedArtifactBindingV1Schema,u as communicationScopeBindingsEqualV1,v as validateCommunicationAgentLifecycleBindingV1,V as validateCommunicationDeliveryProgressBindingV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as s}from"zod";import{z as c}from"zod";var R="1.0.0",y="1.0.0",q={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},t=c.string().trim().min(1),d=c.string().datetime({offset:!0}),p=c.string().regex(/^sha256:[a-f0-9]{64}$/),r=c.object({ref:t,digest:p}).strict(),a=r.extend({revision:c.number().int().positive()}).strict(),f=c.object({tenantRef:t,workspaceRef:t.optional(),spaceRef:t.optional(),subjectRef:t}).strict(),S=c.object({schemaVersion:c.literal(R),profileRef:t,revision:c.number().int().positive(),agentRef:t,applicationRef:t,scope:f,routeBindings:c.array(a),connectionRefs:c.array(t),preferenceSet:a,policyRefs:c.array(t).min(1),evidenceRefs:c.array(t).min(1),createdAt:d,updatedAt:d,profileDigest:p}).strict().superRefine((e,i)=>{for(let n of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[n]).size!==e[n].length)i.addIssue({code:c.ZodIssueCode.custom,path:[n],message:`${n} must be unique`});let o=e.routeBindings.map((n)=>n.ref);if(new Set(o).size!==o.length)i.addIssue({code:c.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),g=c.object({schemaVersion:c.literal(y),linkRef:t,profile:a,agentRef:t,applicationRef:t,scope:f,runRef:t.optional(),taskRef:t.optional(),helpRequestRef:t.optional(),approvalRequestRef:t.optional(),backgroundResultRef:t.optional(),canonicalConversation:r.optional(),session:a.optional(),correlationRef:t,evidenceRefs:c.array(t).min(1)}).strict().superRefine((e,i)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)i.addIssue({code:c.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)i.addIssue({code:c.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function l(e,i){return e.tenantRef===i.tenantRef&&e.workspaceRef===i.workspaceRef&&e.spaceRef===i.spaceRef&&e.subjectRef===i.subjectRef}function k(e){let i=[];for(let o of["agentRef","applicationRef"])if(e.profile[o]!==e.lifecycleLink[o])i.push(`Lifecycle ${o} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)i.push("Lifecycle profile binding does not match the agent profile");if(!l(e.profile.scope,e.lifecycleLink.scope))i.push("Lifecycle scope does not match the agent profile");return i}function b(e){let{intent:i,progress:o}=e,n=[];if(o.deliveryRef!==i.deliveryRef||o.intent.ref!==i.deliveryRef||o.intent.digest!==i.deliveryDigest)n.push("Progress delivery does not match the intent");if(!l(o.scope,i.scope))n.push("Progress scope does not match the intent");if(o.recipientRef!==i.recipientRefs[0])n.push("Progress recipient does not match the intent");let u=i.requestedRoutes.find((h)=>h.ref===o.route.ref);if(!u||u.revision!==o.route.revision||u.digest!==o.route.digest)n.push("Progress route was not requested by the intent");if(Date.parse(o.occurredAt)<Date.parse(i.createdAt)||Date.parse(o.occurredAt)>Date.parse(i.expiresAt))n.push("Progress occurred outside the intent validity window");return n}var C="1.0.0",m=s.string().trim().min(1),v=s.string().datetime({offset:!0}),V=s.enum(["queued","running","waiting_for_help","waiting_for_approval","blocked","completed","failed","cancelled"]),B=s.object({schemaVersion:s.literal(C),projectionRef:m,projectionDigest:p,scope:f,lifecycleLink:g,status:V,checkpoint:r,canonicalConversation:r.optional(),helpRequest:r.optional(),approvalRequest:r.optional(),progressSummaryRef:m,occurredAt:v,evidenceRefs:s.array(m).min(1),effectAuthority:s.literal("none")}).strict().superRefine((e,i)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)i.addIssue({code:s.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(e.status==="waiting_for_help"!==Boolean(e.helpRequest))i.addIssue({code:s.ZodIssueCode.custom,path:["helpRequest"],message:"help binding is required only while waiting for help"});if(e.status==="waiting_for_approval"!==Boolean(e.approvalRequest))i.addIssue({code:s.ZodIssueCode.custom,path:["approvalRequest"],message:"approval binding is required only while waiting for approval"})});function A(e){let i=[],{projection:o,helpRequest:n}=e;if(o.canonicalConversation&&(o.canonicalConversation.ref!==o.lifecycleLink.canonicalConversation?.ref||o.canonicalConversation.digest!==o.lifecycleLink.canonicalConversation?.digest))i.push("Lifecycle projection conversation does not match its link");if(o.status==="waiting_for_help"&&!n)i.push("Waiting-for-help projection requires the durable help request");if(!l(o.scope,o.lifecycleLink.scope))i.push("Projection scope does not match the lifecycle link");if(n&&(o.lifecycleLink.runRef!==n.runRef||o.lifecycleLink.helpRequestRef!==n.id))i.push("Help request does not match the lifecycle link");if(n&&o.helpRequest?.ref!==n.id)i.push("Projection help binding does not match the help request");if(n&&o.checkpoint.ref!==n.checkpointRef)i.push("Projection checkpoint does not match the help request");if(o.approvalRequest?.ref!==o.lifecycleLink.approvalRequestRef)i.push("Projection approval binding does not match the lifecycle link");return i}function _(e){let{projection:i}=e;if(!i.canonicalConversation)return["Lifecycle projection requires a canonical conversation"];if(!i.lifecycleLink.session)return["Lifecycle projection requires a canonical session"];return A(e)}export{C as COMMUNICATION_AGENT_LIFECYCLE_PROJECTION_SCHEMA_VERSION,V as CommunicationAgentLifecycleProjectionStatusV1Schema,B as CommunicationAgentLifecycleProjectionV1Schema,_ as validateCanonicalAgentLifecycleProjectionV1,A as validateCommunicationAgentLifecycleProjectionV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as o}from"zod";import{z as r}from"zod";var A="1.0.0",V="1.0.0",L={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},i=r.string().trim().min(1),h=r.string().datetime({offset:!0}),a=r.string().regex(/^sha256:[a-f0-9]{64}$/),l=r.object({ref:i,digest:a}).strict(),d=l.extend({revision:r.number().int().positive()}).strict(),m=r.object({tenantRef:i,workspaceRef:i.optional(),spaceRef:i.optional(),subjectRef:i}).strict(),q=r.object({schemaVersion:r.literal(A),profileRef:i,revision:r.number().int().positive(),agentRef:i,applicationRef:i,scope:m,routeBindings:r.array(d),connectionRefs:r.array(i),preferenceSet:d,policyRefs:r.array(i).min(1),evidenceRefs:r.array(i).min(1),createdAt:h,updatedAt:h,profileDigest:a}).strict().superRefine((e,t)=>{for(let c of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[c]).size!==e[c].length)t.addIssue({code:r.ZodIssueCode.custom,path:[c],message:`${c} must be unique`});let n=e.routeBindings.map((c)=>c.ref);if(new Set(n).size!==n.length)t.addIssue({code:r.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),R=r.object({schemaVersion:r.literal(V),linkRef:i,profile:d,agentRef:i,applicationRef:i,scope:m,runRef:i.optional(),taskRef:i.optional(),helpRequestRef:i.optional(),approvalRequestRef:i.optional(),backgroundResultRef:i.optional(),canonicalConversation:l.optional(),session:d.optional(),correlationRef:i,evidenceRefs:r.array(i).min(1)}).strict().superRefine((e,t)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)t.addIssue({code:r.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)t.addIssue({code:r.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function p(e,t){return e.tenantRef===t.tenantRef&&e.workspaceRef===t.workspaceRef&&e.spaceRef===t.spaceRef&&e.subjectRef===t.subjectRef}function I(e){let t=[];for(let n of["agentRef","applicationRef"])if(e.profile[n]!==e.lifecycleLink[n])t.push(`Lifecycle ${n} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)t.push("Lifecycle profile binding does not match the agent profile");if(!p(e.profile.scope,e.lifecycleLink.scope))t.push("Lifecycle scope does not match the agent profile");return t}function B(e){let{intent:t,progress:n}=e,c=[];if(n.deliveryRef!==t.deliveryRef||n.intent.ref!==t.deliveryRef||n.intent.digest!==t.deliveryDigest)c.push("Progress delivery does not match the intent");if(!p(n.scope,t.scope))c.push("Progress scope does not match the intent");if(n.recipientRef!==t.recipientRefs[0])c.push("Progress recipient does not match the intent");let f=t.requestedRoutes.find((g)=>g.ref===n.route.ref);if(!f||f.revision!==n.route.revision||f.digest!==n.route.digest)c.push("Progress route was not requested by the intent");if(Date.parse(n.occurredAt)<Date.parse(t.createdAt)||Date.parse(n.occurredAt)>Date.parse(t.expiresAt))c.push("Progress occurred outside the intent validity window");return c}async function C(e){let t=new TextEncoder().encode(y(e)),n=new Uint8Array(t.byteLength);n.set(t);let c=await crypto.subtle.digest("SHA-256",n.buffer),f=Array.from(new Uint8Array(c),(g)=>g.toString(16).padStart(2,"0")).join("");return a.parse(`sha256:${f}`)}function y(e){if(Array.isArray(e))return`[${e.map(y).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>`${JSON.stringify(t)}:${y(n)}`).join(",")}}`;return JSON.stringify(e)}var S="communication.agent-surface-control.v1",v="communication.agent-surface-control-result.v1",u=o.string().trim().min(1),s=l,x=o.discriminatedUnion("kind",[o.object({kind:o.literal("help_response"),helpRequest:s,response:s}).strict(),o.object({kind:o.literal("approval_decision"),approvalRequest:s,decision:o.enum(["approved","rejected"]),effect:s}).strict(),o.object({kind:o.literal("steer"),instruction:s}).strict(),o.object({kind:o.literal("queue"),instruction:s}).strict(),o.object({kind:o.literal("pause"),reasonRef:u}).strict(),o.object({kind:o.literal("cancel"),reasonRef:u}).strict(),o.object({kind:o.literal("branch"),branchRequest:s}).strict()]),w=o.object({schemaVersion:o.literal(S),controlRef:u,controlDigest:a,scope:m,canonicalConversation:l,lifecycleLink:R,actorPrincipalRef:u,actorIdentityEvidence:s,authorityDecision:s,payload:x,idempotencyKey:u,createdAt:o.string().datetime({offset:!0}),expiresAt:o.string().datetime({offset:!0}),effectAuthority:o.literal("none")}).strict().superRefine((e,t)=>{if(Date.parse(e.expiresAt)<=Date.parse(e.createdAt))t.addIssue({code:o.ZodIssueCode.custom,path:["expiresAt"],message:"control expiry must follow creation"})}),T=o.object({schemaVersion:o.literal(v),resultRef:u,resultDigest:a,control:s,scope:m,canonicalConversation:s,authorityDecision:s,outcome:o.enum(["applied","duplicate","denied","expired"]),executionReceipt:s.optional(),decidedAt:o.string().datetime({offset:!0}),evidenceRefs:o.array(u).min(1),effectAuthority:o.literal("none")}).strict().superRefine((e,t)=>{if((e.outcome==="applied"||e.outcome==="duplicate")!==Boolean(e.executionReceipt))t.addIssue({code:o.ZodIssueCode.custom,path:["executionReceipt"],message:"executed controls require an execution receipt"})});async function b(e){return C(e)}async function z(e){let{controlDigest:t,...n}=e;return t===await b(n)}async function k(e){return C(e)}async function M(e){let{resultDigest:t,...n}=e;return t===await k(n)}function U(e){let t=[];if(!p(e.scope,e.lifecycleLink.scope))t.push("Agent surface control scope does not match lifecycle scope");if(e.lifecycleLink.canonicalConversation?.ref!==e.canonicalConversation.ref||e.lifecycleLink.canonicalConversation?.digest!==e.canonicalConversation.digest)t.push("Agent surface control conversation does not match lifecycle link");if(!e.lifecycleLink.runRef)t.push("Agent surface control requires a run-bound lifecycle link");if(e.payload.kind==="help_response"&&e.payload.helpRequest.ref!==e.lifecycleLink.helpRequestRef)t.push("Help response does not match the lifecycle help request");if(e.payload.kind==="approval_decision"&&e.payload.approvalRequest.ref!==e.lifecycleLink.approvalRequestRef)t.push("Approval decision does not match the lifecycle approval request");return t}function Z(e){let t=[];if(e.result.control.ref!==e.control.controlRef||e.result.control.digest!==e.control.controlDigest)t.push("Agent surface result control binding does not match");if(!p(e.result.scope,e.control.scope))t.push("Agent surface result scope does not match");if(e.result.canonicalConversation.ref!==e.control.canonicalConversation.ref||e.result.canonicalConversation.digest!==e.control.canonicalConversation.digest)t.push("Agent surface result conversation does not match");if(e.result.authorityDecision.ref!==e.control.authorityDecision.ref||e.result.authorityDecision.digest!==e.control.authorityDecision.digest)t.push("Agent surface result authority decision does not match");return t}export{v as COMMUNICATION_AGENT_SURFACE_CONTROL_RESULT_V1,S as COMMUNICATION_AGENT_SURFACE_CONTROL_V1,x as CommunicationAgentSurfaceControlPayloadV1Schema,T as CommunicationAgentSurfaceControlResultV1Schema,w as CommunicationAgentSurfaceControlV1Schema,k as digestCommunicationAgentSurfaceControlResultV1,b as digestCommunicationAgentSurfaceControlV1,U as validateCommunicationAgentSurfaceControlBindingV1,Z as validateCommunicationAgentSurfaceControlResultBindingV1,M as verifyCommunicationAgentSurfaceControlResultV1,z as verifyCommunicationAgentSurfaceControlV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineCommand as r}from"@lssm/lib.contracts-spec";import{defineSchemaModel as a,ScalarTypeEnum as i}from"@lssm/lib.schema";import{defineEnum as n}from"@lssm/lib.schema";var s=n("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),c=n("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),d=n("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),p=n("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),y=n("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),l=n("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),m=n("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),f=n("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),x=n("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{defineSchemaModel as t,ScalarTypeEnum as e}from"@lssm/lib.schema";var g=t({name:"ChannelAccount",description:"A channel account belonging to a participant",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:s,isOptional:!1},externalId:{type:e.String_unsecure(),isOptional:!1},displayName:{type:e.String_unsecure(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},isPrimary:{type:e.Boolean(),isOptional:!1,defaultValue:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),S=t({name:"IdentityLink",description:"Proposed or confirmed relationship between participant identities",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},candidateParticipantId:{type:e.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!1,defaultValue:"generated"},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),D=t({name:"CommunicationParticipant",description:"A person or system that participates in conversations",fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!0},email:{type:e.EmailAddress(),isOptional:!0},accounts:{type:g,isArray:!0,isOptional:!1},identityLinks:{type:S,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),_=t({name:"Attachment",description:"A file or media attachment on a message",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},mimeType:{type:e.String_unsecure(),isOptional:!0},sizeBytes:{type:e.Int_unsecure(),isOptional:!0},url:{type:e.URL(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0}}}),h=t({name:"ThreadLink",description:"Link between a thread and an external business object (V2: rich-reference objectRef replaces V1 objectType/objectId)",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},objectRef:{type:e.JSONObject(),isOptional:!1},relation:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),A=t({name:"MessageIntent",description:"Classified message or thread intent with confidence and evidence",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},category:{type:m,isOptional:!1},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},evidenceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),w=t({name:"CommunicationMessage",description:"A single message within a communication thread",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:s,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},externalMessageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},bodyNormalized:{type:e.String_unsecure(),isOptional:!0},status:{type:d,isOptional:!1,defaultValue:"received"},intent:{type:A,isOptional:!0},attachments:{type:_,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),M=t({name:"CommunicationFormIntake",description:"Declarative source reference for a communication message mapped into an entity-bound form intake result",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:s,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},entityKey:{type:e.String_unsecure(),isOptional:!1},projectionKind:{type:e.String_unsecure(),isOptional:!1},formKey:{type:e.String_unsecure(),isOptional:!0},formVersion:{type:e.String_unsecure(),isOptional:!0},completionProfileKey:{type:e.String_unsecure(),isOptional:!0},acceptedValues:{type:e.JSONObject(),isOptional:!1},completionDebt:{type:e.JSONObject(),isArray:!0,isOptional:!1},captureStatus:{type:e.String_unsecure(),isOptional:!1,defaultValue:"accepted"},completionStatus:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),E=t({name:"CommunicationThread",description:"A conversation thread spanning one or more channels",fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!0},status:{type:c,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:s,isArray:!0,isOptional:!1},links:{type:h,isArray:!0,isOptional:!0},assignedTo:{type:e.String_unsecure(),isOptional:!0},priority:{type:e.String_unsecure(),isOptional:!0},tags:{type:e.String_unsecure(),isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),O=t({name:"CommunicationAction",description:"Structured action extracted from a conversation",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},owner:{type:e.String_unsecure(),isOptional:!0},deadline:{type:e.DateTime(),isOptional:!0},blockers:{type:e.String_unsecure(),isArray:!0,isOptional:!0},sourceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},safetyMode:{type:f,isOptional:!1,defaultValue:"draft_only"}}}),u=t({name:"ReplyDraft",description:"An AI-generated or human-authored reply draft",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},status:{type:p,isOptional:!1,defaultValue:"drafted"},generatedBy:{type:e.String_unsecure(),isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},promptVersion:{type:e.String_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},reviewedAt:{type:e.DateTime(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),v=t({name:"HandoffPacket",description:"A structured handoff between owners, teams, or systems",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},status:{type:y,isOptional:!1,defaultValue:"created"},fromOwner:{type:e.String_unsecure(),isOptional:!1},toOwner:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!1},keyFacts:{type:e.String_unsecure(),isArray:!0,isOptional:!0},openQuestions:{type:e.String_unsecure(),isArray:!0,isOptional:!0},requiredActions:{type:O,isArray:!0,isOptional:!0},evidenceLinks:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),C=t({name:"CommunicationSummary",description:"AI-generated summary of a thread or message range",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},content:{type:e.String_unsecure(),isOptional:!1},facts:{type:e.JSONObject(),isArray:!0,isOptional:!0},actions:{type:O,isArray:!0,isOptional:!0},decisions:{type:e.JSONObject(),isArray:!0,isOptional:!0},risks:{type:e.JSONObject(),isArray:!0,isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1}}}),R=t({name:"AgentSuggestion",description:"An AI-generated suggestion attached to a thread or message",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},suggestionType:{type:e.String_unsecure(),isOptional:!1},content:{type:e.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!1,defaultValue:"generated"},modelName:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}});var o=["platform.communication-os"],B=r({meta:{key:"communication.decision.extract",version:"1.0.0",stability:"experimental",owners:[...o],tags:["communication","decision","extract"],description:"Extract decisions and open questions from a thread",goal:"Make buried decisions reviewable with source references",context:"Read-only/draft-only operation for summaries and handoffs"},io:{input:a({name:"ExtractDecisionsInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1}}}),output:a({name:"ExtractDecisionsOutput",fields:{decisions:{type:i.JSONObject(),isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),F=r({meta:{key:"communication.risk.extract",version:"1.0.0",stability:"experimental",owners:[...o],tags:["communication","risk","blocker"],description:"Extract risks and blockers from a thread",goal:"Surface blockers, policy risks, and unresolved dependencies",context:"Read-only/draft-only operation for triage and escalation"},io:{input:a({name:"ExtractRisksInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1}}}),output:a({name:"ExtractRisksOutput",fields:{risks:{type:i.JSONObject(),isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),L=r({meta:{key:"communication.reply.draft",version:"1.0.0",stability:"experimental",owners:[...o],tags:["communication","reply","draft"],description:"Draft a reply using thread context and policy",goal:"Generate a safe, context-aware reply draft",context:"Draft-only operation; policy may require review or block the draft"},io:{input:a({name:"DraftReplyInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},messageId:{type:i.String_unsecure(),isOptional:!0},instruction:{type:i.String_unsecure(),isOptional:!0}}}),output:u},policy:{auth:"user"}}),q=r({meta:{key:"communication.reply.send",version:"1.0.0",stability:"experimental",owners:[...o],tags:["communication","reply","send"],description:"Send an approved reply through its channel",goal:"Deliver a reply only when policy allows",context:"Policy-executable operation; every sent reply must be auditable"},io:{input:a({name:"SendReplyInput",fields:{draftId:{type:i.String_unsecure(),isOptional:!1}}}),output:a({name:"SendReplyOutput",fields:{draftId:{type:i.String_unsecure(),isOptional:!1},status:{type:p,isOptional:!1},sentAt:{type:i.DateTime(),isOptional:!0}}})},policy:{auth:"user"}}),H=r({meta:{key:"communication.reply.blockByPolicy",version:"1.0.0",stability:"experimental",owners:[...o],tags:["communication","reply","policy","blocked"],description:"Record that a reply was blocked by policy",goal:"Keep blocked reply decisions explicit and auditable",context:"Used by reply policy gates before any outbound side effect"},io:{input:a({name:"BlockReplyByPolicyInput",fields:{draftId:{type:i.String_unsecure(),isOptional:!1},policyRef:{type:i.String_unsecure(),isOptional:!1},reason:{type:i.String_unsecure(),isOptional:!1}}}),output:u},policy:{auth:"admin"}});export{H as BlockReplyByPolicyCommand,L as DraftReplyCommand,B as ExtractDecisionsCommand,F as ExtractRisksCommand,q as SendReplyCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as o}from"zod";var g="1.0.0",y="1.0.0",h={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},n=o.string().trim().min(1),m=o.string().datetime({offset:!0}),a=o.string().regex(/^sha256:[a-f0-9]{64}$/),u=o.object({ref:n,digest:a}).strict(),c=u.extend({revision:o.number().int().positive()}).strict(),d=o.object({tenantRef:n,workspaceRef:n.optional(),spaceRef:n.optional(),subjectRef:n}).strict(),C=o.object({schemaVersion:o.literal(g),profileRef:n,revision:o.number().int().positive(),agentRef:n,applicationRef:n,scope:d,routeBindings:o.array(c),connectionRefs:o.array(n),preferenceSet:c,policyRefs:o.array(n).min(1),evidenceRefs:o.array(n).min(1),createdAt:m,updatedAt:m,profileDigest:a}).strict().superRefine((e,t)=>{for(let s of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[s]).size!==e[s].length)t.addIssue({code:o.ZodIssueCode.custom,path:[s],message:`${s} must be unique`});let i=e.routeBindings.map((s)=>s.ref);if(new Set(i).size!==i.length)t.addIssue({code:o.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),V=o.object({schemaVersion:o.literal(y),linkRef:n,profile:c,agentRef:n,applicationRef:n,scope:d,runRef:n.optional(),taskRef:n.optional(),helpRequestRef:n.optional(),approvalRequestRef:n.optional(),backgroundResultRef:n.optional(),canonicalConversation:u.optional(),session:c.optional(),correlationRef:n,evidenceRefs:o.array(n).min(1)}).strict().superRefine((e,t)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)t.addIssue({code:o.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)t.addIssue({code:o.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function l(e,t){return e.tenantRef===t.tenantRef&&e.workspaceRef===t.workspaceRef&&e.spaceRef===t.spaceRef&&e.subjectRef===t.subjectRef}function v(e){let t=[];for(let i of["agentRef","applicationRef"])if(e.profile[i]!==e.lifecycleLink[i])t.push(`Lifecycle ${i} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)t.push("Lifecycle profile binding does not match the agent profile");if(!l(e.profile.scope,e.lifecycleLink.scope))t.push("Lifecycle scope does not match the agent profile");return t}function A(e){let{intent:t,progress:i}=e,s=[];if(i.deliveryRef!==t.deliveryRef||i.intent.ref!==t.deliveryRef||i.intent.digest!==t.deliveryDigest)s.push("Progress delivery does not match the intent");if(!l(i.scope,t.scope))s.push("Progress scope does not match the intent");if(i.recipientRef!==t.recipientRefs[0])s.push("Progress recipient does not match the intent");let r=t.requestedRoutes.find((f)=>f.ref===i.route.ref);if(!r||r.revision!==i.route.revision||r.digest!==i.route.digest)s.push("Progress route was not requested by the intent");if(Date.parse(i.occurredAt)<Date.parse(t.createdAt)||Date.parse(i.occurredAt)>Date.parse(t.expiresAt))s.push("Progress occurred outside the intent validity window");return s}async function k(e){let t=new TextEncoder().encode(p(e)),i=new Uint8Array(t.byteLength);i.set(t);let s=await crypto.subtle.digest("SHA-256",i.buffer),r=Array.from(new Uint8Array(s),(f)=>f.toString(16).padStart(2,"0")).join("");return a.parse(`sha256:${r}`)}function p(e){if(Array.isArray(e))return`[${e.map(p).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).sort(([t],[i])=>t.localeCompare(i)).map(([t,i])=>`${JSON.stringify(t)}:${p(i)}`).join(",")}}`;return JSON.stringify(e)}export{k as digestCommunicationArtifactV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as r}from"zod";import{z as i}from"zod";var h="1.0.0",R="1.0.0",S={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},o=i.string().trim().min(1),C=i.string().datetime({offset:!0}),c=i.string().regex(/^sha256:[a-f0-9]{64}$/),f=i.object({ref:o,digest:c}).strict(),a=f.extend({revision:i.number().int().positive()}).strict(),p=i.object({tenantRef:o,workspaceRef:o.optional(),spaceRef:o.optional(),subjectRef:o}).strict(),b=i.object({schemaVersion:i.literal(h),profileRef:o,revision:i.number().int().positive(),agentRef:o,applicationRef:o,scope:p,routeBindings:i.array(a),connectionRefs:i.array(o),preferenceSet:a,policyRefs:i.array(o).min(1),evidenceRefs:i.array(o).min(1),createdAt:C,updatedAt:C,profileDigest:c}).strict().superRefine((e,n)=>{for(let s of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[s]).size!==e[s].length)n.addIssue({code:i.ZodIssueCode.custom,path:[s],message:`${s} must be unique`});let t=e.routeBindings.map((s)=>s.ref);if(new Set(t).size!==t.length)n.addIssue({code:i.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),I=i.object({schemaVersion:i.literal(R),linkRef:o,profile:a,agentRef:o,applicationRef:o,scope:p,runRef:o.optional(),taskRef:o.optional(),helpRequestRef:o.optional(),approvalRequestRef:o.optional(),backgroundResultRef:o.optional(),canonicalConversation:f.optional(),session:a.optional(),correlationRef:o,evidenceRefs:i.array(o).min(1)}).strict().superRefine((e,n)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)n.addIssue({code:i.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)n.addIssue({code:i.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function u(e,n){return e.tenantRef===n.tenantRef&&e.workspaceRef===n.workspaceRef&&e.spaceRef===n.spaceRef&&e.subjectRef===n.subjectRef}function k(e){let n=[];for(let t of["agentRef","applicationRef"])if(e.profile[t]!==e.lifecycleLink[t])n.push(`Lifecycle ${t} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)n.push("Lifecycle profile binding does not match the agent profile");if(!u(e.profile.scope,e.lifecycleLink.scope))n.push("Lifecycle scope does not match the agent profile");return n}function x(e){let{intent:n,progress:t}=e,s=[];if(t.deliveryRef!==n.deliveryRef||t.intent.ref!==n.deliveryRef||t.intent.digest!==n.deliveryDigest)s.push("Progress delivery does not match the intent");if(!u(t.scope,n.scope))s.push("Progress scope does not match the intent");if(t.recipientRef!==n.recipientRefs[0])s.push("Progress recipient does not match the intent");let m=n.requestedRoutes.find((l)=>l.ref===t.route.ref);if(!m||m.revision!==t.route.revision||m.digest!==t.route.digest)s.push("Progress route was not requested by the intent");if(Date.parse(t.occurredAt)<Date.parse(n.createdAt)||Date.parse(t.occurredAt)>Date.parse(n.expiresAt))s.push("Progress occurred outside the intent validity window");return s}async function y(e){let n=new TextEncoder().encode(g(e)),t=new Uint8Array(n.byteLength);t.set(n);let s=await crypto.subtle.digest("SHA-256",t.buffer),m=Array.from(new Uint8Array(s),(l)=>l.toString(16).padStart(2,"0")).join("");return c.parse(`sha256:${m}`)}function g(e){if(Array.isArray(e))return`[${e.map(g).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).sort(([n],[t])=>n.localeCompare(t)).map(([n,t])=>`${JSON.stringify(n)}:${g(t)}`).join(",")}}`;return JSON.stringify(e)}var A="communication.canonical-agent-conversation.v1",d=r.string().trim().min(1),w=r.object({schemaVersion:r.literal(A),conversationRef:d,conversationDigest:c,revision:r.number().int().positive(),scope:p,roomRef:d,session:a,origin:r.enum(["interactive","scheduled","background","recovery","replay","branch"]),parentConversation:f.optional(),participantRefs:r.array(d).min(1),channelIdentityRefs:r.array(d),createdAt:r.string().datetime({offset:!0}),updatedAt:r.string().datetime({offset:!0}),effectAuthority:r.literal("none")}).strict().superRefine((e,n)=>{for(let t of["participantRefs","channelIdentityRefs"])if(new Set(e[t]).size!==e[t].length)n.addIssue({code:r.ZodIssueCode.custom,path:[t],message:`${t} must be unique`});if(e.origin==="branch"!==Boolean(e.parentConversation))n.addIssue({code:r.ZodIssueCode.custom,path:["parentConversation"],message:"parentConversation is required only for branch origin"});if(Date.parse(e.updatedAt)<Date.parse(e.createdAt))n.addIssue({code:r.ZodIssueCode.custom,path:["updatedAt"],message:"updatedAt cannot precede createdAt"})});async function V(e){return y(e)}async function P(e){let{conversationDigest:n,...t}=e;return n===await V(t)}function E(e){return u(e.conversation.scope,e.scope)?[]:["Canonical conversation scope does not match"]}export{A as COMMUNICATION_CANONICAL_AGENT_CONVERSATION_V1,w as CommunicationCanonicalAgentConversationV1Schema,V as digestCommunicationCanonicalAgentConversationV1,E as validateCanonicalConversationScopeV1,P as verifyCommunicationCanonicalAgentConversationV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as o}from"zod";import{z as a}from"zod";var E="1.0.0",_="1.0.0",K={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},r=a.string().trim().min(1),V=a.string().datetime({offset:!0}),u=a.string().regex(/^sha256:[a-f0-9]{64}$/),I=a.object({ref:r,digest:u}).strict(),S=I.extend({revision:a.number().int().positive()}).strict(),d=a.object({tenantRef:r,workspaceRef:r.optional(),spaceRef:r.optional(),subjectRef:r}).strict(),Z=a.object({schemaVersion:a.literal(E),profileRef:r,revision:a.number().int().positive(),agentRef:r,applicationRef:r,scope:d,routeBindings:a.array(S),connectionRefs:a.array(r),preferenceSet:S,policyRefs:a.array(r).min(1),evidenceRefs:a.array(r).min(1),createdAt:V,updatedAt:V,profileDigest:u}).strict().superRefine((e,t)=>{for(let i of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[i]).size!==e[i].length)t.addIssue({code:a.ZodIssueCode.custom,path:[i],message:`${i} must be unique`});let n=e.routeBindings.map((i)=>i.ref);if(new Set(n).size!==n.length)t.addIssue({code:a.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),U=a.object({schemaVersion:a.literal(_),linkRef:r,profile:S,agentRef:r,applicationRef:r,scope:d,runRef:r.optional(),taskRef:r.optional(),helpRequestRef:r.optional(),approvalRequestRef:r.optional(),backgroundResultRef:r.optional(),canonicalConversation:I.optional(),session:S.optional(),correlationRef:r,evidenceRefs:a.array(r).min(1)}).strict().superRefine((e,t)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)t.addIssue({code:a.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)t.addIssue({code:a.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function C(e,t){return e.tenantRef===t.tenantRef&&e.workspaceRef===t.workspaceRef&&e.spaceRef===t.spaceRef&&e.subjectRef===t.subjectRef}function F(e){let t=[];for(let n of["agentRef","applicationRef"])if(e.profile[n]!==e.lifecycleLink[n])t.push(`Lifecycle ${n} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)t.push("Lifecycle profile binding does not match the agent profile");if(!C(e.profile.scope,e.lifecycleLink.scope))t.push("Lifecycle scope does not match the agent profile");return t}function H(e){let{intent:t,progress:n}=e,i=[];if(n.deliveryRef!==t.deliveryRef||n.intent.ref!==t.deliveryRef||n.intent.digest!==t.deliveryDigest)i.push("Progress delivery does not match the intent");if(!C(n.scope,t.scope))i.push("Progress scope does not match the intent");if(n.recipientRef!==t.recipientRefs[0])i.push("Progress recipient does not match the intent");let s=t.requestedRoutes.find((m)=>m.ref===n.route.ref);if(!s||s.revision!==n.route.revision||s.digest!==n.route.digest)i.push("Progress route was not requested by the intent");if(Date.parse(n.occurredAt)<Date.parse(t.createdAt)||Date.parse(n.occurredAt)>Date.parse(t.expiresAt))i.push("Progress occurred outside the intent validity window");return i}import{z as f}from"zod";var w="1.0.0",A=["email","calendar","sms","slack","teams","discord","telegram","whatsapp","matrix","in_app","push","webhook","web_chat","internal_chat"],v=f.string().trim().min(1),Y=f.enum(A),T=f.enum(["communication","calendar_event"]),h=f.string().trim().min(1),J=f.object({schemaVersion:f.literal(w),routeRef:h,revision:f.number().int().positive(),scope:d,channel:v,destinationRef:h,connectionRef:h.optional(),semantic:T,deliveryMode:f.enum(["direct","durable_in_app"]),capabilityRefs:f.array(h),evidenceRefs:f.array(h).min(1),routeDigest:u}).strict().superRefine((e,t)=>{if(e.channel==="calendar"!==(e.semantic==="calendar_event"))t.addIssue({code:f.ZodIssueCode.custom,path:["semantic"],message:"calendar routes require calendar_event semantics and calendar_event routes require the calendar channel"});for(let n of["capabilityRefs","evidenceRefs"])if(new Set(e[n]).size!==e[n].length)t.addIssue({code:f.ZodIssueCode.custom,path:[n],message:`${n} must be unique`})});import{z as c}from"zod";var x="1.0.0",N="communication:preference-target:platform-default",ne=[["event","automation"],["feature","application"],["product"],["space","person"],["platform_default"]],oe=c.enum(["event","automation","feature","application","product","space","person","platform_default"]),g=c.string().trim().min(1);function p(e){return c.object({kind:c.literal(e),ref:g}).strict()}var y=c.discriminatedUnion("kind",[p("event"),p("automation"),p("feature"),p("application"),p("product"),p("space"),p("person"),c.object({kind:c.literal("platform_default"),ref:c.literal(N)}).strict()]),z=c.object({preferenceSetRef:g,revision:c.number().int().positive(),digest:u,target:y}).strict(),ie=c.object({schemaVersion:c.literal(x),resolutionRef:g,scope:d,subjectRef:g,evaluatedPreferenceSets:c.array(z).min(1),winningPreferenceSetRef:g,winningTarget:y,authority:c.literal("preference_only"),effectAuthority:c.literal("none"),resolvedAt:c.string().datetime({offset:!0}),evidenceRefs:c.array(g).min(1),resolutionDigest:u}).strict().superRefine((e,t)=>{let n=e.evaluatedPreferenceSets.map((s)=>s.preferenceSetRef);if(new Set(n).size!==n.length)R(t,"evaluatedPreferenceSets","evaluated sets must be unique");if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)R(t,"evidenceRefs","evidenceRefs must be unique");for(let s=1;s<e.evaluatedPreferenceSets.length;s+=1){let m=e.evaluatedPreferenceSets[s-1],P=e.evaluatedPreferenceSets[s];if(m&&P&&k(m.target.kind)>k(P.target.kind)){R(t,"evaluatedPreferenceSets","evaluated sets must follow the preference resolution hierarchy");break}}let i=e.evaluatedPreferenceSets.find((s)=>s.preferenceSetRef===e.winningPreferenceSetRef);if(!i)R(t,"winningPreferenceSetRef","winning preference set must have been evaluated");else if(i.preferenceSetRef!==e.evaluatedPreferenceSets[0]?.preferenceSetRef)R(t,"winningPreferenceSetRef","winning preference set must be the most specific evaluated set");else if(i.target.kind!==e.winningTarget.kind||i.target.ref!==e.winningTarget.ref)R(t,"winningTarget","winning target must match the winning preference set")});function k(e){switch(e){case"event":case"automation":return 0;case"feature":case"application":return 1;case"product":return 2;case"space":case"person":return 3;case"platform_default":return 4}}function R(e,t,n){e.addIssue({code:c.ZodIssueCode.custom,path:[t],message:n})}function re(e){let{preferenceResolution:t,preferenceSet:n}=e,i=[];if(t.subjectRef!==n.scope.subjectRef||t.winningPreferenceSetRef!==n.preferenceSetRef)i.push("Preference resolution does not match its subject and set");if(!C(t.scope,n.scope))i.push("Preference resolution scope does not match its preference set");let s=t.evaluatedPreferenceSets.find((m)=>m.preferenceSetRef===n.preferenceSetRef);if(!s||s.revision!==n.revision||s.digest!==n.preferenceSetDigest)i.push("Preference resolution binding is stale");if(t.winningTarget.kind!==n.target.kind||t.winningTarget.ref!==n.target.ref)i.push("Preference resolution target does not match its preference set");return i}var q="1.0.0",l=o.string().trim().min(1),D=o.string().datetime({offset:!0}),b=o.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),L=o.object({start:b,end:b,timezone:o.string().trim().min(1)}).strict(),O=o.object({enabled:o.boolean(),frequency:o.enum(["immediate","daily","weekly"]),deliveryTime:b.optional()}).strict().superRefine((e,t)=>{if(e.frequency==="immediate"&&e.deliveryTime)t.addIssue({code:o.ZodIssueCode.custom,path:["deliveryTime"],message:"immediate digest frequency cannot carry a delivery time"});if(e.enabled&&e.frequency!=="immediate"&&!e.deliveryTime)t.addIssue({code:o.ZodIssueCode.custom,path:["deliveryTime"],message:"enabled daily or weekly digest requires a delivery time"})}),B=o.object({routeRef:l,channel:v,enabled:o.boolean(),priority:o.number().int().positive(),consentRef:l.optional(),quietHours:L.optional(),digest:O.optional()}).strict(),M=o.object({enabled:o.boolean(),orderedRouteRefs:o.array(l),terminalRouteRef:l.optional()}).strict().superRefine((e,t)=>{if(new Set(e.orderedRouteRefs).size!==e.orderedRouteRefs.length)t.addIssue({code:o.ZodIssueCode.custom,path:["orderedRouteRefs"],message:"fallback routes must be unique"});if(e.enabled&&e.orderedRouteRefs.length===0)t.addIssue({code:o.ZodIssueCode.custom,path:["orderedRouteRefs"],message:"enabled fallback requires at least one route"})}),ue=o.object({schemaVersion:o.literal(q),preferenceSetRef:l,revision:o.number().int().positive(),scope:d,target:y,parentPreferenceSetRefs:o.array(l),authority:o.literal("preference_only"),globalEnabled:o.boolean(),routePreferences:o.array(B),fallback:M,updatedAt:D,evidenceRefs:o.array(l).min(1),preferenceSetDigest:u}).strict().superRefine((e,t)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)t.addIssue({code:o.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(new Set(e.parentPreferenceSetRefs).size!==e.parentPreferenceSetRefs.length)t.addIssue({code:o.ZodIssueCode.custom,path:["parentPreferenceSetRefs"],message:"parent preference sets must be unique"});if(e.parentPreferenceSetRefs.includes(e.preferenceSetRef))t.addIssue({code:o.ZodIssueCode.custom,path:["parentPreferenceSetRefs"],message:"a preference set cannot inherit from itself"});let n=e.routePreferences.map((m)=>m.routeRef);if(new Set(n).size!==n.length)t.addIssue({code:o.ZodIssueCode.custom,path:["routePreferences"],message:"route preferences must be unique"});let i=e.routePreferences.map((m)=>m.priority);if(new Set(i).size!==i.length)t.addIssue({code:o.ZodIssueCode.custom,path:["routePreferences"],message:"route preference priorities must be unique"});let s=new Set(n);for(let m of e.fallback.orderedRouteRefs)if(!s.has(m))t.addIssue({code:o.ZodIssueCode.custom,path:["fallback","orderedRouteRefs"],message:`fallback route ${m} has no route preference`});if(e.fallback.terminalRouteRef&&!s.has(e.fallback.terminalRouteRef))t.addIssue({code:o.ZodIssueCode.custom,path:["fallback","terminalRouteRef"],message:"terminal route has no route preference"});if(e.fallback.enabled&&e.fallback.terminalRouteRef&&!e.fallback.orderedRouteRefs.includes(e.fallback.terminalRouteRef))t.addIssue({code:o.ZodIssueCode.custom,path:["fallback","terminalRouteRef"],message:"terminal route must be part of the fallback order"})});export{q as COMMUNICATION_PREFERENCE_SET_SCHEMA_VERSION,O as CommunicationDigestPreferenceV1Schema,M as CommunicationFallbackPreferenceV1Schema,ue as CommunicationPreferenceSetV1Schema,L as CommunicationQuietHoursV1Schema,B as CommunicationRoutePreferenceV1Schema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as c}from"zod";import{z as o}from"zod";var h="1.0.0",y="1.0.0",b={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},t=o.string().trim().min(1),u=o.string().datetime({offset:!0}),m=o.string().regex(/^sha256:[a-f0-9]{64}$/),l=o.object({ref:t,digest:m}).strict(),a=l.extend({revision:o.number().int().positive()}).strict(),f=o.object({tenantRef:t,workspaceRef:t.optional(),spaceRef:t.optional(),subjectRef:t}).strict(),A=o.object({schemaVersion:o.literal(h),profileRef:t,revision:o.number().int().positive(),agentRef:t,applicationRef:t,scope:f,routeBindings:o.array(a),connectionRefs:o.array(t),preferenceSet:a,policyRefs:o.array(t).min(1),evidenceRefs:o.array(t).min(1),createdAt:u,updatedAt:u,profileDigest:m}).strict().superRefine((e,n)=>{for(let s of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[s]).size!==e[s].length)n.addIssue({code:o.ZodIssueCode.custom,path:[s],message:`${s} must be unique`});let i=e.routeBindings.map((s)=>s.ref);if(new Set(i).size!==i.length)n.addIssue({code:o.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),I=o.object({schemaVersion:o.literal(y),linkRef:t,profile:a,agentRef:t,applicationRef:t,scope:f,runRef:t.optional(),taskRef:t.optional(),helpRequestRef:t.optional(),approvalRequestRef:t.optional(),backgroundResultRef:t.optional(),canonicalConversation:l.optional(),session:a.optional(),correlationRef:t,evidenceRefs:o.array(t).min(1)}).strict().superRefine((e,n)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)n.addIssue({code:o.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)n.addIssue({code:o.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function d(e,n){return e.tenantRef===n.tenantRef&&e.workspaceRef===n.workspaceRef&&e.spaceRef===n.spaceRef&&e.subjectRef===n.subjectRef}function x(e){let n=[];for(let i of["agentRef","applicationRef"])if(e.profile[i]!==e.lifecycleLink[i])n.push(`Lifecycle ${i} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)n.push("Lifecycle profile binding does not match the agent profile");if(!d(e.profile.scope,e.lifecycleLink.scope))n.push("Lifecycle scope does not match the agent profile");return n}function k(e){let{intent:n,progress:i}=e,s=[];if(i.deliveryRef!==n.deliveryRef||i.intent.ref!==n.deliveryRef||i.intent.digest!==n.deliveryDigest)s.push("Progress delivery does not match the intent");if(!d(i.scope,n.scope))s.push("Progress scope does not match the intent");if(i.recipientRef!==n.recipientRefs[0])s.push("Progress recipient does not match the intent");let p=n.requestedRoutes.find((g)=>g.ref===i.route.ref);if(!p||p.revision!==i.route.revision||p.digest!==i.route.digest)s.push("Progress route was not requested by the intent");if(Date.parse(i.occurredAt)<Date.parse(n.createdAt)||Date.parse(i.occurredAt)>Date.parse(n.expiresAt))s.push("Progress occurred outside the intent validity window");return s}var R="1.0.0",C=["email","calendar","sms","slack","teams","discord","telegram","whatsapp","matrix","in_app","push","webhook","web_chat","internal_chat"],v=c.string().trim().min(1),N=c.enum(C),S=c.enum(["communication","calendar_event"]),r=c.string().trim().min(1),B=c.object({schemaVersion:c.literal(R),routeRef:r,revision:c.number().int().positive(),scope:f,channel:v,destinationRef:r,connectionRef:r.optional(),semantic:S,deliveryMode:c.enum(["direct","durable_in_app"]),capabilityRefs:c.array(r),evidenceRefs:c.array(r).min(1),routeDigest:m}).strict().superRefine((e,n)=>{if(e.channel==="calendar"!==(e.semantic==="calendar_event"))n.addIssue({code:c.ZodIssueCode.custom,path:["semantic"],message:"calendar routes require calendar_event semantics and calendar_event routes require the calendar channel"});for(let i of["capabilityRefs","evidenceRefs"])if(new Set(e[i]).size!==e[i].length)n.addIssue({code:c.ZodIssueCode.custom,path:[i],message:`${i} must be unique`})});export{R as COMMUNICATION_CHANNEL_ROUTING_SCHEMA_VERSION,C as COMMUNICATION_WELL_KNOWN_CHANNEL_KEYS,v as CommunicationChannelKeySchema,B as CommunicationDeliveryRouteV1Schema,S as CommunicationDeliverySemanticSchema,N as CommunicationWellKnownChannelKeySchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineCommand as s}from"@lssm/lib.contracts-spec";import{defineSchemaModel as l,ScalarTypeEnum as i}from"@lssm/lib.schema";import{defineEnum as n}from"@lssm/lib.schema";var a=n("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),d=n("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),y=n("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),m=n("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),f=n("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),c=n("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),g=n("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),o=n("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),O=n("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{defineSchemaModel as t,ScalarTypeEnum as e}from"@lssm/lib.schema";var A=t({name:"ChannelAccount",description:"A channel account belonging to a participant",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:a,isOptional:!1},externalId:{type:e.String_unsecure(),isOptional:!1},displayName:{type:e.String_unsecure(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},isPrimary:{type:e.Boolean(),isOptional:!1,defaultValue:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),p=t({name:"IdentityLink",description:"Proposed or confirmed relationship between participant identities",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},candidateParticipantId:{type:e.String_unsecure(),isOptional:!1},status:{type:c,isOptional:!1,defaultValue:"generated"},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),M=t({name:"CommunicationParticipant",description:"A person or system that participates in conversations",fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!0},email:{type:e.EmailAddress(),isOptional:!0},accounts:{type:A,isArray:!0,isOptional:!1},identityLinks:{type:p,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),b=t({name:"Attachment",description:"A file or media attachment on a message",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},mimeType:{type:e.String_unsecure(),isOptional:!0},sizeBytes:{type:e.Int_unsecure(),isOptional:!0},url:{type:e.URL(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0}}}),u=t({name:"ThreadLink",description:"Link between a thread and an external business object (V2: rich-reference objectRef replaces V1 objectType/objectId)",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},objectRef:{type:e.JSONObject(),isOptional:!1},relation:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),k=t({name:"MessageIntent",description:"Classified message or thread intent with confidence and evidence",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},category:{type:g,isOptional:!1},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},evidenceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),v=t({name:"CommunicationMessage",description:"A single message within a communication thread",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:a,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},externalMessageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},bodyNormalized:{type:e.String_unsecure(),isOptional:!0},status:{type:y,isOptional:!1,defaultValue:"received"},intent:{type:k,isOptional:!0},attachments:{type:b,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),C=t({name:"CommunicationFormIntake",description:"Declarative source reference for a communication message mapped into an entity-bound form intake result",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:a,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},entityKey:{type:e.String_unsecure(),isOptional:!1},projectionKind:{type:e.String_unsecure(),isOptional:!1},formKey:{type:e.String_unsecure(),isOptional:!0},formVersion:{type:e.String_unsecure(),isOptional:!0},completionProfileKey:{type:e.String_unsecure(),isOptional:!0},acceptedValues:{type:e.JSONObject(),isOptional:!1},completionDebt:{type:e.JSONObject(),isArray:!0,isOptional:!1},captureStatus:{type:e.String_unsecure(),isOptional:!1,defaultValue:"accepted"},completionStatus:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),D=t({name:"CommunicationThread",description:"A conversation thread spanning one or more channels",fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!0},status:{type:d,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:a,isArray:!0,isOptional:!1},links:{type:u,isArray:!0,isOptional:!0},assignedTo:{type:e.String_unsecure(),isOptional:!0},priority:{type:e.String_unsecure(),isOptional:!0},tags:{type:e.String_unsecure(),isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),S=t({name:"CommunicationAction",description:"Structured action extracted from a conversation",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},owner:{type:e.String_unsecure(),isOptional:!0},deadline:{type:e.DateTime(),isOptional:!0},blockers:{type:e.String_unsecure(),isArray:!0,isOptional:!0},sourceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},safetyMode:{type:o,isOptional:!1,defaultValue:"draft_only"}}}),E=t({name:"ReplyDraft",description:"An AI-generated or human-authored reply draft",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},status:{type:m,isOptional:!1,defaultValue:"drafted"},generatedBy:{type:e.String_unsecure(),isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},promptVersion:{type:e.String_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},reviewedAt:{type:e.DateTime(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),_=t({name:"HandoffPacket",description:"A structured handoff between owners, teams, or systems",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},status:{type:f,isOptional:!1,defaultValue:"created"},fromOwner:{type:e.String_unsecure(),isOptional:!1},toOwner:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!1},keyFacts:{type:e.String_unsecure(),isArray:!0,isOptional:!0},openQuestions:{type:e.String_unsecure(),isArray:!0,isOptional:!0},requiredActions:{type:S,isArray:!0,isOptional:!0},evidenceLinks:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),j=t({name:"CommunicationSummary",description:"AI-generated summary of a thread or message range",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},content:{type:e.String_unsecure(),isOptional:!1},facts:{type:e.JSONObject(),isArray:!0,isOptional:!0},actions:{type:S,isArray:!0,isOptional:!0},decisions:{type:e.JSONObject(),isArray:!0,isOptional:!0},risks:{type:e.JSONObject(),isArray:!0,isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1}}}),h=t({name:"AgentSuggestion",description:"An AI-generated suggestion attached to a thread or message",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},suggestionType:{type:e.String_unsecure(),isOptional:!1},content:{type:e.String_unsecure(),isOptional:!1},status:{type:c,isOptional:!1,defaultValue:"generated"},modelName:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}});var r=["platform.communication-os"],F=s({meta:{key:"communication.handoff.create",version:"1.0.0",stability:"experimental",owners:[...r],tags:["communication","handoff"],description:"Create a handoff packet for a thread",goal:"Transfer context safely between owners or systems",context:"Requires evidence links and does not close source thread automatically"},io:{input:l({name:"CreateHandoffInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},fromOwner:{type:i.String_unsecure(),isOptional:!1},toOwner:{type:i.String_unsecure(),isOptional:!1},reason:{type:i.String_unsecure(),isOptional:!0}}}),output:_},policy:{auth:"user"}}),H=s({meta:{key:"communication.threadLink.propose",version:"1.0.0",stability:"experimental",owners:[...r],tags:["communication","thread-link","propose"],description:"Propose a link between a thread and a business object",goal:"Let future vertical consumers bind domain objects without changing the core",context:"Draft-only operation; domain packs own object semantics"},io:{input:u,output:u},policy:{auth:"user"}}),J=s({meta:{key:"communication.identityLink.propose",version:"1.0.0",stability:"experimental",owners:[...r],tags:["communication","identity","propose"],description:"Propose a participant identity link",goal:"Resolve cross-channel identities without reckless auto-merge",context:"Draft-only operation; high-impact merges require human review"},io:{input:p,output:p},policy:{auth:"user"}}),q=s({meta:{key:"communication.escalation.request",version:"1.0.0",stability:"experimental",owners:[...r],tags:["communication","escalation"],description:"Request human escalation for a thread",goal:"Surface high-risk, blocked, or unresolved conversations to a human owner",context:"Policy-executable operation that emits escalation evidence"},io:{input:l({name:"EscalateToHumanInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},reason:{type:i.String_unsecure(),isOptional:!1},targetOwner:{type:i.String_unsecure(),isOptional:!0}}}),output:h},policy:{auth:"user"}}),B=s({meta:{key:"communication.feedback.record",version:"1.0.0",stability:"experimental",owners:[...r],tags:["communication","feedback"],description:"Record human feedback on a suggestion, draft, or extraction",goal:"Make AI correction signals auditable and replayable",context:"Used by review surfaces and future evaluation runs"},io:{input:l({name:"RecordHumanFeedbackInput",fields:{targetId:{type:i.String_unsecure(),isOptional:!1},targetType:{type:i.String_unsecure(),isOptional:!1},outcome:{type:O,isOptional:!1},notes:{type:i.String_unsecure(),isOptional:!0}}}),output:l({name:"RecordHumanFeedbackOutput",fields:{feedbackId:{type:i.String_unsecure(),isOptional:!1},safetyMode:{type:o,isOptional:!1}}})},policy:{auth:"user"}});export{F as CreateHandoffCommand,q as EscalateToHumanCommand,J as ProposeIdentityLinkCommand,H as ProposeThreadLinkCommand,B as RecordHumanFeedbackCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as s}from"zod";import{z as o}from"zod";var y="1.0.0",v="1.0.0",V={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},n=o.string().trim().min(1),l=o.string().datetime({offset:!0}),u=o.string().regex(/^sha256:[a-f0-9]{64}$/),g=o.object({ref:n,digest:u}).strict(),m=g.extend({revision:o.number().int().positive()}).strict(),h=o.object({tenantRef:n,workspaceRef:n.optional(),spaceRef:n.optional(),subjectRef:n}).strict(),x=o.object({schemaVersion:o.literal(y),profileRef:n,revision:o.number().int().positive(),agentRef:n,applicationRef:n,scope:h,routeBindings:o.array(m),connectionRefs:o.array(n),preferenceSet:m,policyRefs:o.array(n).min(1),evidenceRefs:o.array(n).min(1),createdAt:l,updatedAt:l,profileDigest:u}).strict().superRefine((e,t)=>{for(let r of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[r]).size!==e[r].length)t.addIssue({code:o.ZodIssueCode.custom,path:[r],message:`${r} must be unique`});let i=e.routeBindings.map((r)=>r.ref);if(new Set(i).size!==i.length)t.addIssue({code:o.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),I=o.object({schemaVersion:o.literal(v),linkRef:n,profile:m,agentRef:n,applicationRef:n,scope:h,runRef:n.optional(),taskRef:n.optional(),helpRequestRef:n.optional(),approvalRequestRef:n.optional(),backgroundResultRef:n.optional(),canonicalConversation:g.optional(),session:m.optional(),correlationRef:n,evidenceRefs:o.array(n).min(1)}).strict().superRefine((e,t)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)t.addIssue({code:o.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)t.addIssue({code:o.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function R(e,t){return e.tenantRef===t.tenantRef&&e.workspaceRef===t.workspaceRef&&e.spaceRef===t.spaceRef&&e.subjectRef===t.subjectRef}function b(e){let t=[];for(let i of["agentRef","applicationRef"])if(e.profile[i]!==e.lifecycleLink[i])t.push(`Lifecycle ${i} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)t.push("Lifecycle profile binding does not match the agent profile");if(!R(e.profile.scope,e.lifecycleLink.scope))t.push("Lifecycle scope does not match the agent profile");return t}function k(e){let{intent:t,progress:i}=e,r=[];if(i.deliveryRef!==t.deliveryRef||i.intent.ref!==t.deliveryRef||i.intent.digest!==t.deliveryDigest)r.push("Progress delivery does not match the intent");if(!R(i.scope,t.scope))r.push("Progress scope does not match the intent");if(i.recipientRef!==t.recipientRefs[0])r.push("Progress recipient does not match the intent");let c=t.requestedRoutes.find((p)=>p.ref===i.route.ref);if(!c||c.revision!==i.route.revision||c.digest!==i.route.digest)r.push("Progress route was not requested by the intent");if(Date.parse(i.occurredAt)<Date.parse(t.createdAt)||Date.parse(i.occurredAt)>Date.parse(t.expiresAt))r.push("Progress occurred outside the intent validity window");return r}async function C(e){let t=new TextEncoder().encode(f(e)),i=new Uint8Array(t.byteLength);i.set(t);let r=await crypto.subtle.digest("SHA-256",i.buffer),c=Array.from(new Uint8Array(r),(p)=>p.toString(16).padStart(2,"0")).join("");return u.parse(`sha256:${c}`)}function f(e){if(Array.isArray(e))return`[${e.map(f).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).sort(([t],[i])=>t.localeCompare(i)).map(([t,i])=>`${JSON.stringify(t)}:${f(i)}`).join(",")}}`;return JSON.stringify(e)}var P="communication.support.customer-live-chat.grant",D="communication.support.customer-live-chat.verify",E=["messages:list","messages:send","realtime:ticket"],a=s.string().trim().min(1).max(300),d=s.object({bindingRef:a,spaceRef:a,sessionRef:a,sessionRevision:s.number().int().positive(),caseRef:a,caseRevision:s.number().int().nonnegative(),conversationRef:a,roomRef:a,channel:s.enum(["messenger","portal"])}).strict(),G=d.extend({expiresAt:s.string().datetime({offset:!0}),evidenceRefs:s.array(a).min(1).max(20)}).strict().superRefine((e,t)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)t.addIssue({code:s.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"})}),L=d.omit({bindingRef:!0}).strict(),N=L.extend({conversationRevision:s.number().int().positive(),evidenceRef:a,verifiedAt:s.string().datetime({offset:!0})}).strict(),S=s.object({tenantId:a,workspaceId:a,spaceId:a}).strict(),z=s.object({grantRef:a,accessToken:s.string().min(16).max(8192),realtimeTicket:s.string().min(16).max(8192),principalRef:a,scope:S,binding:d,inputDigest:s.string().regex(/^sha256:[a-f0-9]{64}$/),expiresAt:s.string().datetime({offset:!0}),capabilities:s.tuple([s.literal("messages:list"),s.literal("messages:send"),s.literal("realtime:ticket")])}).strict();function M(e){return C(e)}function w(e){return C(e)}export{E as COMMUNICATION_CUSTOMER_LIVE_CHAT_CAPABILITIES,P as COMMUNICATION_CUSTOMER_LIVE_CHAT_GRANT_CAPABILITY,D as COMMUNICATION_CUSTOMER_LIVE_CHAT_VERIFY_CAPABILITY,d as CommunicationCustomerLiveChatBindingSchema,G as CommunicationCustomerLiveChatGrantRequestSchema,z as CommunicationCustomerLiveChatGrantResponseSchema,S as CommunicationCustomerLiveChatGrantScopeSchema,L as CommunicationCustomerLiveChatVerificationRequestSchema,N as CommunicationCustomerLiveChatVerificationResponseSchema,M as digestCommunicationCustomerLiveChatGrantInput,w as digestCommunicationCustomerLiveChatVerificationInput};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as a}from"zod";import{z as s}from"zod";var S="1.0.0",V="1.0.0",x={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},o=s.string().trim().min(1),v=s.string().datetime({offset:!0}),p=s.string().regex(/^sha256:[a-f0-9]{64}$/),h=s.object({ref:o,digest:p}).strict(),u=h.extend({revision:s.number().int().positive()}).strict(),f=s.object({tenantRef:o,workspaceRef:o.optional(),spaceRef:o.optional(),subjectRef:o}).strict(),L=s.object({schemaVersion:s.literal(S),profileRef:o,revision:s.number().int().positive(),agentRef:o,applicationRef:o,scope:f,routeBindings:s.array(u),connectionRefs:s.array(o),preferenceSet:u,policyRefs:s.array(o).min(1),evidenceRefs:s.array(o).min(1),createdAt:v,updatedAt:v,profileDigest:p}).strict().superRefine((e,i)=>{for(let n of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[n]).size!==e[n].length)i.addIssue({code:s.ZodIssueCode.custom,path:[n],message:`${n} must be unique`});let t=e.routeBindings.map((n)=>n.ref);if(new Set(t).size!==t.length)i.addIssue({code:s.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),w=s.object({schemaVersion:s.literal(V),linkRef:o,profile:u,agentRef:o,applicationRef:o,scope:f,runRef:o.optional(),taskRef:o.optional(),helpRequestRef:o.optional(),approvalRequestRef:o.optional(),backgroundResultRef:o.optional(),canonicalConversation:h.optional(),session:u.optional(),correlationRef:o,evidenceRefs:s.array(o).min(1)}).strict().superRefine((e,i)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)i.addIssue({code:s.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)i.addIssue({code:s.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function d(e,i){return e.tenantRef===i.tenantRef&&e.workspaceRef===i.workspaceRef&&e.spaceRef===i.spaceRef&&e.subjectRef===i.subjectRef}function B(e){let i=[];for(let t of["agentRef","applicationRef"])if(e.profile[t]!==e.lifecycleLink[t])i.push(`Lifecycle ${t} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)i.push("Lifecycle profile binding does not match the agent profile");if(!d(e.profile.scope,e.lifecycleLink.scope))i.push("Lifecycle scope does not match the agent profile");return i}function N(e){let{intent:i,progress:t}=e,n=[];if(t.deliveryRef!==i.deliveryRef||t.intent.ref!==i.deliveryRef||t.intent.digest!==i.deliveryDigest)n.push("Progress delivery does not match the intent");if(!d(t.scope,i.scope))n.push("Progress scope does not match the intent");if(t.recipientRef!==i.recipientRefs[0])n.push("Progress recipient does not match the intent");let r=i.requestedRoutes.find((c)=>c.ref===t.route.ref);if(!r||r.revision!==t.route.revision||r.digest!==t.route.digest)n.push("Progress route was not requested by the intent");if(Date.parse(t.occurredAt)<Date.parse(i.createdAt)||Date.parse(t.occurredAt)>Date.parse(i.expiresAt))n.push("Progress occurred outside the intent validity window");return n}import{z as m}from"zod";var D="1.0.0",I=["email","calendar","sms","slack","teams","discord","telegram","whatsapp","matrix","in_app","push","webhook","web_chat","internal_chat"],g=m.string().trim().min(1),M=m.enum(I),C=m.enum(["communication","calendar_event"]),y=m.string().trim().min(1),P=m.object({schemaVersion:m.literal(D),routeRef:y,revision:m.number().int().positive(),scope:f,channel:g,destinationRef:y,connectionRef:y.optional(),semantic:C,deliveryMode:m.enum(["direct","durable_in_app"]),capabilityRefs:m.array(y),evidenceRefs:m.array(y).min(1),routeDigest:p}).strict().superRefine((e,i)=>{if(e.channel==="calendar"!==(e.semantic==="calendar_event"))i.addIssue({code:m.ZodIssueCode.custom,path:["semantic"],message:"calendar routes require calendar_event semantics and calendar_event routes require the calendar channel"});for(let t of["capabilityRefs","evidenceRefs"])if(new Set(e[t]).size!==e[t].length)i.addIssue({code:m.ZodIssueCode.custom,path:[t],message:`${t} must be unique`})});var A="1.0.0",l=a.string().trim().min(1),b=a.string().datetime({offset:!0}),k=a.enum(["connection","consent","policy","grant","quiet_hours","rate_limit","provider_health","whatsapp_service_window","whatsapp_template","telegram_first_contact","installation_membership","sms_opt_out","email_suppression","push_device","calendar_permission","cost"]),_=a.object({checkRef:l,category:k,status:a.enum(["passed","failed","unknown","not_applicable"]),reasonCodes:a.array(l).min(1),evidenceRefs:a.array(l).min(1)}).strict().superRefine((e,i)=>{for(let t of["reasonCodes","evidenceRefs"])if(new Set(e[t]).size!==e[t].length)i.addIssue({code:a.ZodIssueCode.custom,path:[t],message:`${t} must be unique`})}),H=a.object({schemaVersion:a.literal(A),eligibilityRef:l,eligibilityDigest:p,deliveryRef:l,intent:h,scope:f,recipientRef:l,route:u,channel:g,semantic:C,checks:a.array(_).min(1),result:a.enum(["eligible","ineligible","unknown"]),effectAuthority:a.literal("none"),evaluatedAt:b,expiresAt:b,evidenceRefs:a.array(l).min(1)}).strict().superRefine((e,i)=>{let t=e.checks.map((c)=>c.checkRef),n=e.checks.map((c)=>c.category);for(let[c,R]of[["checks",t],["checks",n],["evidenceRefs",e.evidenceRefs]])if(new Set(R).size!==R.length)i.addIssue({code:a.ZodIssueCode.custom,path:[c],message:`${c} must be unique`});let r=e.checks.some((c)=>c.status==="failed")?"ineligible":e.checks.some((c)=>c.status==="unknown")?"unknown":"eligible";if(e.result!==r)i.addIssue({code:a.ZodIssueCode.custom,path:["result"],message:"result must be derived from all eligibility checks"});if(e.checks.every((c)=>c.status==="not_applicable"))i.addIssue({code:a.ZodIssueCode.custom,path:["checks"],message:"at least one eligibility check must be applicable"});if(Date.parse(e.expiresAt)<=Date.parse(e.evaluatedAt))i.addIssue({code:a.ZodIssueCode.custom,path:["expiresAt"],message:"expiresAt must be later than evaluatedAt"})});function U(e){let{decision:i,intent:t,route:n}=e,r=[];if(i.deliveryRef!==t.deliveryRef||i.intent.ref!==t.deliveryRef||i.intent.digest!==t.deliveryDigest)r.push("Eligibility decision does not bind the delivery intent");if(i.route.ref!==n.routeRef||i.route.revision!==n.revision||i.route.digest!==n.routeDigest||!t.requestedRoutes.some((c)=>c.ref===n.routeRef&&c.revision===n.revision&&c.digest===n.routeDigest))r.push("Eligibility decision does not bind a requested route");if(!d(i.scope,t.scope)||!d(i.scope,n.scope))r.push("Eligibility scope does not match the intent and route");if(i.recipientRef!==t.recipientRefs[0]||i.channel!==n.channel||i.semantic!==n.semantic||i.semantic!==t.semantic)r.push("Eligibility recipient or route semantics do not match");if(Date.parse(i.evaluatedAt)<Date.parse(t.createdAt)||Date.parse(i.expiresAt)>Date.parse(t.expiresAt))r.push("Eligibility decision is outside the intent validity window");return r}export{A as COMMUNICATION_DELIVERY_ELIGIBILITY_SCHEMA_VERSION,k as CommunicationDeliveryEligibilityCategoryV1Schema,_ as CommunicationDeliveryEligibilityCheckV1Schema,H as CommunicationDeliveryEligibilityDecisionV1Schema,U as validateCommunicationDeliveryEligibilityBindingV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function s(l){let t=[],o=new Map(l.eligibilityDecisions.map((i)=>[i.eligibilityRef,i]));for(let i of l.decision.consideredRoutes){let e=o.get(i.eligibilityDecision.ref);if(!e||e.eligibilityDigest!==i.eligibilityDecision.digest||e.result!==i.eligibility)t.push(`Fallback eligibility result is stale: ${i.route.ref}`)}return t}export{s as validateCommunicationFallbackEligibilityResultsV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as c}from"zod";var q="1.0.0",L="1.0.0",G={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},s=c.string().trim().min(1),E=c.string().datetime({offset:!0}),b=c.string().regex(/^sha256:[a-f0-9]{64}$/),x=c.object({ref:s,digest:b}).strict(),v=x.extend({revision:c.number().int().positive()}).strict(),S=c.object({tenantRef:s,workspaceRef:s.optional(),spaceRef:s.optional(),subjectRef:s}).strict(),H=c.object({schemaVersion:c.literal(q),profileRef:s,revision:c.number().int().positive(),agentRef:s,applicationRef:s,scope:S,routeBindings:c.array(v),connectionRefs:c.array(s),preferenceSet:v,policyRefs:c.array(s).min(1),evidenceRefs:c.array(s).min(1),createdAt:E,updatedAt:E,profileDigest:b}).strict().superRefine((i,e)=>{for(let n of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(i[n]).size!==i[n].length)e.addIssue({code:c.ZodIssueCode.custom,path:[n],message:`${n} must be unique`});let t=i.routeBindings.map((n)=>n.ref);if(new Set(t).size!==t.length)e.addIssue({code:c.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),Y=c.object({schemaVersion:c.literal(L),linkRef:s,profile:v,agentRef:s,applicationRef:s,scope:S,runRef:s.optional(),taskRef:s.optional(),helpRequestRef:s.optional(),approvalRequestRef:s.optional(),backgroundResultRef:s.optional(),canonicalConversation:x.optional(),session:v.optional(),correlationRef:s,evidenceRefs:c.array(s).min(1)}).strict().superRefine((i,e)=>{if(new Set(i.evidenceRefs).size!==i.evidenceRefs.length)e.addIssue({code:c.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!i.runRef&&!i.taskRef&&!i.helpRequestRef&&!i.approvalRequestRef&&!i.backgroundResultRef)e.addIssue({code:c.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function m(i,e){return i.tenantRef===e.tenantRef&&i.workspaceRef===e.workspaceRef&&i.spaceRef===e.spaceRef&&i.subjectRef===e.subjectRef}function J(i){let e=[];for(let t of["agentRef","applicationRef"])if(i.profile[t]!==i.lifecycleLink[t])e.push(`Lifecycle ${t} does not match the agent profile`);if(i.lifecycleLink.profile.ref!==i.profile.profileRef||i.lifecycleLink.profile.revision!==i.profile.revision||i.lifecycleLink.profile.digest!==i.profile.profileDigest)e.push("Lifecycle profile binding does not match the agent profile");if(!m(i.profile.scope,i.lifecycleLink.scope))e.push("Lifecycle scope does not match the agent profile");return e}function A(i){let{intent:e,progress:t}=i,n=[];if(t.deliveryRef!==e.deliveryRef||t.intent.ref!==e.deliveryRef||t.intent.digest!==e.deliveryDigest)n.push("Progress delivery does not match the intent");if(!m(t.scope,e.scope))n.push("Progress scope does not match the intent");if(t.recipientRef!==e.recipientRefs[0])n.push("Progress recipient does not match the intent");let o=e.requestedRoutes.find((f)=>f.ref===t.route.ref);if(!o||o.revision!==t.route.revision||o.digest!==t.route.digest)n.push("Progress route was not requested by the intent");if(Date.parse(t.occurredAt)<Date.parse(e.createdAt)||Date.parse(t.occurredAt)>Date.parse(e.expiresAt))n.push("Progress occurred outside the intent validity window");return n}function I(i){let e=[],t=new Map(i.eligibilityDecisions.map((n)=>[n.eligibilityRef,n]));for(let n of i.decision.consideredRoutes){let o=t.get(n.eligibilityDecision.ref);if(!o||o.eligibilityDigest!==n.eligibilityDecision.digest||o.result!==n.eligibility)e.push(`Fallback eligibility result is stale: ${n.route.ref}`)}return e}import{z as a}from"zod";var N="1.0.0",z="communication:preference-target:platform-default",ie=[["event","automation"],["feature","application"],["product"],["space","person"],["platform_default"]],te=a.enum(["event","automation","feature","application","product","space","person","platform_default"]),y=a.string().trim().min(1);function g(i){return a.object({kind:a.literal(i),ref:y}).strict()}var F=a.discriminatedUnion("kind",[g("event"),g("automation"),g("feature"),g("application"),g("product"),g("space"),g("person"),a.object({kind:a.literal("platform_default"),ref:a.literal(z)}).strict()]),M=a.object({preferenceSetRef:y,revision:a.number().int().positive(),digest:b,target:F}).strict(),ne=a.object({schemaVersion:a.literal(N),resolutionRef:y,scope:S,subjectRef:y,evaluatedPreferenceSets:a.array(M).min(1),winningPreferenceSetRef:y,winningTarget:F,authority:a.literal("preference_only"),effectAuthority:a.literal("none"),resolvedAt:a.string().datetime({offset:!0}),evidenceRefs:a.array(y).min(1),resolutionDigest:b}).strict().superRefine((i,e)=>{let t=i.evaluatedPreferenceSets.map((o)=>o.preferenceSetRef);if(new Set(t).size!==t.length)R(e,"evaluatedPreferenceSets","evaluated sets must be unique");if(new Set(i.evidenceRefs).size!==i.evidenceRefs.length)R(e,"evidenceRefs","evidenceRefs must be unique");for(let o=1;o<i.evaluatedPreferenceSets.length;o+=1){let f=i.evaluatedPreferenceSets[o-1],r=i.evaluatedPreferenceSets[o];if(f&&r&&_(f.target.kind)>_(r.target.kind)){R(e,"evaluatedPreferenceSets","evaluated sets must follow the preference resolution hierarchy");break}}let n=i.evaluatedPreferenceSets.find((o)=>o.preferenceSetRef===i.winningPreferenceSetRef);if(!n)R(e,"winningPreferenceSetRef","winning preference set must have been evaluated");else if(n.preferenceSetRef!==i.evaluatedPreferenceSets[0]?.preferenceSetRef)R(e,"winningPreferenceSetRef","winning preference set must be the most specific evaluated set");else if(n.target.kind!==i.winningTarget.kind||n.target.ref!==i.winningTarget.ref)R(e,"winningTarget","winning target must match the winning preference set")});function _(i){switch(i){case"event":case"automation":return 0;case"feature":case"application":return 1;case"product":return 2;case"space":case"person":return 3;case"platform_default":return 4}}function R(i,e,t){i.addIssue({code:a.ZodIssueCode.custom,path:[e],message:t})}function w(i){let{preferenceResolution:e,preferenceSet:t}=i,n=[];if(e.subjectRef!==t.scope.subjectRef||e.winningPreferenceSetRef!==t.preferenceSetRef)n.push("Preference resolution does not match its subject and set");if(!m(e.scope,t.scope))n.push("Preference resolution scope does not match its preference set");let o=e.evaluatedPreferenceSets.find((f)=>f.preferenceSetRef===t.preferenceSetRef);if(!o||o.revision!==t.revision||o.digest!==t.preferenceSetDigest)n.push("Preference resolution binding is stale");if(e.winningTarget.kind!==t.target.kind||e.winningTarget.ref!==t.target.ref)n.push("Preference resolution target does not match its preference set");return n}function j(i){let{decision:e,priorProgress:t}=i,n=[];if(e.priorOutcome!=="not_attempted"!==Boolean(t))n.push("Fallback prior outcome and progress presence do not match");if(!t)return n;if(e.priorAttemptRef!==t.attemptRef)n.push("Fallback prior attempt does not match progress");if(e.priorProgress?.ref!==t.progressRef||e.priorProgress?.digest!==t.progressDigest)n.push("Fallback prior progress binding does not match");let o=e.priorOutcome==="definitive_failure"?"failed":"ambiguous";if(t.status!==o)n.push("Fallback prior outcome does not match progress status");if((e.priorOutcome==="ambiguous"||e.priorOutcome==="reconciled_failure")&&(t.reconciliation?.ref!==e.reconciliation.binding?.ref||t.reconciliation?.digest!==e.reconciliation.binding?.digest))n.push("Fallback reconciliation does not match ambiguous progress");return n}function U(i){let e=[],t=new Map(i.decision.eligibilityDecisions.map((n)=>[n.ref,n.digest]));if(t.size!==i.decision.consideredRoutes.length||i.decision.consideredRoutes.some((n)=>t.get(n.eligibilityDecision.ref)!==n.eligibilityDecision.digest))e.push("Fallback eligibility evidence must exactly match considerations");for(let[n,o]of i.decision.consideredRoutes.entries())if(t.get(o.eligibilityDecision.ref)!==o.eligibilityDecision.digest)e.push(`Fallback route ${o.route.ref} lacks eligibility evidence`);else if(i.orderedRouteRefs[n]!==o.route.ref){e.push("Fallback considerations do not follow the configured order");break}return e}function ae(i){let{decision:e,intent:t,priorProgress:n,preferenceResolution:o,preferenceSet:f}=i,r=[];if(e.deliveryRef!==t.deliveryRef||e.intent.ref!==t.deliveryRef||e.intent.digest!==t.deliveryDigest)r.push("Fallback delivery does not match the intent");if(!m(e.scope,t.scope))r.push("Fallback scope does not match the intent");if(e.preferenceSet.ref!==t.preferenceSet.ref||e.preferenceSet.revision!==t.preferenceSet.revision||e.preferenceSet.digest!==t.preferenceSet.digest||e.preferenceSet.ref!==f.preferenceSetRef||e.preferenceSet.revision!==f.revision||e.preferenceSet.digest!==f.preferenceSetDigest)r.push("Fallback preferences do not match the intent and resolution");if(r.push(...w({preferenceResolution:o,preferenceSet:f})),i.eligibilityDecisions)r.push(...I({decision:e,eligibilityDecisions:i.eligibilityDecisions}));if(t.preferenceResolution.ref!==o.resolutionRef||t.preferenceResolution.digest!==o.resolutionDigest)r.push("Fallback preference resolution does not match the intent");let h=new Map(i.routes.map((l)=>[l.routeRef,l]));for(let l of e.consideredRoutes){let d=h.get(l.route.ref);if(!d||l.route.revision!==d.revision||l.route.digest!==d.routeDigest||!m(e.scope,d.scope))r.push(`Fallback route binding is stale: ${l.route.ref}`)}if(!m(e.scope,f.scope))r.push("Fallback scope does not match the preference set");if(r.push(...j({decision:e,priorProgress:n}),...U({decision:e,orderedRouteRefs:t.requestedRoutes.map((l)=>l.ref)})),n)r.push(...A({intent:t,progress:n}));if(e.recipientRef!==t.recipientRefs[0])r.push("Fallback recipient does not match the intent");if(K(i,r),e.policyRefs.some((l)=>!t.policyRefs.includes(l)))r.push("Fallback policy is not bound to the delivery intent");return r}function K(i,e){let{decision:t,intent:n,preferenceSet:o,priorProgress:f}=i;if(t.state!=="selected"||!t.selectedRoute)return;let r=t.selectedRoute.ref,h=n.requestedRoutes.map((u)=>u.ref),l=h.indexOf(r),d=o.routePreferences.find((u)=>u.routeRef===r),p=i.routes.find((u)=>u.routeRef===r),C=n.requestedRoutes.find((u)=>u.ref===r),P=f?h.indexOf(f.route.ref):-1,T=t.consideredRoutes.find((u)=>{let D=i.routes.find((V)=>V.routeRef===u.route.ref),B=o.routePreferences.find((V)=>V.routeRef===u.route.ref),O=n.noticeClass==="mandatory_notice"&&D?.channel==="in_app"&&D.deliveryMode==="durable_in_app";return u.eligibility==="eligible"&&h.indexOf(u.route.ref)>P&&(o.globalEnabled&&B?.enabled||O)}),k=n.noticeClass==="mandatory_notice"&&p?.channel==="in_app"&&p?.deliveryMode==="durable_in_app";if(!o.globalEnabled&&!k||!o.fallback.enabled||l<0||!o.fallback.orderedRouteRefs.includes(r)||!C||!d?.enabled&&!k||!p||p?.channel!==d?.channel||p.semantic!==n.semantic)e.push("Selected fallback route is not requested and eligible by configuration");if(t.selectedRoute.revision!==p?.revision||t.selectedRoute.digest!==p?.routeDigest||C?.revision!==p?.revision||C?.digest!==p?.routeDigest)e.push("Selected fallback route binding is stale");if(d?.consentRef&&!n.consentRefs.includes(d.consentRef))e.push("Selected fallback route lacks required consent");if(T?.route.ref!==r||t.consideredRoutes.length!==l+1)e.push("Selected fallback route is not the first eligible ordered route");if(f&&P>=l)e.push("Selected fallback route does not follow the prior attempt")}export{ae as validateCommunicationFallbackBindingV1,U as validateCommunicationFallbackConsiderationsV1,j as validateCommunicationFallbackPriorOutcomeBindingV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as l}from"zod";import{z as a}from"zod";var j="1.0.0",U="1.0.0",ee={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},c=a.string().trim().min(1),I=a.string().datetime({offset:!0}),h=a.string().regex(/^sha256:[a-f0-9]{64}$/),y=a.object({ref:c,digest:h}).strict(),R=y.extend({revision:a.number().int().positive()}).strict(),C=a.object({tenantRef:c,workspaceRef:c.optional(),spaceRef:c.optional(),subjectRef:c}).strict(),ie=a.object({schemaVersion:a.literal(j),profileRef:c,revision:a.number().int().positive(),agentRef:c,applicationRef:c,scope:C,routeBindings:a.array(R),connectionRefs:a.array(c),preferenceSet:R,policyRefs:a.array(c).min(1),evidenceRefs:a.array(c).min(1),createdAt:I,updatedAt:I,profileDigest:h}).strict().superRefine((e,i)=>{for(let n of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[n]).size!==e[n].length)i.addIssue({code:a.ZodIssueCode.custom,path:[n],message:`${n} must be unique`});let t=e.routeBindings.map((n)=>n.ref);if(new Set(t).size!==t.length)i.addIssue({code:a.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),te=a.object({schemaVersion:a.literal(U),linkRef:c,profile:R,agentRef:c,applicationRef:c,scope:C,runRef:c.optional(),taskRef:c.optional(),helpRequestRef:c.optional(),approvalRequestRef:c.optional(),backgroundResultRef:c.optional(),canonicalConversation:y.optional(),session:R.optional(),correlationRef:c,evidenceRefs:a.array(c).min(1)}).strict().superRefine((e,i)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)i.addIssue({code:a.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)i.addIssue({code:a.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function b(e,i){return e.tenantRef===i.tenantRef&&e.workspaceRef===i.workspaceRef&&e.spaceRef===i.spaceRef&&e.subjectRef===i.subjectRef}function ne(e){let i=[];for(let t of["agentRef","applicationRef"])if(e.profile[t]!==e.lifecycleLink[t])i.push(`Lifecycle ${t} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)i.push("Lifecycle profile binding does not match the agent profile");if(!b(e.profile.scope,e.lifecycleLink.scope))i.push("Lifecycle scope does not match the agent profile");return i}function q(e){let{intent:i,progress:t}=e,n=[];if(t.deliveryRef!==i.deliveryRef||t.intent.ref!==i.deliveryRef||t.intent.digest!==i.deliveryDigest)n.push("Progress delivery does not match the intent");if(!b(t.scope,i.scope))n.push("Progress scope does not match the intent");if(t.recipientRef!==i.recipientRefs[0])n.push("Progress recipient does not match the intent");let o=i.requestedRoutes.find((s)=>s.ref===t.route.ref);if(!o||o.revision!==t.route.revision||o.digest!==t.route.digest)n.push("Progress route was not requested by the intent");if(Date.parse(t.occurredAt)<Date.parse(i.createdAt)||Date.parse(t.occurredAt)>Date.parse(i.expiresAt))n.push("Progress occurred outside the intent validity window");return n}function x(e){let i=[],t=new Map(e.eligibilityDecisions.map((n)=>[n.eligibilityRef,n]));for(let n of e.decision.consideredRoutes){let o=t.get(n.eligibilityDecision.ref);if(!o||o.eligibilityDigest!==n.eligibilityDecision.digest||o.result!==n.eligibility)i.push(`Fallback eligibility result is stale: ${n.route.ref}`)}return i}import{z as f}from"zod";var K="1.0.0",Z="communication:preference-target:platform-default",ae=[["event","automation"],["feature","application"],["product"],["space","person"],["platform_default"]],le=f.enum(["event","automation","feature","application","product","space","person","platform_default"]),V=f.string().trim().min(1);function v(e){return f.object({kind:f.literal(e),ref:V}).strict()}var w=f.discriminatedUnion("kind",[v("event"),v("automation"),v("feature"),v("application"),v("product"),v("space"),v("person"),f.object({kind:f.literal("platform_default"),ref:f.literal(Z)}).strict()]),H=f.object({preferenceSetRef:V,revision:f.number().int().positive(),digest:h,target:w}).strict(),fe=f.object({schemaVersion:f.literal(K),resolutionRef:V,scope:C,subjectRef:V,evaluatedPreferenceSets:f.array(H).min(1),winningPreferenceSetRef:V,winningTarget:w,authority:f.literal("preference_only"),effectAuthority:f.literal("none"),resolvedAt:f.string().datetime({offset:!0}),evidenceRefs:f.array(V).min(1),resolutionDigest:h}).strict().superRefine((e,i)=>{let t=e.evaluatedPreferenceSets.map((o)=>o.preferenceSetRef);if(new Set(t).size!==t.length)S(i,"evaluatedPreferenceSets","evaluated sets must be unique");if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)S(i,"evidenceRefs","evidenceRefs must be unique");for(let o=1;o<e.evaluatedPreferenceSets.length;o+=1){let s=e.evaluatedPreferenceSets[o-1],r=e.evaluatedPreferenceSets[o];if(s&&r&&O(s.target.kind)>O(r.target.kind)){S(i,"evaluatedPreferenceSets","evaluated sets must follow the preference resolution hierarchy");break}}let n=e.evaluatedPreferenceSets.find((o)=>o.preferenceSetRef===e.winningPreferenceSetRef);if(!n)S(i,"winningPreferenceSetRef","winning preference set must have been evaluated");else if(n.preferenceSetRef!==e.evaluatedPreferenceSets[0]?.preferenceSetRef)S(i,"winningPreferenceSetRef","winning preference set must be the most specific evaluated set");else if(n.target.kind!==e.winningTarget.kind||n.target.ref!==e.winningTarget.ref)S(i,"winningTarget","winning target must match the winning preference set")});function O(e){switch(e){case"event":case"automation":return 0;case"feature":case"application":return 1;case"product":return 2;case"space":case"person":return 3;case"platform_default":return 4}}function S(e,i,t){e.addIssue({code:f.ZodIssueCode.custom,path:[i],message:t})}function B(e){let{preferenceResolution:i,preferenceSet:t}=e,n=[];if(i.subjectRef!==t.scope.subjectRef||i.winningPreferenceSetRef!==t.preferenceSetRef)n.push("Preference resolution does not match its subject and set");if(!b(i.scope,t.scope))n.push("Preference resolution scope does not match its preference set");let o=i.evaluatedPreferenceSets.find((s)=>s.preferenceSetRef===t.preferenceSetRef);if(!o||o.revision!==t.revision||o.digest!==t.preferenceSetDigest)n.push("Preference resolution binding is stale");if(i.winningTarget.kind!==t.target.kind||i.winningTarget.ref!==t.target.ref)n.push("Preference resolution target does not match its preference set");return n}function T(e){let{decision:i,priorProgress:t}=e,n=[];if(i.priorOutcome!=="not_attempted"!==Boolean(t))n.push("Fallback prior outcome and progress presence do not match");if(!t)return n;if(i.priorAttemptRef!==t.attemptRef)n.push("Fallback prior attempt does not match progress");if(i.priorProgress?.ref!==t.progressRef||i.priorProgress?.digest!==t.progressDigest)n.push("Fallback prior progress binding does not match");let o=i.priorOutcome==="definitive_failure"?"failed":"ambiguous";if(t.status!==o)n.push("Fallback prior outcome does not match progress status");if((i.priorOutcome==="ambiguous"||i.priorOutcome==="reconciled_failure")&&(t.reconciliation?.ref!==i.reconciliation.binding?.ref||t.reconciliation?.digest!==i.reconciliation.binding?.digest))n.push("Fallback reconciliation does not match ambiguous progress");return n}function z(e){let i=[],t=new Map(e.decision.eligibilityDecisions.map((n)=>[n.ref,n.digest]));if(t.size!==e.decision.consideredRoutes.length||e.decision.consideredRoutes.some((n)=>t.get(n.eligibilityDecision.ref)!==n.eligibilityDecision.digest))i.push("Fallback eligibility evidence must exactly match considerations");for(let[n,o]of e.decision.consideredRoutes.entries())if(t.get(o.eligibilityDecision.ref)!==o.eligibilityDecision.digest)i.push(`Fallback route ${o.route.ref} lacks eligibility evidence`);else if(e.orderedRouteRefs[n]!==o.route.ref){i.push("Fallback considerations do not follow the configured order");break}return i}function G(e){let{decision:i,intent:t,priorProgress:n,preferenceResolution:o,preferenceSet:s}=e,r=[];if(i.deliveryRef!==t.deliveryRef||i.intent.ref!==t.deliveryRef||i.intent.digest!==t.deliveryDigest)r.push("Fallback delivery does not match the intent");if(!b(i.scope,t.scope))r.push("Fallback scope does not match the intent");if(i.preferenceSet.ref!==t.preferenceSet.ref||i.preferenceSet.revision!==t.preferenceSet.revision||i.preferenceSet.digest!==t.preferenceSet.digest||i.preferenceSet.ref!==s.preferenceSetRef||i.preferenceSet.revision!==s.revision||i.preferenceSet.digest!==s.preferenceSetDigest)r.push("Fallback preferences do not match the intent and resolution");if(r.push(...B({preferenceResolution:o,preferenceSet:s})),e.eligibilityDecisions)r.push(...x({decision:i,eligibilityDecisions:e.eligibilityDecisions}));if(t.preferenceResolution.ref!==o.resolutionRef||t.preferenceResolution.digest!==o.resolutionDigest)r.push("Fallback preference resolution does not match the intent");let P=new Map(e.routes.map((u)=>[u.routeRef,u]));for(let u of i.consideredRoutes){let p=P.get(u.route.ref);if(!p||u.route.revision!==p.revision||u.route.digest!==p.routeDigest||!b(i.scope,p.scope))r.push(`Fallback route binding is stale: ${u.route.ref}`)}if(!b(i.scope,s.scope))r.push("Fallback scope does not match the preference set");if(r.push(...T({decision:i,priorProgress:n}),...z({decision:i,orderedRouteRefs:t.requestedRoutes.map((u)=>u.ref)})),n)r.push(...q({intent:t,progress:n}));if(i.recipientRef!==t.recipientRefs[0])r.push("Fallback recipient does not match the intent");if(Y(e,r),i.policyRefs.some((u)=>!t.policyRefs.includes(u)))r.push("Fallback policy is not bound to the delivery intent");return r}function Y(e,i){let{decision:t,intent:n,preferenceSet:o,priorProgress:s}=e;if(t.state!=="selected"||!t.selectedRoute)return;let r=t.selectedRoute.ref,P=n.requestedRoutes.map((m)=>m.ref),u=P.indexOf(r),p=o.routePreferences.find((m)=>m.routeRef===r),g=e.routes.find((m)=>m.routeRef===r),D=n.requestedRoutes.find((m)=>m.ref===r),A=s?P.indexOf(s.route.ref):-1,L=t.consideredRoutes.find((m)=>{let F=e.routes.find((_)=>_.routeRef===m.route.ref),N=o.routePreferences.find((_)=>_.routeRef===m.route.ref),M=n.noticeClass==="mandatory_notice"&&F?.channel==="in_app"&&F.deliveryMode==="durable_in_app";return m.eligibility==="eligible"&&P.indexOf(m.route.ref)>A&&(o.globalEnabled&&N?.enabled||M)}),E=n.noticeClass==="mandatory_notice"&&g?.channel==="in_app"&&g?.deliveryMode==="durable_in_app";if(!o.globalEnabled&&!E||!o.fallback.enabled||u<0||!o.fallback.orderedRouteRefs.includes(r)||!D||!p?.enabled&&!E||!g||g?.channel!==p?.channel||g.semantic!==n.semantic)i.push("Selected fallback route is not requested and eligible by configuration");if(t.selectedRoute.revision!==g?.revision||t.selectedRoute.digest!==g?.routeDigest||D?.revision!==g?.revision||D?.digest!==g?.routeDigest)i.push("Selected fallback route binding is stale");if(p?.consentRef&&!n.consentRefs.includes(p.consentRef))i.push("Selected fallback route lacks required consent");if(L?.route.ref!==r||t.consideredRoutes.length!==u+1)i.push("Selected fallback route is not the first eligible ordered route");if(s&&A>=u)i.push("Selected fallback route does not follow the prior attempt")}var J="1.0.0",k=l.string().trim().min(1),Q=l.object({route:R,eligibility:l.enum(["eligible","ineligible","unknown"]),eligibilityDecision:y,reasonCodes:l.array(l.string().trim().min(1)).min(1)}).strict().superRefine((e,i)=>{if(new Set(e.reasonCodes).size!==e.reasonCodes.length)d(i,"reasonCodes","reason codes must be unique")}),W=l.object({status:l.enum(["not_required","pending","resolved"]),binding:y.optional()}).strict().superRefine((e,i)=>{if(e.status==="not_required"&&e.binding)i.addIssue({code:l.ZodIssueCode.custom,path:["binding"],message:"not_required reconciliation cannot carry a ref"});if(e.status!=="not_required"&&!e.binding)i.addIssue({code:l.ZodIssueCode.custom,path:["binding"],message:"pending or resolved reconciliation requires a ref"})}),be=l.object({schemaVersion:l.literal(J),decisionRef:k,fallbackDecisionDigest:h,deliveryRef:k,intent:y,scope:C,recipientRef:k,priorAttemptRef:k.optional(),priorProgress:y.optional(),priorOutcome:l.enum(["not_attempted","definitive_failure","ambiguous","reconciled_failure"]),state:l.enum(["selected","fail_closed","not_required"]),consideredRoutes:l.array(Q).min(1),selectedRoute:R.optional(),preferenceSet:R,eligibilityDecisions:l.array(y).min(1),policyRefs:l.array(k).min(1),reconciliation:W,effectAuthority:l.literal("none"),decidedAt:l.string().datetime({offset:!0}),evidenceRefs:l.array(k).min(1)}).strict().superRefine((e,i)=>{if(e.priorOutcome==="not_attempted"&&(e.priorAttemptRef||e.priorProgress))d(i,"priorAttemptRef","not-attempted fallback cannot reference a prior attempt");if(e.priorOutcome!=="not_attempted"&&(!e.priorAttemptRef||!e.priorProgress))d(i,"priorAttemptRef","attempted fallback outcomes require prior attempt and progress bindings");let t=e.consideredRoutes.map((o)=>o.route.ref);if(new Set(t).size!==t.length)d(i,"consideredRoutes","considered routes must be unique");for(let o of["policyRefs","evidenceRefs"])if(new Set(e[o]).size!==e[o].length)d(i,o,`${o} must be unique`);let n=e.eligibilityDecisions.map((o)=>o.ref);if(new Set(n).size!==n.length)d(i,"eligibilityDecisions","eligibility decisions must be unique");if(e.priorOutcome==="ambiguous"&&(e.state!=="fail_closed"||e.selectedRoute||e.reconciliation.status!=="pending"))d(i,"state","ambiguous delivery must remain fail closed until reclassified as a reconciled failure");if(e.priorOutcome==="reconciled_failure"&&e.reconciliation.status!=="resolved")d(i,"reconciliation","reconciled failure requires resolved reconciliation evidence");if((e.priorOutcome==="not_attempted"||e.priorOutcome==="definitive_failure")&&e.reconciliation.status!=="not_required")d(i,"reconciliation","non-ambiguous fallback must not carry reconciliation state");if(e.state==="selected"){let o=e.selectedRoute;if(!o)d(i,"selectedRoute","selected fallback requires a route");else if(!e.consideredRoutes.some((s)=>s.route.ref===o.ref&&s.route.revision===o.revision&&s.route.digest===o.digest&&s.eligibility==="eligible"))d(i,"selectedRoute","selected fallback route requires an explicit eligibility decision")}else if(e.selectedRoute)d(i,"selectedRoute","non-selected fallback decisions cannot carry a selected route")});function d(e,i,t){e.addIssue({code:l.ZodIssueCode.custom,path:[i],message:t})}export{J as COMMUNICATION_FALLBACK_DECISION_SCHEMA_VERSION,be as CommunicationFallbackDecisionV1Schema,W as CommunicationFallbackReconciliationV1Schema,Q as CommunicationFallbackRouteConsiderationV1Schema,G as validateCommunicationFallbackBindingV1,z as validateCommunicationFallbackConsiderationsV1,T as validateCommunicationFallbackPriorOutcomeBindingV1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as a}from"zod";var x="1.0.0",L="1.0.0",q={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},s=a.string().trim().min(1),C=a.string().datetime({offset:!0}),R=a.string().regex(/^sha256:[a-f0-9]{64}$/),P=a.object({ref:s,digest:R}).strict(),h=P.extend({revision:a.number().int().positive()}).strict(),S=a.object({tenantRef:s,workspaceRef:s.optional(),spaceRef:s.optional(),subjectRef:s}).strict(),N=a.object({schemaVersion:a.literal(x),profileRef:s,revision:a.number().int().positive(),agentRef:s,applicationRef:s,scope:S,routeBindings:a.array(h),connectionRefs:a.array(s),preferenceSet:h,policyRefs:a.array(s).min(1),evidenceRefs:a.array(s).min(1),createdAt:C,updatedAt:C,profileDigest:R}).strict().superRefine((n,e)=>{for(let i of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(n[i]).size!==n[i].length)e.addIssue({code:a.ZodIssueCode.custom,path:[i],message:`${i} must be unique`});let t=n.routeBindings.map((i)=>i.ref);if(new Set(t).size!==t.length)e.addIssue({code:a.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),O=a.object({schemaVersion:a.literal(L),linkRef:s,profile:h,agentRef:s,applicationRef:s,scope:S,runRef:s.optional(),taskRef:s.optional(),helpRequestRef:s.optional(),approvalRequestRef:s.optional(),backgroundResultRef:s.optional(),canonicalConversation:P.optional(),session:h.optional(),correlationRef:s,evidenceRefs:a.array(s).min(1)}).strict().superRefine((n,e)=>{if(new Set(n.evidenceRefs).size!==n.evidenceRefs.length)e.addIssue({code:a.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!n.runRef&&!n.taskRef&&!n.helpRequestRef&&!n.approvalRequestRef&&!n.backgroundResultRef)e.addIssue({code:a.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function p(n,e){return n.tenantRef===e.tenantRef&&n.workspaceRef===e.workspaceRef&&n.spaceRef===e.spaceRef&&n.subjectRef===e.subjectRef}function V(n){let e=[];for(let t of["agentRef","applicationRef"])if(n.profile[t]!==n.lifecycleLink[t])e.push(`Lifecycle ${t} does not match the agent profile`);if(n.lifecycleLink.profile.ref!==n.profile.profileRef||n.lifecycleLink.profile.revision!==n.profile.revision||n.lifecycleLink.profile.digest!==n.profile.profileDigest)e.push("Lifecycle profile binding does not match the agent profile");if(!p(n.profile.scope,n.lifecycleLink.scope))e.push("Lifecycle scope does not match the agent profile");return e}function z(n){let{intent:e,progress:t}=n,i=[];if(t.deliveryRef!==e.deliveryRef||t.intent.ref!==e.deliveryRef||t.intent.digest!==e.deliveryDigest)i.push("Progress delivery does not match the intent");if(!p(t.scope,e.scope))i.push("Progress scope does not match the intent");if(t.recipientRef!==e.recipientRefs[0])i.push("Progress recipient does not match the intent");let r=e.requestedRoutes.find((o)=>o.ref===t.route.ref);if(!r||r.revision!==t.route.revision||r.digest!==t.route.digest)i.push("Progress route was not requested by the intent");if(Date.parse(t.occurredAt)<Date.parse(e.createdAt)||Date.parse(t.occurredAt)>Date.parse(e.expiresAt))i.push("Progress occurred outside the intent validity window");return i}import{z as f}from"zod";var T="1.0.0",D="communication:preference-target:platform-default",F=[["event","automation"],["feature","application"],["product"],["space","person"],["platform_default"]],K=f.enum(["event","automation","feature","application","product","space","person","platform_default"]),g=f.string().trim().min(1);function m(n){return f.object({kind:f.literal(n),ref:g}).strict()}var I=f.discriminatedUnion("kind",[m("event"),m("automation"),m("feature"),m("application"),m("product"),m("space"),m("person"),f.object({kind:f.literal("platform_default"),ref:f.literal(D)}).strict()]),B=f.object({preferenceSetRef:g,revision:f.number().int().positive(),digest:R,target:I}).strict(),Z=f.object({schemaVersion:f.literal(T),resolutionRef:g,scope:S,subjectRef:g,evaluatedPreferenceSets:f.array(B).min(1),winningPreferenceSetRef:g,winningTarget:I,authority:f.literal("preference_only"),effectAuthority:f.literal("none"),resolvedAt:f.string().datetime({offset:!0}),evidenceRefs:f.array(g).min(1),resolutionDigest:R}).strict().superRefine((n,e)=>{let t=n.evaluatedPreferenceSets.map((r)=>r.preferenceSetRef);if(new Set(t).size!==t.length)d(e,"evaluatedPreferenceSets","evaluated sets must be unique");if(new Set(n.evidenceRefs).size!==n.evidenceRefs.length)d(e,"evidenceRefs","evidenceRefs must be unique");for(let r=1;r<n.evaluatedPreferenceSets.length;r+=1){let o=n.evaluatedPreferenceSets[r-1],l=n.evaluatedPreferenceSets[r];if(o&&l&&b(o.target.kind)>b(l.target.kind)){d(e,"evaluatedPreferenceSets","evaluated sets must follow the preference resolution hierarchy");break}}let i=n.evaluatedPreferenceSets.find((r)=>r.preferenceSetRef===n.winningPreferenceSetRef);if(!i)d(e,"winningPreferenceSetRef","winning preference set must have been evaluated");else if(i.preferenceSetRef!==n.evaluatedPreferenceSets[0]?.preferenceSetRef)d(e,"winningPreferenceSetRef","winning preference set must be the most specific evaluated set");else if(i.target.kind!==n.winningTarget.kind||i.target.ref!==n.winningTarget.ref)d(e,"winningTarget","winning target must match the winning preference set")});function b(n){switch(n){case"event":case"automation":return 0;case"feature":case"application":return 1;case"product":return 2;case"space":case"person":return 3;case"platform_default":return 4}}function d(n,e,t){n.addIssue({code:f.ZodIssueCode.custom,path:[e],message:t})}function A(n){let{preferenceResolution:e,preferenceSet:t}=n,i=[];if(e.subjectRef!==t.scope.subjectRef||e.winningPreferenceSetRef!==t.preferenceSetRef)i.push("Preference resolution does not match its subject and set");if(!p(e.scope,t.scope))i.push("Preference resolution scope does not match its preference set");let r=e.evaluatedPreferenceSets.find((o)=>o.preferenceSetRef===t.preferenceSetRef);if(!r||r.revision!==t.revision||r.digest!==t.preferenceSetDigest)i.push("Preference resolution binding is stale");if(e.winningTarget.kind!==t.target.kind||e.winningTarget.ref!==t.target.ref)i.push("Preference resolution target does not match its preference set");return i}function J(n){let{intent:e,profile:t,preferenceSet:i,preferenceResolution:r}=n,o=[];if(!p(e.scope,t.scope))o.push("Intent scope does not match the agent profile");if(!p(e.scope,i.scope))o.push("Intent scope does not match the preference set");if(e.lifecycleLink){if(o.push(...V({profile:t,lifecycleLink:e.lifecycleLink})),!p(e.scope,e.lifecycleLink.scope))o.push("Intent scope does not match the lifecycle link")}if(e.profile.ref!==t.profileRef||e.profile.revision!==t.revision||e.profile.digest!==t.profileDigest)o.push("Intent profile binding is stale");if(e.preferenceSet.ref!==i.preferenceSetRef||e.preferenceSet.revision!==i.revision||e.preferenceSet.digest!==i.preferenceSetDigest)o.push("Intent preference set does not match its preferences");let l=r.evaluatedPreferenceSets.find((c)=>c.preferenceSetRef===t.preferenceSet.ref);if(!l||l.revision!==t.preferenceSet.revision||l.digest!==t.preferenceSet.digest)o.push("Agent profile preference set was not evaluated");if(o.push(...A({preferenceResolution:r,preferenceSet:i})),e.preferenceResolution.ref!==r.resolutionRef||e.preferenceResolution.digest!==r.resolutionDigest)o.push("Intent preference resolution binding is stale");if(r.subjectRef!==e.scope.subjectRef)o.push("Preference resolution does not bind the intent subject");if(e.classificationRefs.applicationRef&&e.classificationRefs.applicationRef!==t.applicationRef)o.push("Intent application classification does not match the profile");if(e.policyRefs.some((c)=>!t.policyRefs.includes(c)))o.push("Intent policy is not bound to the agent profile");let E=new Map(n.routes.map((c)=>[c.routeRef,c])),k=new Map(i.routePreferences.map((c)=>[c.routeRef,c]));for(let c of e.requestedRoutes){let u=E.get(c.ref),y=t.routeBindings.find((w)=>w.ref===c.ref),v=k.get(c.ref);if(!u||!y){o.push(`Requested route ${c.ref} is not bound to the profile`);continue}if(c.revision!==u.revision||c.digest!==u.routeDigest||y.revision!==u.revision||y.digest!==u.routeDigest)o.push(`Requested route ${c.ref} binding is stale`);if(!p(e.scope,u.scope))o.push(`Requested route ${c.ref} scope does not match`);if(u.semantic!==e.semantic)o.push(`Requested route ${c.ref} has incompatible semantics`);if(!v||v.channel!==u.channel)o.push(`Requested route ${c.ref} is not configured by preferences`)}if(!i.globalEnabled&&e.noticeClass!=="mandatory_notice")o.push("Intent preference set is globally disabled");return o}export{J as validateCommunicationDeliveryIntentBindingV1};
|