@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.
Files changed (309) hide show
  1. package/README.md +201 -0
  2. package/dist/browser/capabilities/comms-ai.capabilities.js +1 -0
  3. package/dist/browser/capabilities/communication-os.capability-ids.js +1 -0
  4. package/dist/browser/capabilities/ecosystem-messaging.capabilities.js +1 -0
  5. package/dist/browser/capabilities/index.js +1 -0
  6. package/dist/browser/commands/comms-ai.commands.js +1 -0
  7. package/dist/browser/commands/index.js +1 -0
  8. package/dist/browser/contracts/agent-communication.js +1 -0
  9. package/dist/browser/contracts/agent-lifecycle-projection.js +1 -0
  10. package/dist/browser/contracts/agent-surface-control.js +1 -0
  11. package/dist/browser/contracts/ai-assistance.operations.js +1 -0
  12. package/dist/browser/contracts/artifact-digest.js +1 -0
  13. package/dist/browser/contracts/canonical-agent-conversation.js +1 -0
  14. package/dist/browser/contracts/channel-preferences.js +1 -0
  15. package/dist/browser/contracts/channel-routing.js +1 -0
  16. package/dist/browser/contracts/collaboration.operations.js +1 -0
  17. package/dist/browser/contracts/customer-live-chat-grant.operations.js +1 -0
  18. package/dist/browser/contracts/delivery-eligibility.js +1 -0
  19. package/dist/browser/contracts/delivery-fallback-eligibility-validation.js +1 -0
  20. package/dist/browser/contracts/delivery-fallback-validation.js +1 -0
  21. package/dist/browser/contracts/delivery-fallback.js +1 -0
  22. package/dist/browser/contracts/delivery-intent-validation.js +1 -0
  23. package/dist/browser/contracts/delivery-intent.js +1 -0
  24. package/dist/browser/contracts/delivery-progress.js +1 -0
  25. package/dist/browser/contracts/discord-community-intelligence.operations.js +1 -0
  26. package/dist/browser/contracts/discord-community.events.js +1 -0
  27. package/dist/browser/contracts/discord-community.models.js +1 -0
  28. package/dist/browser/contracts/discord-community.operations.js +1 -0
  29. package/dist/browser/contracts/ecosystem-attachment.operations.js +1 -0
  30. package/dist/browser/contracts/ecosystem-auth.operations.js +1 -0
  31. package/dist/browser/contracts/ecosystem-binding.operations.js +1 -0
  32. package/dist/browser/contracts/ecosystem-connection-subscription.events.js +1 -0
  33. package/dist/browser/contracts/ecosystem-governed-work-v2.operations.js +1 -0
  34. package/dist/browser/contracts/ecosystem-governed-work.operations.js +1 -0
  35. package/dist/browser/contracts/ecosystem-identity-v3.operations.js +1 -0
  36. package/dist/browser/contracts/ecosystem-identity.operations.js +1 -0
  37. package/dist/browser/contracts/ecosystem-message.operations.js +1 -0
  38. package/dist/browser/contracts/ecosystem-messaging.dtos.js +0 -0
  39. package/dist/browser/contracts/ecosystem-messaging.events.js +1 -0
  40. package/dist/browser/contracts/ecosystem-messaging.models.js +1 -0
  41. package/dist/browser/contracts/ecosystem-navigation-v3.operations.js +1 -0
  42. package/dist/browser/contracts/ecosystem-webhook.operations.js +1 -0
  43. package/dist/browser/contracts/ecosystem-workspace.operations.js +1 -0
  44. package/dist/browser/contracts/enums.js +1 -0
  45. package/dist/browser/contracts/erasure.operations.js +1 -0
  46. package/dist/browser/contracts/events.js +1 -0
  47. package/dist/browser/contracts/index.js +1 -0
  48. package/dist/browser/contracts/ingestion.js +1 -0
  49. package/dist/browser/contracts/ingress-admission-policy.js +1 -0
  50. package/dist/browser/contracts/ingress-admission.js +1 -0
  51. package/dist/browser/contracts/models.js +1 -0
  52. package/dist/browser/contracts/operations.js +1 -0
  53. package/dist/browser/contracts/persistence.js +1 -0
  54. package/dist/browser/contracts/preference-resolution.js +1 -0
  55. package/dist/browser/contracts/query.operations.js +1 -0
  56. package/dist/browser/contracts/sequence-intent.js +1 -0
  57. package/dist/browser/contracts/sovereignty.js +1 -0
  58. package/dist/browser/contracts/support-internal-note.operations.js +1 -0
  59. package/dist/browser/contracts/thread-link-kind.js +1 -0
  60. package/dist/browser/contracts/thread-message.operations.js +1 -0
  61. package/dist/browser/events/index.js +1 -0
  62. package/dist/browser/fixtures/agent-omnichannel-primitives.js +1 -0
  63. package/dist/browser/fixtures/agent-omnichannel.js +1 -0
  64. package/dist/browser/fixtures/gtm-learning-loop-neutral.parts.js +1 -0
  65. package/dist/browser/fixtures/index.js +1 -0
  66. package/dist/browser/fixtures/normalized-ingestion.js +1 -0
  67. package/dist/browser/index.js +1 -0
  68. package/dist/browser/queries/index.js +1 -0
  69. package/dist/browser/types/domain-command.js +0 -0
  70. package/dist/browser/types/index.js +1 -0
  71. package/dist/browser/validation/domain-command.js +1 -0
  72. package/dist/browser/validation/index.js +1 -0
  73. package/dist/capabilities/comms-ai.capabilities.d.ts +72 -0
  74. package/dist/capabilities/comms-ai.capabilities.js +2 -0
  75. package/dist/capabilities/communication-os-capability-boundary.test.d.ts +1 -0
  76. package/dist/capabilities/communication-os.capability-ids.d.ts +39 -0
  77. package/dist/capabilities/communication-os.capability-ids.js +2 -0
  78. package/dist/capabilities/communication-os.capability-ids.test.d.ts +1 -0
  79. package/dist/capabilities/ecosystem-messaging.capabilities.d.ts +9 -0
  80. package/dist/capabilities/ecosystem-messaging.capabilities.js +2 -0
  81. package/dist/capabilities/index.d.ts +4 -0
  82. package/dist/capabilities/index.js +2 -0
  83. package/dist/commands/comms-ai.commands.d.ts +272 -0
  84. package/dist/commands/comms-ai.commands.js +2 -0
  85. package/dist/commands/index.d.ts +10 -0
  86. package/dist/commands/index.js +2 -0
  87. package/dist/contracts/agent-communication.d.ts +108 -0
  88. package/dist/contracts/agent-communication.js +2 -0
  89. package/dist/contracts/agent-communication.test.d.ts +1 -0
  90. package/dist/contracts/agent-lifecycle-projection.d.ts +98 -0
  91. package/dist/contracts/agent-lifecycle-projection.js +2 -0
  92. package/dist/contracts/agent-lifecycle-projection.test.d.ts +1 -0
  93. package/dist/contracts/agent-surface-control.d.ts +210 -0
  94. package/dist/contracts/agent-surface-control.js +2 -0
  95. package/dist/contracts/agent-surface-control.test.d.ts +1 -0
  96. package/dist/contracts/ai-assistance.operations.d.ts +187 -0
  97. package/dist/contracts/ai-assistance.operations.js +2 -0
  98. package/dist/contracts/artifact-digest.d.ts +3 -0
  99. package/dist/contracts/artifact-digest.js +2 -0
  100. package/dist/contracts/canonical-agent-conversation.d.ts +46 -0
  101. package/dist/contracts/canonical-agent-conversation.js +2 -0
  102. package/dist/contracts/canonical-agent-conversation.test.d.ts +1 -0
  103. package/dist/contracts/channel-preferences.d.ts +115 -0
  104. package/dist/contracts/channel-preferences.js +2 -0
  105. package/dist/contracts/channel-routing.d.ts +58 -0
  106. package/dist/contracts/channel-routing.js +2 -0
  107. package/dist/contracts/channel-routing.test.d.ts +1 -0
  108. package/dist/contracts/collaboration.operations.d.ts +315 -0
  109. package/dist/contracts/collaboration.operations.js +2 -0
  110. package/dist/contracts/customer-live-chat-grant.operations.d.ts +132 -0
  111. package/dist/contracts/customer-live-chat-grant.operations.js +2 -0
  112. package/dist/contracts/delivery-contracts.test.d.ts +1 -0
  113. package/dist/contracts/delivery-eligibility.d.ts +126 -0
  114. package/dist/contracts/delivery-eligibility.js +2 -0
  115. package/dist/contracts/delivery-eligibility.test.d.ts +1 -0
  116. package/dist/contracts/delivery-fallback-eligibility-validation.d.ts +6 -0
  117. package/dist/contracts/delivery-fallback-eligibility-validation.js +2 -0
  118. package/dist/contracts/delivery-fallback-validation.d.ts +24 -0
  119. package/dist/contracts/delivery-fallback-validation.js +2 -0
  120. package/dist/contracts/delivery-fallback.d.ts +117 -0
  121. package/dist/contracts/delivery-fallback.js +2 -0
  122. package/dist/contracts/delivery-intent-validation.d.ts +13 -0
  123. package/dist/contracts/delivery-intent-validation.js +2 -0
  124. package/dist/contracts/delivery-intent.d.ts +137 -0
  125. package/dist/contracts/delivery-intent.js +2 -0
  126. package/dist/contracts/delivery-progress.d.ts +61 -0
  127. package/dist/contracts/delivery-progress.js +2 -0
  128. package/dist/contracts/discord-community-intelligence.operations.d.ts +405 -0
  129. package/dist/contracts/discord-community-intelligence.operations.js +2 -0
  130. package/dist/contracts/discord-community.events.d.ts +162 -0
  131. package/dist/contracts/discord-community.events.js +2 -0
  132. package/dist/contracts/discord-community.models.d.ts +167 -0
  133. package/dist/contracts/discord-community.models.js +2 -0
  134. package/dist/contracts/discord-community.operations.d.ts +663 -0
  135. package/dist/contracts/discord-community.operations.js +2 -0
  136. package/dist/contracts/discord-community.test.d.ts +1 -0
  137. package/dist/contracts/ecosystem-attachment.operations.d.ts +129 -0
  138. package/dist/contracts/ecosystem-attachment.operations.js +2 -0
  139. package/dist/contracts/ecosystem-auth.operations.d.ts +345 -0
  140. package/dist/contracts/ecosystem-auth.operations.js +2 -0
  141. package/dist/contracts/ecosystem-binding.operations.d.ts +231 -0
  142. package/dist/contracts/ecosystem-binding.operations.js +2 -0
  143. package/dist/contracts/ecosystem-connection-subscription.events.d.ts +332 -0
  144. package/dist/contracts/ecosystem-connection-subscription.events.js +2 -0
  145. package/dist/contracts/ecosystem-governed-work-v2.operations.d.ts +234 -0
  146. package/dist/contracts/ecosystem-governed-work-v2.operations.js +2 -0
  147. package/dist/contracts/ecosystem-governed-work.operations.d.ts +265 -0
  148. package/dist/contracts/ecosystem-governed-work.operations.js +2 -0
  149. package/dist/contracts/ecosystem-governed-work.operations.test.d.ts +1 -0
  150. package/dist/contracts/ecosystem-identity-v3.operations.d.ts +65 -0
  151. package/dist/contracts/ecosystem-identity-v3.operations.js +2 -0
  152. package/dist/contracts/ecosystem-identity.operations.d.ts +174 -0
  153. package/dist/contracts/ecosystem-identity.operations.js +2 -0
  154. package/dist/contracts/ecosystem-identity.operations.test.d.ts +1 -0
  155. package/dist/contracts/ecosystem-message.operations.d.ts +1092 -0
  156. package/dist/contracts/ecosystem-message.operations.js +2 -0
  157. package/dist/contracts/ecosystem-messaging.dtos.d.ts +68 -0
  158. package/dist/contracts/ecosystem-messaging.dtos.js +1 -0
  159. package/dist/contracts/ecosystem-messaging.dtos.test.d.ts +1 -0
  160. package/dist/contracts/ecosystem-messaging.events.d.ts +608 -0
  161. package/dist/contracts/ecosystem-messaging.events.js +2 -0
  162. package/dist/contracts/ecosystem-messaging.models.d.ts +386 -0
  163. package/dist/contracts/ecosystem-messaging.models.js +2 -0
  164. package/dist/contracts/ecosystem-messaging.test.d.ts +1 -0
  165. package/dist/contracts/ecosystem-navigation-v3.operations.d.ts +149 -0
  166. package/dist/contracts/ecosystem-navigation-v3.operations.js +2 -0
  167. package/dist/contracts/ecosystem-webhook.operations.d.ts +187 -0
  168. package/dist/contracts/ecosystem-webhook.operations.js +2 -0
  169. package/dist/contracts/ecosystem-workspace.operations.d.ts +590 -0
  170. package/dist/contracts/ecosystem-workspace.operations.js +2 -0
  171. package/dist/contracts/enums.d.ts +9 -0
  172. package/dist/contracts/enums.js +2 -0
  173. package/dist/contracts/erasure.operations.d.ts +114 -0
  174. package/dist/contracts/erasure.operations.js +2 -0
  175. package/dist/contracts/erasure.test.d.ts +1 -0
  176. package/dist/contracts/events.d.ts +174 -0
  177. package/dist/contracts/events.js +2 -0
  178. package/dist/contracts/index.d.ts +43 -0
  179. package/dist/contracts/index.js +2 -0
  180. package/dist/contracts/ingestion.d.ts +169 -0
  181. package/dist/contracts/ingestion.js +2 -0
  182. package/dist/contracts/ingress-admission-policy.d.ts +14 -0
  183. package/dist/contracts/ingress-admission-policy.js +2 -0
  184. package/dist/contracts/ingress-admission.d.ts +184 -0
  185. package/dist/contracts/ingress-admission.js +2 -0
  186. package/dist/contracts/ingress-admission.test.d.ts +1 -0
  187. package/dist/contracts/models.d.ts +851 -0
  188. package/dist/contracts/models.js +2 -0
  189. package/dist/contracts/operations.d.ts +5 -0
  190. package/dist/contracts/operations.js +2 -0
  191. package/dist/contracts/persistence.d.ts +353 -0
  192. package/dist/contracts/persistence.js +2 -0
  193. package/dist/contracts/persistence.test.d.ts +1 -0
  194. package/dist/contracts/preference-resolution.d.ts +154 -0
  195. package/dist/contracts/preference-resolution.js +2 -0
  196. package/dist/contracts/preference-resolution.test.d.ts +1 -0
  197. package/dist/contracts/query.operations.d.ts +600 -0
  198. package/dist/contracts/query.operations.js +2 -0
  199. package/dist/contracts/sequence-intent.d.ts +103 -0
  200. package/dist/contracts/sequence-intent.js +2 -0
  201. package/dist/contracts/sequence-intent.test.d.ts +1 -0
  202. package/dist/contracts/sovereignty.d.ts +164 -0
  203. package/dist/contracts/sovereignty.js +2 -0
  204. package/dist/contracts/support-internal-note.operations.d.ts +309 -0
  205. package/dist/contracts/support-internal-note.operations.js +2 -0
  206. package/dist/contracts/support-internal-note.operations.test.d.ts +1 -0
  207. package/dist/contracts/thread-link-kind.d.ts +20 -0
  208. package/dist/contracts/thread-link-kind.js +2 -0
  209. package/dist/contracts/thread-message.operations.d.ts +485 -0
  210. package/dist/contracts/thread-message.operations.js +2 -0
  211. package/dist/events/index.d.ts +4 -0
  212. package/dist/events/index.js +2 -0
  213. package/dist/fixtures/agent-omnichannel-primitives.d.ts +240 -0
  214. package/dist/fixtures/agent-omnichannel-primitives.js +2 -0
  215. package/dist/fixtures/agent-omnichannel.d.ts +682 -0
  216. package/dist/fixtures/agent-omnichannel.js +2 -0
  217. package/dist/fixtures/agent-omnichannel.test.d.ts +1 -0
  218. package/dist/fixtures/gtm-learning-loop-neutral.parts.d.ts +20 -0
  219. package/dist/fixtures/gtm-learning-loop-neutral.parts.js +2 -0
  220. package/dist/fixtures/index.d.ts +3 -0
  221. package/dist/fixtures/index.js +2 -0
  222. package/dist/fixtures/normalized-ingestion.d.ts +102 -0
  223. package/dist/fixtures/normalized-ingestion.js +2 -0
  224. package/dist/fixtures/normalized-ingestion.test.d.ts +1 -0
  225. package/dist/index.d.ts +7 -0
  226. package/dist/index.js +2 -0
  227. package/dist/node/capabilities/comms-ai.capabilities.js +1 -0
  228. package/dist/node/capabilities/communication-os.capability-ids.js +1 -0
  229. package/dist/node/capabilities/ecosystem-messaging.capabilities.js +1 -0
  230. package/dist/node/capabilities/index.js +1 -0
  231. package/dist/node/commands/comms-ai.commands.js +1 -0
  232. package/dist/node/commands/index.js +1 -0
  233. package/dist/node/contracts/agent-communication.js +1 -0
  234. package/dist/node/contracts/agent-lifecycle-projection.js +1 -0
  235. package/dist/node/contracts/agent-surface-control.js +1 -0
  236. package/dist/node/contracts/ai-assistance.operations.js +1 -0
  237. package/dist/node/contracts/artifact-digest.js +1 -0
  238. package/dist/node/contracts/canonical-agent-conversation.js +1 -0
  239. package/dist/node/contracts/channel-preferences.js +1 -0
  240. package/dist/node/contracts/channel-routing.js +1 -0
  241. package/dist/node/contracts/collaboration.operations.js +1 -0
  242. package/dist/node/contracts/customer-live-chat-grant.operations.js +1 -0
  243. package/dist/node/contracts/delivery-eligibility.js +1 -0
  244. package/dist/node/contracts/delivery-fallback-eligibility-validation.js +1 -0
  245. package/dist/node/contracts/delivery-fallback-validation.js +1 -0
  246. package/dist/node/contracts/delivery-fallback.js +1 -0
  247. package/dist/node/contracts/delivery-intent-validation.js +1 -0
  248. package/dist/node/contracts/delivery-intent.js +1 -0
  249. package/dist/node/contracts/delivery-progress.js +1 -0
  250. package/dist/node/contracts/discord-community-intelligence.operations.js +1 -0
  251. package/dist/node/contracts/discord-community.events.js +1 -0
  252. package/dist/node/contracts/discord-community.models.js +1 -0
  253. package/dist/node/contracts/discord-community.operations.js +1 -0
  254. package/dist/node/contracts/ecosystem-attachment.operations.js +1 -0
  255. package/dist/node/contracts/ecosystem-auth.operations.js +1 -0
  256. package/dist/node/contracts/ecosystem-binding.operations.js +1 -0
  257. package/dist/node/contracts/ecosystem-connection-subscription.events.js +1 -0
  258. package/dist/node/contracts/ecosystem-governed-work-v2.operations.js +1 -0
  259. package/dist/node/contracts/ecosystem-governed-work.operations.js +1 -0
  260. package/dist/node/contracts/ecosystem-identity-v3.operations.js +1 -0
  261. package/dist/node/contracts/ecosystem-identity.operations.js +1 -0
  262. package/dist/node/contracts/ecosystem-message.operations.js +1 -0
  263. package/dist/node/contracts/ecosystem-messaging.dtos.js +0 -0
  264. package/dist/node/contracts/ecosystem-messaging.events.js +1 -0
  265. package/dist/node/contracts/ecosystem-messaging.models.js +1 -0
  266. package/dist/node/contracts/ecosystem-navigation-v3.operations.js +1 -0
  267. package/dist/node/contracts/ecosystem-webhook.operations.js +1 -0
  268. package/dist/node/contracts/ecosystem-workspace.operations.js +1 -0
  269. package/dist/node/contracts/enums.js +1 -0
  270. package/dist/node/contracts/erasure.operations.js +1 -0
  271. package/dist/node/contracts/events.js +1 -0
  272. package/dist/node/contracts/index.js +1 -0
  273. package/dist/node/contracts/ingestion.js +1 -0
  274. package/dist/node/contracts/ingress-admission-policy.js +1 -0
  275. package/dist/node/contracts/ingress-admission.js +1 -0
  276. package/dist/node/contracts/models.js +1 -0
  277. package/dist/node/contracts/operations.js +1 -0
  278. package/dist/node/contracts/persistence.js +1 -0
  279. package/dist/node/contracts/preference-resolution.js +1 -0
  280. package/dist/node/contracts/query.operations.js +1 -0
  281. package/dist/node/contracts/sequence-intent.js +1 -0
  282. package/dist/node/contracts/sovereignty.js +1 -0
  283. package/dist/node/contracts/support-internal-note.operations.js +1 -0
  284. package/dist/node/contracts/thread-link-kind.js +1 -0
  285. package/dist/node/contracts/thread-message.operations.js +1 -0
  286. package/dist/node/events/index.js +1 -0
  287. package/dist/node/fixtures/agent-omnichannel-primitives.js +1 -0
  288. package/dist/node/fixtures/agent-omnichannel.js +1 -0
  289. package/dist/node/fixtures/gtm-learning-loop-neutral.parts.js +1 -0
  290. package/dist/node/fixtures/index.js +1 -0
  291. package/dist/node/fixtures/normalized-ingestion.js +1 -0
  292. package/dist/node/index.js +1 -0
  293. package/dist/node/queries/index.js +1 -0
  294. package/dist/node/types/domain-command.js +0 -0
  295. package/dist/node/types/index.js +1 -0
  296. package/dist/node/validation/domain-command.js +1 -0
  297. package/dist/node/validation/index.js +1 -0
  298. package/dist/package-exports.test.d.ts +1 -0
  299. package/dist/queries/index.d.ts +4 -0
  300. package/dist/queries/index.js +2 -0
  301. package/dist/types/domain-command.d.ts +54 -0
  302. package/dist/types/domain-command.js +1 -0
  303. package/dist/types/index.d.ts +3 -0
  304. package/dist/types/index.js +2 -0
  305. package/dist/validation/domain-command.d.ts +3 -0
  306. package/dist/validation/domain-command.js +2 -0
  307. package/dist/validation/index.d.ts +53 -0
  308. package/dist/validation/index.js +2 -0
  309. package/package.json +1227 -0
@@ -0,0 +1 @@
1
+ import{defineCommand as R,defineQuery as se,docId as re}from"@lssm/lib.contracts-spec";import{defineEnum as j,defineSchemaModel as C,ScalarTypeEnum as o}from"@lssm/lib.schema";import{defineEnum as l,defineSchemaModel as r,ScalarTypeEnum as t}from"@lssm/lib.schema";var Z=l("CommunicationSpaceKind",["personal","organization"]),ee=l("CommunicationPrincipalKind",["human","agent","system"]),te=l("CommunicationConnectionPlacement",["device","managed_cloud","self_hosted"]),De=l("CommunicationConnectionNetwork",["email","sms","slack","teams","telegram","whatsapp","discord","matrix"]),ne=l("CommunicationEncryptionMode",["client_encrypted","governed_server_indexable"]),ie=l("CommunicationMembershipState",["active","revoked"]),D=l("CommunicationReceiptKind",["delivered","read"]),ae=l("CommunicationConnectionHealth",["connecting","healthy","degraded","offline","revoked"]),E={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"},S=r({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}}}),Ee=r({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:Z,isOptional:!1},encryptionMode:{type:ne,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1}}}),Re=r({name:"CommunicationPrincipalV2",description:"Auditable human, agent, or system identity",fields:{id:{type:t.String_unsecure(),isOptional:!1},kind:{type:ee,isOptional:!1},displayName:{type:t.String_unsecure(),isOptional:!1},ownerPrincipalId:{type:t.String_unsecure(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1}}}),je=r({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}}}),Ne=r({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:ie,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}}}),Le=r({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:te,isOptional:!1},externalAccountRef:{type:t.String_unsecure(),isOptional:!1},credentialRef:{type:t.String_unsecure(),isOptional:!1},health:{type:ae,isOptional:!1},capabilities:{type:t.String_unsecure(),isArray:!0,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),oe=r({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}}}),m=r({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:oe,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}}}),Pe=r({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 x=["platform.communication-os"],ce={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"},b=[re(ce.id)],pe=j("CommunicationGovernedWorkKind",["identity_review","draft","action","handoff","escalation","triage","summary","agent","consent","retention","policy"]),N=j("CommunicationGovernedWorkStatus",["pending","approved","rejected","blocked","resolved","revoked"]),_=C({name:"CommunicationGovernedWorkV1",fields:{id:{type:o.String_unsecure(),isOptional:!1},kind:{type:pe,isOptional:!1},status:{type:N,isOptional:!1},title:{type:o.String_unsecure(),isOptional:!1},threadId:{type:o.String_unsecure(),isOptional:!0},details:{type:o.JSONObject(),isOptional:!1},revision:{type:o.Int_unsecure(),isOptional:!1},createdBy:{type:o.String_unsecure(),isOptional:!1},createdAt:{type:o.DateTime(),isOptional:!1},updatedBy:{type:o.String_unsecure(),isOptional:!1},updatedAt:{type:o.DateTime(),isOptional:!1}}}),ue=se({meta:{key:"communication.governed_work.list",version:"1.0.0",stability:"experimental",owners:[...x],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:b},io:{input:S,output:C({name:"ListCommunicationGovernedWorkV1Output",fields:{items:{type:_,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),Qe=R({meta:{key:"communication.governed_work.create",version:"1.0.0",stability:"experimental",owners:[...x],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:b},io:{input:_,output:_},policy:{auth:"user"}}),Ke=R({meta:{key:"communication.governed_work.transition",version:"1.0.0",stability:"experimental",owners:[...x],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:b},io:{input:C({name:"TransitionCommunicationGovernedWorkV1Input",fields:{workId:{type:o.String_unsecure(),isOptional:!1},status:{type:N,isOptional:!1},reason:{type:o.String_unsecure(),isOptional:!0}}}),output:_},policy:{auth:"user"}});import{defineCommand as le,defineQuery as P,docId as de}from"@lssm/lib.contracts-spec";import{defineEnum as me,defineSchemaModel as O,ScalarTypeEnum as i}from"@lssm/lib.schema";var k=["platform.communication-os"],ye={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"},A=[de(ye.id)],L=me("CommunicationIdentityReviewStatus",["pending","merged","rejected"]),ge=O({name:"CommunicationAccountV2",description:"Public-safe provider account projection in one authorized space",fields:{id:{type:i.String_unsecure(),isOptional:!1},network:{type:i.String_unsecure(),isOptional:!1},externalAccountRef:{type:i.String_unsecure(),isOptional:!1},placement:{type:i.String_unsecure(),isOptional:!1},health:{type:i.String_unsecure(),isOptional:!1},createdAt:{type:i.DateTime(),isOptional:!1},updatedAt:{type:i.DateTime(),isOptional:!1}}}),fe=O({name:"CommunicationContactV2",description:"Participant projection derived from persisted scoped messages",fields:{principalId:{type:i.String_unsecure(),isOptional:!1},displayName:{type:i.String_unsecure(),isOptional:!0},roomIds:{type:i.String_unsecure(),isArray:!0,isOptional:!1},messageCount:{type:i.Int_unsecure(),isOptional:!1},lastSeenAt:{type:i.DateTime(),isOptional:!1}}}),Oe=O({name:"ListCommunicationAccountsV2Output",fields:{accounts:{type:ge,isArray:!0,isOptional:!1}}}),Se=O({name:"ListCommunicationContactsV2Output",fields:{contacts:{type:fe,isArray:!0,isOptional:!1}}}),he=P({meta:{key:"communication.account.list",version:"2.0.0",stability:"experimental",owners:[...k],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:A},io:{input:S,output:Oe},policy:{auth:"user"}}),_e=P({meta:{key:"communication.contact.list",version:"2.0.0",stability:"experimental",owners:[...k],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:A},io:{input:S,output:Se},policy:{auth:"user"}}),He=le({meta:{key:"communication.identity.decide",version:"1.0.0",stability:"experimental",owners:[...k],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:A},io:{input:O({name:"DecideCommunicationIdentityV1Input",fields:{reviewId:{type:i.String_unsecure(),isOptional:!1},decision:{type:L,isOptional:!1},reason:{type:i.String_unsecure(),isOptional:!0}}}),output:O({name:"DecideCommunicationIdentityV1Output",fields:{reviewId:{type:i.String_unsecure(),isOptional:!1},status:{type:L,isOptional:!1},revision:{type:i.Int_unsecure(),isOptional:!1}}})},policy:{auth:"admin"}});import{defineCommand as y,defineQuery as G,docId as ve}from"@lssm/lib.contracts-spec";import{defineSchemaModel as d,ScalarTypeEnum as n}from"@lssm/lib.schema";var c=["platform.communication-os"],p=[ve(E.id)],Q={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."}},et=y({meta:{key:"communication.message.send",version:"2.1.0",stability:"experimental",owners:[...c],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:p},io:{input:m,output:m},policy:{auth:"user"}}),Ie=d({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}}}),tt=y({meta:{key:"communication.message.send",version:"3.0.0",stability:"experimental",owners:[...c],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:p},io:{input:Ie,output:m,errors:Q},policy:{auth:"user"}}),K=d({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}}}),nt=y({meta:{key:"communication.message.edit",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:K,output:m},policy:{auth:"user"}}),it=y({meta:{key:"communication.message.delete",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:K,output:m},policy:{auth:"user"}}),B=d({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}}}),at=y({meta:{key:"communication.reaction.set",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:B,output:B},policy:{auth:"user"}}),q=d({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:D,isOptional:!1},occurredAt:{type:n.DateTime(),isOptional:!1}}}),ot=y({meta:{key:"communication.receipt.record",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:q,output:q},policy:{auth:"user"}}),z=d({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}}}),st=y({meta:{key:"communication.inbox-state.set",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:z,output:z},policy:{auth:"user"}}),Ce=d({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}}}),W=d({name:"SearchCommunicationMessagesV2Output",fields:{messages:{type:m,isArray:!0,isOptional:!1},nextCursor:{type:n.String_unsecure(),isOptional:!0}}}),xe=G({meta:{key:"communication.message.search",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:Ce,output:W},policy:{auth:"user"}}),be=d({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}}}),rt=G({meta:{key:"communication.message.search",version:"3.0.0",stability:"experimental",owners:[...c],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:p},io:{input:be,output:W,errors:Q},policy:{auth:"user"}}),ct={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."]},pt={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."]},ut={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 Te,defineQuery as V}from"@lssm/lib.contracts-spec/operations";import{defineSchemaModel as f,ScalarTypeEnum as s}from"@lssm/lib.schema";import{defineEnum as u}from"@lssm/lib.schema";var g=u("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),h=u("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),J=u("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),U=u("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),F=u("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),w=u("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),H=u("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),Y=u("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),mt=u("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{defineSchemaModel as a,ScalarTypeEnum as e}from"@lssm/lib.schema";var ke=a({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:g,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}}}),Ae=a({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:w,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}}}),Ot=a({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:ke,isArray:!0,isOptional:!1},identityLinks:{type:Ae,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),we=a({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}}}),M=a({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}}}),Me=a({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:H,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}}}),T=a({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:g,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:J,isOptional:!1,defaultValue:"received"},intent:{type:Me,isOptional:!0},attachments:{type:we,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),St=a({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:g,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}}}),v=a({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:h,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:g,isArray:!0,isOptional:!1},links:{type:M,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=a({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:Y,isOptional:!1,defaultValue:"draft_only"}}}),ht=a({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:U,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=a({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: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}}}),vt=a({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}}}),It=a({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:w,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 I=["platform.communication-os"],wt=Te({meta:{key:"communication.thread.updateStatus",version:"1.0.0",stability:"experimental",owners:[...I],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:f({name:"UpdateThreadStatusInput",fields:{threadId:{type:s.String_unsecure(),isOptional:!1},status:{type:h,isOptional:!1},reason:{type:s.String_unsecure(),isOptional:!0}}}),output:v},policy:{auth:"user"}}),Mt=V({meta:{key:"communication.thread.get",version:"1.0.0",stability:"experimental",owners:[...I],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:f({name:"GetThreadInput",fields:{threadId:{type:s.String_unsecure(),isOptional:!1}}}),output:f({name:"GetThreadOutput",fields:{thread:{type:v,isOptional:!1},messages:{type:T,isArray:!0,isOptional:!1},links:{type:M,isArray:!0,isOptional:!0}}})},policy:{auth:"user"}}),Tt=V({meta:{key:"communication.thread.search",version:"1.0.0",stability:"experimental",owners:[...I],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:f({name:"SearchThreadsInput",fields:{status:{type:h,isOptional:!0},participantId:{type:s.String_unsecure(),isOptional:!0},channelType:{type:g,isOptional:!0},linkedKindId:{type:s.String_unsecure(),isOptional:!0},linkedInstanceId:{type:s.String_unsecure(),isOptional:!0},assignedTo:{type:s.String_unsecure(),isOptional:!0},limit:{type:s.Int_unsecure(),isOptional:!0,defaultValue:20}}}),output:f({name:"SearchThreadsOutput",fields:{threads:{type:v,isArray:!0,isOptional:!1},total:{type:s.Int_unsecure(),isOptional:!1},hasMore:{type:s.Boolean(),isOptional:!1}}})},policy:{auth:"user"}}),Vt=V({meta:{key:"communication.message.list",version:"1.0.0",stability:"experimental",owners:[...I],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:f({name:"ListMessagesInput",fields:{threadId:{type:s.String_unsecure(),isOptional:!1}}}),output:f({name:"ListMessagesOutput",fields:{messages:{type:T,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}});export{Mt as GetThreadQuery,he as ListCommunicationAccountsV2Query,_e as ListCommunicationContactsV2Query,ue as ListCommunicationGovernedWorkV1Query,Vt as ListMessagesQuery,xe as SearchCommunicationMessagesV2Query,Tt as SearchThreadsQuery,wt as UpdateThreadStatusCommand};
File without changes
@@ -0,0 +1 @@
1
+ import{defineEnum as i}from"@lssm/lib.schema";var n=i("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),r=i("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),s=i("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),o=i("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),p=i("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),a=i("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),u=i("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),l=i("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),_=i("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{defineSchemaModel as t,ScalarTypeEnum as e}from"@lssm/lib.schema";var d=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}}}),y=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:a,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}}}),C=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:d,isArray:!0,isOptional:!1},identityLinks:{type:y,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),m=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}}}),g=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}}}),f=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:u,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}}}),I=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:s,isOptional:!1,defaultValue:"received"},intent:{type:f,isOptional:!0},attachments:{type:m,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),x=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}}}),b=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:r,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:n,isArray:!0,isOptional:!1},links:{type:g,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}}}),c=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:l,isOptional:!1,defaultValue:"draft_only"}}}),T=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:o,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:p,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:c,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}}}),k=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:c,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}}}),M=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:a,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}}});export{l as ActionSafetyModeEnum,M as AgentSuggestionModel,m as AttachmentModel,d as ChannelAccountModel,n as ChannelTypeEnum,c as CommunicationActionModel,x as CommunicationFormIntakeModel,I as CommunicationMessageModel,C as CommunicationParticipantModel,k as CommunicationSummaryModel,b as CommunicationThreadModel,_ as FeedbackOutcomeEnum,v as HandoffPacketModel,p as HandoffStatusEnum,y as IdentityLinkModel,u as IntentCategoryEnum,f as MessageIntentModel,s as MessageStatusEnum,T as ReplyDraftModel,o as ReplyStatusEnum,a as SuggestionStatusEnum,g as ThreadLinkModel,r as ThreadStatusEnum};
@@ -0,0 +1 @@
1
+ var i=new Set(["send_reply","create_handoff","link_thread","request_escalation"]),t=new Set(["send_reply"]),a=new Set(["create_thread","ingest_message","classify_intent","generate_summary","extract_actions","draft_reply","propose_identity_link","record_feedback"]);function r(e){let n=i.has(e);if(e==="read")return{actionKind:e,authorityClass:"read",autonomyClass:"read_only",requiresApproval:!1,highImpact:n,reason:"Read-only CommunicationOS inspection is not a customer-facing mutation."};if(a.has(e))return{actionKind:e,authorityClass:"draft",autonomyClass:"draft_only",requiresApproval:!1,highImpact:n,reason:"CommunicationOS drafting and evidence preparation persist reviewable records without sending or mutating external systems."};return{actionKind:e,authorityClass:t.has(e)?"reserved_human":"execute",autonomyClass:t.has(e)?"reserved_human_only":"approval_required",requiresApproval:!0,highImpact:n,reason:"Customer-facing or cross-owner CommunicationOS mutations require explicit operator approval evidence before execution."}}function s(e){let n=r(e.actionKind),o=[];if(e.actorKind==="agent"&&e.mode!=="draft"&&n.highImpact)o.push({code:"agent_execution_forbidden",message:"Agent CommunicationOS commands may read or draft but cannot execute customer-facing or cross-owner actions directly.",path:"mode"});if(n.requiresApproval&&!e.approvalEvidence)o.push({code:"approval_required",message:"High-impact CommunicationOS actions require approval evidence before authorized execution.",path:"approvalEvidence"});if((e.actionKind==="send_reply"||e.actionKind==="create_handoff")&&!e.targetId)o.push({code:"source_evidence_required",message:"Customer-facing replies and handoffs require a target evidence record.",path:"targetId"});return o}export{r as classifyCommunicationAction,s as validateAgentCommunicationCommand};
@@ -0,0 +1 @@
1
+ import{defineEnum as o}from"@lssm/lib.schema";var r=o("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),s=o("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),c=o("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),m=o("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),u=o("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),d=o("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),p=o("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),l=o("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),g=o("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{CompanyOsTenantGovernanceEnvelopeSchema as h}from"@lssm/lib.companyos-spec/types/tenant-governance-envelope";import{z as e}from"zod";var C=e.string().min(1),y=e.enum(["inbound","outbound","internal"]),S=e.enum(["not_required","pending","applied","partially_applied"]),a=e.object({id:e.string().min(1),schemaVersion:e.literal("1.0.0"),channel:C,direction:y,threadRef:e.string().min(1),messageRef:e.string().min(1),participantRefs:e.array(e.string().min(1)).min(1),observedAt:e.string().datetime(),bodyNormalized:e.string().min(1),consent:e.object({status:e.enum(["not_recorded","granted","withdrawn","expired"]),subjectConsentRef:e.string().min(1).optional(),legalBasisRef:e.string().min(1).optional()}).strict(),redaction:e.object({status:S,redactedFields:e.array(e.string().min(1)),decisionRef:e.string().min(1).optional()}).strict(),evidenceRefs:e.array(e.string().min(1)).min(1),source:e.object({adapterRef:e.string().min(1),externalRecordRef:e.string().min(1),networkAccessed:e.literal(!1)}).strict()}).strict(),I=e.object({ingestion:a,governance:h}).strict().superRefine((n,t)=>{if(n.governance.subjectRef.id!==n.ingestion.id)t.addIssue({code:"custom",path:["governance","subjectRef","id"],message:"governance subject must reference the normalized ingestion"});if(n.governance.subjectRef.type!=="communication.ingestion")t.addIssue({code:"custom",path:["governance","subjectRef","type"],message:"governance subject type must be communication.ingestion"})}),w={thread:"CommunicationThread",message:"CommunicationMessage",participant:"CommunicationParticipant",consent:"SubjectConsent"};var _=new Set(["send_reply","create_handoff","link_thread","request_escalation"]),f=new Set(["send_reply"]),v=new Set(["create_thread","ingest_message","classify_intent","generate_summary","extract_actions","draft_reply","propose_identity_link","record_feedback"]);function x(n){let t=_.has(n);if(n==="read")return{actionKind:n,authorityClass:"read",autonomyClass:"read_only",requiresApproval:!1,highImpact:t,reason:"Read-only CommunicationOS inspection is not a customer-facing mutation."};if(v.has(n))return{actionKind:n,authorityClass:"draft",autonomyClass:"draft_only",requiresApproval:!1,highImpact:t,reason:"CommunicationOS drafting and evidence preparation persist reviewable records without sending or mutating external systems."};return{actionKind:n,authorityClass:f.has(n)?"reserved_human":"execute",autonomyClass:f.has(n)?"reserved_human_only":"approval_required",requiresApproval:!0,highImpact:t,reason:"Customer-facing or cross-owner CommunicationOS mutations require explicit operator approval evidence before execution."}}function j(n){let t=x(n.actionKind),i=[];if(n.actorKind==="agent"&&n.mode!=="draft"&&t.highImpact)i.push({code:"agent_execution_forbidden",message:"Agent CommunicationOS commands may read or draft but cannot execute customer-facing or cross-owner actions directly.",path:"mode"});if(t.requiresApproval&&!n.approvalEvidence)i.push({code:"approval_required",message:"High-impact CommunicationOS actions require approval evidence before authorized execution.",path:"approvalEvidence"});if((n.actionKind==="send_reply"||n.actionKind==="create_handoff")&&!n.targetId)i.push({code:"source_evidence_required",message:"Customer-facing replies and handoffs require a target evidence record.",path:"targetId"});return i}var O={ActionSafetyModeEnum:l,ChannelTypeEnum:r,FeedbackOutcomeEnum:g,HandoffStatusEnum:u,IntentCategoryEnum:p,MessageStatusEnum:c,NormalizedCommunicationIngestionRecordSchema:a,ReplyStatusEnum:m,SuggestionStatusEnum:d,ThreadStatusEnum:s};export{O as CommunicationSpecValidationModels,x as classifyCommunicationAction,j as validateAgentCommunicationCommand};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export { ListCommunicationGovernedWorkV1Query } from '../contracts/ecosystem-governed-work.operations.js';
2
+ export { ListCommunicationAccountsV2Query, ListCommunicationContactsV2Query, } from '../contracts/ecosystem-identity.operations.js';
3
+ export { SearchCommunicationMessagesV2Query } from '../contracts/ecosystem-message.operations.js';
4
+ export * from '../contracts/query.operations.js';
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{defineCommand as R,defineQuery as se,docId as re}from"@lssm/lib.contracts-spec";import{defineEnum as j,defineSchemaModel as C,ScalarTypeEnum as o}from"@lssm/lib.schema";import{defineEnum as l,defineSchemaModel as r,ScalarTypeEnum as t}from"@lssm/lib.schema";var Z=l("CommunicationSpaceKind",["personal","organization"]),ee=l("CommunicationPrincipalKind",["human","agent","system"]),te=l("CommunicationConnectionPlacement",["device","managed_cloud","self_hosted"]),De=l("CommunicationConnectionNetwork",["email","sms","slack","teams","telegram","whatsapp","discord","matrix"]),ne=l("CommunicationEncryptionMode",["client_encrypted","governed_server_indexable"]),ie=l("CommunicationMembershipState",["active","revoked"]),D=l("CommunicationReceiptKind",["delivered","read"]),ae=l("CommunicationConnectionHealth",["connecting","healthy","degraded","offline","revoked"]),E={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"},S=r({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}}}),Ee=r({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:Z,isOptional:!1},encryptionMode:{type:ne,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1}}}),Re=r({name:"CommunicationPrincipalV2",description:"Auditable human, agent, or system identity",fields:{id:{type:t.String_unsecure(),isOptional:!1},kind:{type:ee,isOptional:!1},displayName:{type:t.String_unsecure(),isOptional:!1},ownerPrincipalId:{type:t.String_unsecure(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1}}}),je=r({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}}}),Ne=r({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:ie,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}}}),Le=r({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:te,isOptional:!1},externalAccountRef:{type:t.String_unsecure(),isOptional:!1},credentialRef:{type:t.String_unsecure(),isOptional:!1},health:{type:ae,isOptional:!1},capabilities:{type:t.String_unsecure(),isArray:!0,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),oe=r({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}}}),m=r({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:oe,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}}}),Pe=r({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 x=["platform.communication-os"],ce={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"},b=[re(ce.id)],pe=j("CommunicationGovernedWorkKind",["identity_review","draft","action","handoff","escalation","triage","summary","agent","consent","retention","policy"]),N=j("CommunicationGovernedWorkStatus",["pending","approved","rejected","blocked","resolved","revoked"]),_=C({name:"CommunicationGovernedWorkV1",fields:{id:{type:o.String_unsecure(),isOptional:!1},kind:{type:pe,isOptional:!1},status:{type:N,isOptional:!1},title:{type:o.String_unsecure(),isOptional:!1},threadId:{type:o.String_unsecure(),isOptional:!0},details:{type:o.JSONObject(),isOptional:!1},revision:{type:o.Int_unsecure(),isOptional:!1},createdBy:{type:o.String_unsecure(),isOptional:!1},createdAt:{type:o.DateTime(),isOptional:!1},updatedBy:{type:o.String_unsecure(),isOptional:!1},updatedAt:{type:o.DateTime(),isOptional:!1}}}),ue=se({meta:{key:"communication.governed_work.list",version:"1.0.0",stability:"experimental",owners:[...x],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:b},io:{input:S,output:C({name:"ListCommunicationGovernedWorkV1Output",fields:{items:{type:_,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),Qe=R({meta:{key:"communication.governed_work.create",version:"1.0.0",stability:"experimental",owners:[...x],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:b},io:{input:_,output:_},policy:{auth:"user"}}),Ke=R({meta:{key:"communication.governed_work.transition",version:"1.0.0",stability:"experimental",owners:[...x],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:b},io:{input:C({name:"TransitionCommunicationGovernedWorkV1Input",fields:{workId:{type:o.String_unsecure(),isOptional:!1},status:{type:N,isOptional:!1},reason:{type:o.String_unsecure(),isOptional:!0}}}),output:_},policy:{auth:"user"}});import{defineCommand as le,defineQuery as P,docId as de}from"@lssm/lib.contracts-spec";import{defineEnum as me,defineSchemaModel as O,ScalarTypeEnum as i}from"@lssm/lib.schema";var k=["platform.communication-os"],ye={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"},A=[de(ye.id)],L=me("CommunicationIdentityReviewStatus",["pending","merged","rejected"]),ge=O({name:"CommunicationAccountV2",description:"Public-safe provider account projection in one authorized space",fields:{id:{type:i.String_unsecure(),isOptional:!1},network:{type:i.String_unsecure(),isOptional:!1},externalAccountRef:{type:i.String_unsecure(),isOptional:!1},placement:{type:i.String_unsecure(),isOptional:!1},health:{type:i.String_unsecure(),isOptional:!1},createdAt:{type:i.DateTime(),isOptional:!1},updatedAt:{type:i.DateTime(),isOptional:!1}}}),fe=O({name:"CommunicationContactV2",description:"Participant projection derived from persisted scoped messages",fields:{principalId:{type:i.String_unsecure(),isOptional:!1},displayName:{type:i.String_unsecure(),isOptional:!0},roomIds:{type:i.String_unsecure(),isArray:!0,isOptional:!1},messageCount:{type:i.Int_unsecure(),isOptional:!1},lastSeenAt:{type:i.DateTime(),isOptional:!1}}}),Oe=O({name:"ListCommunicationAccountsV2Output",fields:{accounts:{type:ge,isArray:!0,isOptional:!1}}}),Se=O({name:"ListCommunicationContactsV2Output",fields:{contacts:{type:fe,isArray:!0,isOptional:!1}}}),he=P({meta:{key:"communication.account.list",version:"2.0.0",stability:"experimental",owners:[...k],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:A},io:{input:S,output:Oe},policy:{auth:"user"}}),_e=P({meta:{key:"communication.contact.list",version:"2.0.0",stability:"experimental",owners:[...k],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:A},io:{input:S,output:Se},policy:{auth:"user"}}),He=le({meta:{key:"communication.identity.decide",version:"1.0.0",stability:"experimental",owners:[...k],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:A},io:{input:O({name:"DecideCommunicationIdentityV1Input",fields:{reviewId:{type:i.String_unsecure(),isOptional:!1},decision:{type:L,isOptional:!1},reason:{type:i.String_unsecure(),isOptional:!0}}}),output:O({name:"DecideCommunicationIdentityV1Output",fields:{reviewId:{type:i.String_unsecure(),isOptional:!1},status:{type:L,isOptional:!1},revision:{type:i.Int_unsecure(),isOptional:!1}}})},policy:{auth:"admin"}});import{defineCommand as y,defineQuery as G,docId as ve}from"@lssm/lib.contracts-spec";import{defineSchemaModel as d,ScalarTypeEnum as n}from"@lssm/lib.schema";var c=["platform.communication-os"],p=[ve(E.id)],Q={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."}},et=y({meta:{key:"communication.message.send",version:"2.1.0",stability:"experimental",owners:[...c],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:p},io:{input:m,output:m},policy:{auth:"user"}}),Ie=d({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}}}),tt=y({meta:{key:"communication.message.send",version:"3.0.0",stability:"experimental",owners:[...c],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:p},io:{input:Ie,output:m,errors:Q},policy:{auth:"user"}}),K=d({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}}}),nt=y({meta:{key:"communication.message.edit",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:K,output:m},policy:{auth:"user"}}),it=y({meta:{key:"communication.message.delete",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:K,output:m},policy:{auth:"user"}}),B=d({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}}}),at=y({meta:{key:"communication.reaction.set",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:B,output:B},policy:{auth:"user"}}),q=d({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:D,isOptional:!1},occurredAt:{type:n.DateTime(),isOptional:!1}}}),ot=y({meta:{key:"communication.receipt.record",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:q,output:q},policy:{auth:"user"}}),z=d({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}}}),st=y({meta:{key:"communication.inbox-state.set",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:z,output:z},policy:{auth:"user"}}),Ce=d({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}}}),W=d({name:"SearchCommunicationMessagesV2Output",fields:{messages:{type:m,isArray:!0,isOptional:!1},nextCursor:{type:n.String_unsecure(),isOptional:!0}}}),xe=G({meta:{key:"communication.message.search",version:"2.0.0",stability:"experimental",owners:[...c],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:p},io:{input:Ce,output:W},policy:{auth:"user"}}),be=d({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}}}),rt=G({meta:{key:"communication.message.search",version:"3.0.0",stability:"experimental",owners:[...c],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:p},io:{input:be,output:W,errors:Q},policy:{auth:"user"}}),ct={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."]},pt={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."]},ut={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 Te,defineQuery as V}from"@lssm/lib.contracts-spec/operations";import{defineSchemaModel as f,ScalarTypeEnum as s}from"@lssm/lib.schema";import{defineEnum as u}from"@lssm/lib.schema";var g=u("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),h=u("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),J=u("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),U=u("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),F=u("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),w=u("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),H=u("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),Y=u("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),mt=u("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{defineSchemaModel as a,ScalarTypeEnum as e}from"@lssm/lib.schema";var ke=a({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:g,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}}}),Ae=a({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:w,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}}}),Ot=a({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:ke,isArray:!0,isOptional:!1},identityLinks:{type:Ae,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),we=a({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}}}),M=a({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}}}),Me=a({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:H,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}}}),T=a({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:g,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:J,isOptional:!1,defaultValue:"received"},intent:{type:Me,isOptional:!0},attachments:{type:we,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),St=a({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:g,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}}}),v=a({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:h,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:g,isArray:!0,isOptional:!1},links:{type:M,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=a({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:Y,isOptional:!1,defaultValue:"draft_only"}}}),ht=a({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:U,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=a({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: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}}}),vt=a({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}}}),It=a({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:w,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 I=["platform.communication-os"],wt=Te({meta:{key:"communication.thread.updateStatus",version:"1.0.0",stability:"experimental",owners:[...I],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:f({name:"UpdateThreadStatusInput",fields:{threadId:{type:s.String_unsecure(),isOptional:!1},status:{type:h,isOptional:!1},reason:{type:s.String_unsecure(),isOptional:!0}}}),output:v},policy:{auth:"user"}}),Mt=V({meta:{key:"communication.thread.get",version:"1.0.0",stability:"experimental",owners:[...I],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:f({name:"GetThreadInput",fields:{threadId:{type:s.String_unsecure(),isOptional:!1}}}),output:f({name:"GetThreadOutput",fields:{thread:{type:v,isOptional:!1},messages:{type:T,isArray:!0,isOptional:!1},links:{type:M,isArray:!0,isOptional:!0}}})},policy:{auth:"user"}}),Tt=V({meta:{key:"communication.thread.search",version:"1.0.0",stability:"experimental",owners:[...I],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:f({name:"SearchThreadsInput",fields:{status:{type:h,isOptional:!0},participantId:{type:s.String_unsecure(),isOptional:!0},channelType:{type:g,isOptional:!0},linkedKindId:{type:s.String_unsecure(),isOptional:!0},linkedInstanceId:{type:s.String_unsecure(),isOptional:!0},assignedTo:{type:s.String_unsecure(),isOptional:!0},limit:{type:s.Int_unsecure(),isOptional:!0,defaultValue:20}}}),output:f({name:"SearchThreadsOutput",fields:{threads:{type:v,isArray:!0,isOptional:!1},total:{type:s.Int_unsecure(),isOptional:!1},hasMore:{type:s.Boolean(),isOptional:!1}}})},policy:{auth:"user"}}),Vt=V({meta:{key:"communication.message.list",version:"1.0.0",stability:"experimental",owners:[...I],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:f({name:"ListMessagesInput",fields:{threadId:{type:s.String_unsecure(),isOptional:!1}}}),output:f({name:"ListMessagesOutput",fields:{messages:{type:T,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}});export{Mt as GetThreadQuery,he as ListCommunicationAccountsV2Query,_e as ListCommunicationContactsV2Query,ue as ListCommunicationGovernedWorkV1Query,Vt as ListMessagesQuery,xe as SearchCommunicationMessagesV2Query,Tt as SearchThreadsQuery,wt as UpdateThreadStatusCommand};
@@ -0,0 +1,54 @@
1
+ export type CommunicationActorKind = 'operator' | 'agent' | 'system' | 'adapter' | 'participant';
2
+ export type CommunicationAuthorityClass = 'read' | 'draft' | 'execute' | 'reserved_human';
3
+ export type CommunicationAutonomyClass = 'read_only' | 'draft_only' | 'approval_required' | 'reserved_human_only';
4
+ export type CommunicationActionKind = 'read' | 'create_thread' | 'ingest_message' | 'classify_intent' | 'generate_summary' | 'extract_actions' | 'draft_reply' | 'send_reply' | 'create_handoff' | 'link_thread' | 'propose_identity_link' | 'request_escalation' | 'record_feedback';
5
+ export interface CommunicationApprovalEvidence {
6
+ approvalId: string;
7
+ approvedBy: string;
8
+ approvedAt: string;
9
+ policyRefs?: string[];
10
+ }
11
+ export interface CommunicationActionClassification {
12
+ actionKind: CommunicationActionKind;
13
+ authorityClass: CommunicationAuthorityClass;
14
+ autonomyClass: CommunicationAutonomyClass;
15
+ requiresApproval: boolean;
16
+ highImpact: boolean;
17
+ reason: string;
18
+ }
19
+ export interface AgentCommunicationCommand {
20
+ id: string;
21
+ actionKind: CommunicationActionKind;
22
+ actorKind: CommunicationActorKind;
23
+ targetType: 'thread' | 'message' | 'reply_draft' | 'handoff' | 'thread_link' | 'identity_link' | 'action' | 'feedback' | 'escalation';
24
+ targetId: string;
25
+ mode: 'read' | 'draft';
26
+ approvalEvidence?: CommunicationApprovalEvidence;
27
+ }
28
+ export interface CommunicationSemanticViolation {
29
+ code: 'agent_execution_forbidden' | 'approval_required' | 'source_evidence_required';
30
+ message: string;
31
+ path?: string;
32
+ }
33
+ export type CommunicationCommandInboxStatus = 'accepted_draft' | 'approval_required' | 'blocked';
34
+ export interface CommunicationCommandInboxBridgeRef {
35
+ status: 'not_required' | 'approval_required' | 'blocked';
36
+ targetRefId?: string;
37
+ requiredApprovalIds: string[];
38
+ reason: string;
39
+ }
40
+ export interface CommunicationCommandInboxItemContract {
41
+ id: string;
42
+ commandId: string;
43
+ status: CommunicationCommandInboxStatus;
44
+ operation: `communication.${string}`;
45
+ actionKind: CommunicationActionKind;
46
+ targetType: AgentCommunicationCommand['targetType'];
47
+ targetId: string;
48
+ blockedSignals: string[];
49
+ aipControlRefs: string[];
50
+ reasons: string[];
51
+ canExecute: false;
52
+ companyOsBridge: CommunicationCommandInboxBridgeRef;
53
+ persistedEventId: string;
54
+ }
@@ -0,0 +1 @@
1
+ // @bun
@@ -0,0 +1,3 @@
1
+ export * from '../contracts/enums.js';
2
+ export * from '../contracts/models.js';
3
+ export * from './domain-command.js';
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{defineEnum as i}from"@lssm/lib.schema";var n=i("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),r=i("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),s=i("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),o=i("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),p=i("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),a=i("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),u=i("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),l=i("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),_=i("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{defineSchemaModel as t,ScalarTypeEnum as e}from"@lssm/lib.schema";var d=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}}}),y=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:a,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}}}),C=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:d,isArray:!0,isOptional:!1},identityLinks:{type:y,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),m=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}}}),g=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}}}),f=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:u,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}}}),I=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:s,isOptional:!1,defaultValue:"received"},intent:{type:f,isOptional:!0},attachments:{type:m,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),x=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}}}),b=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:r,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:n,isArray:!0,isOptional:!1},links:{type:g,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}}}),c=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:l,isOptional:!1,defaultValue:"draft_only"}}}),T=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:o,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:p,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:c,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}}}),k=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:c,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}}}),M=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:a,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}}});export{l as ActionSafetyModeEnum,M as AgentSuggestionModel,m as AttachmentModel,d as ChannelAccountModel,n as ChannelTypeEnum,c as CommunicationActionModel,x as CommunicationFormIntakeModel,I as CommunicationMessageModel,C as CommunicationParticipantModel,k as CommunicationSummaryModel,b as CommunicationThreadModel,_ as FeedbackOutcomeEnum,v as HandoffPacketModel,p as HandoffStatusEnum,y as IdentityLinkModel,u as IntentCategoryEnum,f as MessageIntentModel,s as MessageStatusEnum,T as ReplyDraftModel,o as ReplyStatusEnum,a as SuggestionStatusEnum,g as ThreadLinkModel,r as ThreadStatusEnum};
@@ -0,0 +1,3 @@
1
+ import type { AgentCommunicationCommand, CommunicationActionClassification, CommunicationActionKind, CommunicationSemanticViolation } from '../types/domain-command.js';
2
+ export declare function classifyCommunicationAction(actionKind: CommunicationActionKind): CommunicationActionClassification;
3
+ export declare function validateAgentCommunicationCommand(command: AgentCommunicationCommand): CommunicationSemanticViolation[];
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ var i=new Set(["send_reply","create_handoff","link_thread","request_escalation"]),t=new Set(["send_reply"]),a=new Set(["create_thread","ingest_message","classify_intent","generate_summary","extract_actions","draft_reply","propose_identity_link","record_feedback"]);function r(e){let n=i.has(e);if(e==="read")return{actionKind:e,authorityClass:"read",autonomyClass:"read_only",requiresApproval:!1,highImpact:n,reason:"Read-only CommunicationOS inspection is not a customer-facing mutation."};if(a.has(e))return{actionKind:e,authorityClass:"draft",autonomyClass:"draft_only",requiresApproval:!1,highImpact:n,reason:"CommunicationOS drafting and evidence preparation persist reviewable records without sending or mutating external systems."};return{actionKind:e,authorityClass:t.has(e)?"reserved_human":"execute",autonomyClass:t.has(e)?"reserved_human_only":"approval_required",requiresApproval:!0,highImpact:n,reason:"Customer-facing or cross-owner CommunicationOS mutations require explicit operator approval evidence before execution."}}function s(e){let n=r(e.actionKind),o=[];if(e.actorKind==="agent"&&e.mode!=="draft"&&n.highImpact)o.push({code:"agent_execution_forbidden",message:"Agent CommunicationOS commands may read or draft but cannot execute customer-facing or cross-owner actions directly.",path:"mode"});if(n.requiresApproval&&!e.approvalEvidence)o.push({code:"approval_required",message:"High-impact CommunicationOS actions require approval evidence before authorized execution.",path:"approvalEvidence"});if((e.actionKind==="send_reply"||e.actionKind==="create_handoff")&&!e.targetId)o.push({code:"source_evidence_required",message:"Customer-facing replies and handoffs require a target evidence record.",path:"targetId"});return o}export{r as classifyCommunicationAction,s as validateAgentCommunicationCommand};
@@ -0,0 +1,53 @@
1
+ export * from './domain-command.js';
2
+ export declare const CommunicationSpecValidationModels: {
3
+ readonly ActionSafetyModeEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string]>;
4
+ readonly ChannelTypeEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string, string, string, string, string, string, string]>;
5
+ readonly FeedbackOutcomeEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string]>;
6
+ readonly HandoffStatusEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string]>;
7
+ readonly IntentCategoryEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string, string, string, string, string, string]>;
8
+ readonly MessageStatusEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string, string, string]>;
9
+ readonly NormalizedCommunicationIngestionRecordSchema: import("zod").ZodObject<{
10
+ id: import("zod").ZodString;
11
+ schemaVersion: import("zod").ZodLiteral<"1.0.0">;
12
+ channel: import("zod").ZodString;
13
+ direction: import("zod").ZodEnum<{
14
+ inbound: "inbound";
15
+ internal: "internal";
16
+ outbound: "outbound";
17
+ }>;
18
+ threadRef: import("zod").ZodString;
19
+ messageRef: import("zod").ZodString;
20
+ participantRefs: import("zod").ZodArray<import("zod").ZodString>;
21
+ observedAt: import("zod").ZodString;
22
+ bodyNormalized: import("zod").ZodString;
23
+ consent: import("zod").ZodObject<{
24
+ status: import("zod").ZodEnum<{
25
+ expired: "expired";
26
+ granted: "granted";
27
+ not_recorded: "not_recorded";
28
+ withdrawn: "withdrawn";
29
+ }>;
30
+ subjectConsentRef: import("zod").ZodOptional<import("zod").ZodString>;
31
+ legalBasisRef: import("zod").ZodOptional<import("zod").ZodString>;
32
+ }, import("zod/v4/core").$strict>;
33
+ redaction: import("zod").ZodObject<{
34
+ status: import("zod").ZodEnum<{
35
+ applied: "applied";
36
+ not_required: "not_required";
37
+ partially_applied: "partially_applied";
38
+ pending: "pending";
39
+ }>;
40
+ redactedFields: import("zod").ZodArray<import("zod").ZodString>;
41
+ decisionRef: import("zod").ZodOptional<import("zod").ZodString>;
42
+ }, import("zod/v4/core").$strict>;
43
+ evidenceRefs: import("zod").ZodArray<import("zod").ZodString>;
44
+ source: import("zod").ZodObject<{
45
+ adapterRef: import("zod").ZodString;
46
+ externalRecordRef: import("zod").ZodString;
47
+ networkAccessed: import("zod").ZodLiteral<false>;
48
+ }, import("zod/v4/core").$strict>;
49
+ }, import("zod/v4/core").$strict>;
50
+ readonly ReplyStatusEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string, string]>;
51
+ readonly SuggestionStatusEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string, string, string]>;
52
+ readonly ThreadStatusEnum: import("@lssm/lib.schema").EnumType<[string, string, string, string, string, string]>;
53
+ };
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{defineEnum as o}from"@lssm/lib.schema";var r=o("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),s=o("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),c=o("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),m=o("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),u=o("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),d=o("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),p=o("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),l=o("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),g=o("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{CompanyOsTenantGovernanceEnvelopeSchema as h}from"@lssm/lib.companyos-spec/types/tenant-governance-envelope";import{z as e}from"zod";var C=e.string().min(1),y=e.enum(["inbound","outbound","internal"]),S=e.enum(["not_required","pending","applied","partially_applied"]),a=e.object({id:e.string().min(1),schemaVersion:e.literal("1.0.0"),channel:C,direction:y,threadRef:e.string().min(1),messageRef:e.string().min(1),participantRefs:e.array(e.string().min(1)).min(1),observedAt:e.string().datetime(),bodyNormalized:e.string().min(1),consent:e.object({status:e.enum(["not_recorded","granted","withdrawn","expired"]),subjectConsentRef:e.string().min(1).optional(),legalBasisRef:e.string().min(1).optional()}).strict(),redaction:e.object({status:S,redactedFields:e.array(e.string().min(1)),decisionRef:e.string().min(1).optional()}).strict(),evidenceRefs:e.array(e.string().min(1)).min(1),source:e.object({adapterRef:e.string().min(1),externalRecordRef:e.string().min(1),networkAccessed:e.literal(!1)}).strict()}).strict(),I=e.object({ingestion:a,governance:h}).strict().superRefine((n,t)=>{if(n.governance.subjectRef.id!==n.ingestion.id)t.addIssue({code:"custom",path:["governance","subjectRef","id"],message:"governance subject must reference the normalized ingestion"});if(n.governance.subjectRef.type!=="communication.ingestion")t.addIssue({code:"custom",path:["governance","subjectRef","type"],message:"governance subject type must be communication.ingestion"})}),w={thread:"CommunicationThread",message:"CommunicationMessage",participant:"CommunicationParticipant",consent:"SubjectConsent"};var _=new Set(["send_reply","create_handoff","link_thread","request_escalation"]),f=new Set(["send_reply"]),v=new Set(["create_thread","ingest_message","classify_intent","generate_summary","extract_actions","draft_reply","propose_identity_link","record_feedback"]);function x(n){let t=_.has(n);if(n==="read")return{actionKind:n,authorityClass:"read",autonomyClass:"read_only",requiresApproval:!1,highImpact:t,reason:"Read-only CommunicationOS inspection is not a customer-facing mutation."};if(v.has(n))return{actionKind:n,authorityClass:"draft",autonomyClass:"draft_only",requiresApproval:!1,highImpact:t,reason:"CommunicationOS drafting and evidence preparation persist reviewable records without sending or mutating external systems."};return{actionKind:n,authorityClass:f.has(n)?"reserved_human":"execute",autonomyClass:f.has(n)?"reserved_human_only":"approval_required",requiresApproval:!0,highImpact:t,reason:"Customer-facing or cross-owner CommunicationOS mutations require explicit operator approval evidence before execution."}}function j(n){let t=x(n.actionKind),i=[];if(n.actorKind==="agent"&&n.mode!=="draft"&&t.highImpact)i.push({code:"agent_execution_forbidden",message:"Agent CommunicationOS commands may read or draft but cannot execute customer-facing or cross-owner actions directly.",path:"mode"});if(t.requiresApproval&&!n.approvalEvidence)i.push({code:"approval_required",message:"High-impact CommunicationOS actions require approval evidence before authorized execution.",path:"approvalEvidence"});if((n.actionKind==="send_reply"||n.actionKind==="create_handoff")&&!n.targetId)i.push({code:"source_evidence_required",message:"Customer-facing replies and handoffs require a target evidence record.",path:"targetId"});return i}var O={ActionSafetyModeEnum:l,ChannelTypeEnum:r,FeedbackOutcomeEnum:g,HandoffStatusEnum:u,IntentCategoryEnum:p,MessageStatusEnum:c,NormalizedCommunicationIngestionRecordSchema:a,ReplyStatusEnum:m,SuggestionStatusEnum:d,ThreadStatusEnum:s};export{O as CommunicationSpecValidationModels,x as classifyCommunicationAction,j as validateAgentCommunicationCommand};