@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,272 @@
1
+ /**
2
+ * AI-routing entry point for thread summarization.
3
+ *
4
+ * Produces a `CommunicationSummaryModel` scoped to the requesting persona.
5
+ * Draft-only: does not persist, does not mutate thread state.
6
+ *
7
+ * Auditor lens: the capability gate (E2) restricts `audiencePersona` to
8
+ * `'auditor'` for auditor actors; handler must redact PII fields accordingly.
9
+ */
10
+ export declare const CommsThreadSummarizeCommand: import("@lssm/lib.contracts-spec").OperationSpec<import("@lssm/lib.schema").SchemaModel<{
11
+ threadId: {
12
+ type: import("@lssm/lib.schema").FieldType<string, string>;
13
+ isOptional: false;
14
+ };
15
+ messageIds: {
16
+ type: import("@lssm/lib.schema").FieldType<string, string>;
17
+ isArray: true;
18
+ isOptional: true;
19
+ };
20
+ /**
21
+ * Target persona key for role-adaptive redaction. Defaults to the
22
+ * requesting actor's resolved persona when absent.
23
+ */
24
+ audiencePersona: {
25
+ type: import("@lssm/lib.schema").FieldType<string, string>;
26
+ isOptional: true;
27
+ };
28
+ }>, import("@lssm/lib.schema").SchemaModel<{
29
+ id: {
30
+ type: import("@lssm/lib.schema").FieldType<string, string>;
31
+ isOptional: false;
32
+ };
33
+ threadId: {
34
+ type: import("@lssm/lib.schema").FieldType<string, string>;
35
+ isOptional: false;
36
+ };
37
+ messageIds: {
38
+ type: import("@lssm/lib.schema").FieldType<string, string>;
39
+ isArray: true;
40
+ isOptional: true;
41
+ };
42
+ content: {
43
+ type: import("@lssm/lib.schema").FieldType<string, string>;
44
+ isOptional: false;
45
+ };
46
+ facts: {
47
+ type: import("@lssm/lib.schema").FieldType<Record<string, unknown>, Record<string, unknown>>;
48
+ isArray: true;
49
+ isOptional: true;
50
+ };
51
+ actions: {
52
+ type: import("@lssm/lib.schema").SchemaModel<{
53
+ id: {
54
+ type: import("@lssm/lib.schema").FieldType<string, string>;
55
+ isOptional: false;
56
+ };
57
+ threadId: {
58
+ type: import("@lssm/lib.schema").FieldType<string, string>;
59
+ isOptional: false;
60
+ };
61
+ title: {
62
+ type: import("@lssm/lib.schema").FieldType<string, string>;
63
+ isOptional: false;
64
+ };
65
+ owner: {
66
+ type: import("@lssm/lib.schema").FieldType<string, string>;
67
+ isOptional: true;
68
+ };
69
+ deadline: {
70
+ type: import("@lssm/lib.schema").FieldType<Date, string>;
71
+ isOptional: true;
72
+ };
73
+ blockers: {
74
+ type: import("@lssm/lib.schema").FieldType<string, string>;
75
+ isArray: true;
76
+ isOptional: true;
77
+ };
78
+ sourceMessageIds: {
79
+ type: import("@lssm/lib.schema").FieldType<string, string>;
80
+ isArray: true;
81
+ isOptional: false;
82
+ };
83
+ safetyMode: {
84
+ type: import("@lssm/lib.schema").EnumType<[string, string, string, string, string]>;
85
+ isOptional: false;
86
+ defaultValue: string;
87
+ };
88
+ }>;
89
+ isArray: true;
90
+ isOptional: true;
91
+ };
92
+ decisions: {
93
+ type: import("@lssm/lib.schema").FieldType<Record<string, unknown>, Record<string, unknown>>;
94
+ isArray: true;
95
+ isOptional: true;
96
+ };
97
+ risks: {
98
+ type: import("@lssm/lib.schema").FieldType<Record<string, unknown>, Record<string, unknown>>;
99
+ isArray: true;
100
+ isOptional: true;
101
+ };
102
+ modelName: {
103
+ type: import("@lssm/lib.schema").FieldType<string, string>;
104
+ isOptional: true;
105
+ };
106
+ generatedAt: {
107
+ type: import("@lssm/lib.schema").FieldType<Date, string>;
108
+ isOptional: false;
109
+ };
110
+ }>, undefined>;
111
+ /**
112
+ * AI-routing entry point for reply drafting.
113
+ *
114
+ * Produces a `ReplyDraftModel` with `status: 'drafted'` or
115
+ * `status: 'requires_review'` depending on policy evaluation.
116
+ * Draft-only: does not send. Use `communication.reply.send` to deliver.
117
+ *
118
+ * Auditor: capability gate (E2) must NOT expose this command to auditor actors;
119
+ * auditors receive `comms.thread.explainThread` (read-only lens) instead.
120
+ */
121
+ export declare const CommsReplyDraftCommand: import("@lssm/lib.contracts-spec").OperationSpec<import("@lssm/lib.schema").SchemaModel<{
122
+ threadId: {
123
+ type: import("@lssm/lib.schema").FieldType<string, string>;
124
+ isOptional: false;
125
+ };
126
+ messageId: {
127
+ type: import("@lssm/lib.schema").FieldType<string, string>;
128
+ isOptional: true;
129
+ };
130
+ instruction: {
131
+ type: import("@lssm/lib.schema").FieldType<string, string>;
132
+ isOptional: true;
133
+ };
134
+ /** Optional tone hint to guide the AI model (e.g. 'formal', 'brief'). */
135
+ toneHint: {
136
+ type: import("@lssm/lib.schema").FieldType<string, string>;
137
+ isOptional: true;
138
+ };
139
+ }>, import("@lssm/lib.schema").SchemaModel<{
140
+ id: {
141
+ type: import("@lssm/lib.schema").FieldType<string, string>;
142
+ isOptional: false;
143
+ };
144
+ threadId: {
145
+ type: import("@lssm/lib.schema").FieldType<string, string>;
146
+ isOptional: false;
147
+ };
148
+ messageId: {
149
+ type: import("@lssm/lib.schema").FieldType<string, string>;
150
+ isOptional: true;
151
+ };
152
+ body: {
153
+ type: import("@lssm/lib.schema").FieldType<string, string>;
154
+ isOptional: false;
155
+ };
156
+ status: {
157
+ type: import("@lssm/lib.schema").EnumType<[string, string, string, string, string, string]>;
158
+ isOptional: false;
159
+ defaultValue: string;
160
+ };
161
+ generatedBy: {
162
+ type: import("@lssm/lib.schema").FieldType<string, string>;
163
+ isOptional: true;
164
+ };
165
+ modelName: {
166
+ type: import("@lssm/lib.schema").FieldType<string, string>;
167
+ isOptional: true;
168
+ };
169
+ promptVersion: {
170
+ type: import("@lssm/lib.schema").FieldType<string, string>;
171
+ isOptional: true;
172
+ };
173
+ policyVersion: {
174
+ type: import("@lssm/lib.schema").FieldType<string, string>;
175
+ isOptional: true;
176
+ };
177
+ reviewedBy: {
178
+ type: import("@lssm/lib.schema").FieldType<string, string>;
179
+ isOptional: true;
180
+ };
181
+ reviewedAt: {
182
+ type: import("@lssm/lib.schema").FieldType<Date, string>;
183
+ isOptional: true;
184
+ };
185
+ metadata: {
186
+ type: import("@lssm/lib.schema").FieldType<Record<string, unknown>, Record<string, unknown>>;
187
+ isOptional: true;
188
+ };
189
+ createdAt: {
190
+ type: import("@lssm/lib.schema").FieldType<Date, string>;
191
+ isOptional: false;
192
+ };
193
+ updatedAt: {
194
+ type: import("@lssm/lib.schema").FieldType<Date, string>;
195
+ isOptional: false;
196
+ };
197
+ }>, undefined>;
198
+ /**
199
+ * AI-routing entry point for handoff suggestion.
200
+ *
201
+ * Analyses a thread and suggests whether a handoff is warranted, to whom,
202
+ * and with what context. Returns an `AgentSuggestionModel` — suggestion only.
203
+ *
204
+ * To act on the suggestion, use `communication.handoff.create`.
205
+ * Draft-only: does not mutate thread state or create a `HandoffPacket`.
206
+ *
207
+ * Auditor: capability gate (E2) may expose this in read-only form so the
208
+ * auditor can see handoff suggestions in the evidence-from-inbox lens without
209
+ * initiating one.
210
+ */
211
+ export declare const CommsHandoffSuggestCommand: import("@lssm/lib.contracts-spec").OperationSpec<import("@lssm/lib.schema").SchemaModel<{
212
+ threadId: {
213
+ type: import("@lssm/lib.schema").FieldType<string, string>;
214
+ isOptional: false;
215
+ };
216
+ /** Override the suggested recipient; AI will validate feasibility. */
217
+ suggestedToOwner: {
218
+ type: import("@lssm/lib.schema").FieldType<string, string>;
219
+ isOptional: true;
220
+ };
221
+ /** Additional context from the requesting actor. */
222
+ context: {
223
+ type: import("@lssm/lib.schema").FieldType<string, string>;
224
+ isOptional: true;
225
+ };
226
+ }>, import("@lssm/lib.schema").SchemaModel<{
227
+ id: {
228
+ type: import("@lssm/lib.schema").FieldType<string, string>;
229
+ isOptional: false;
230
+ };
231
+ threadId: {
232
+ type: import("@lssm/lib.schema").FieldType<string, string>;
233
+ isOptional: false;
234
+ };
235
+ messageId: {
236
+ type: import("@lssm/lib.schema").FieldType<string, string>;
237
+ isOptional: true;
238
+ };
239
+ suggestionType: {
240
+ type: import("@lssm/lib.schema").FieldType<string, string>;
241
+ isOptional: false;
242
+ };
243
+ content: {
244
+ type: import("@lssm/lib.schema").FieldType<string, string>;
245
+ isOptional: false;
246
+ };
247
+ status: {
248
+ type: import("@lssm/lib.schema").EnumType<[string, string, string, string, string, string, string]>;
249
+ isOptional: false;
250
+ defaultValue: string;
251
+ };
252
+ modelName: {
253
+ type: import("@lssm/lib.schema").FieldType<string, string>;
254
+ isOptional: true;
255
+ };
256
+ confidence: {
257
+ type: import("@lssm/lib.schema").FieldType<number, number>;
258
+ isOptional: true;
259
+ };
260
+ policyVersion: {
261
+ type: import("@lssm/lib.schema").FieldType<string, string>;
262
+ isOptional: true;
263
+ };
264
+ createdAt: {
265
+ type: import("@lssm/lib.schema").FieldType<Date, string>;
266
+ isOptional: false;
267
+ };
268
+ updatedAt: {
269
+ type: import("@lssm/lib.schema").FieldType<Date, string>;
270
+ isOptional: false;
271
+ };
272
+ }>, undefined>;
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{defineCommand as s}from"@lssm/lib.contracts-spec";import{defineSchemaModel as o,ScalarTypeEnum as i}from"@lssm/lib.schema";import{defineSchemaModel as t,ScalarTypeEnum as e}from"@lssm/lib.schema";import{defineEnum as a}from"@lssm/lib.schema";var n=a("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),u=a("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),l=a("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),d=a("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),c=a("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),r=a("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),y=a("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),m=a("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),w=a("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);var S=t({name:"ChannelAccount",description:"A channel account belonging to a participant",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:n,isOptional:!1},externalId:{type:e.String_unsecure(),isOptional:!1},displayName:{type:e.String_unsecure(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},isPrimary:{type:e.Boolean(),isOptional:!1,defaultValue:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),_=t({name:"IdentityLink",description:"Proposed or confirmed relationship between participant identities",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},candidateParticipantId:{type:e.String_unsecure(),isOptional:!1},status:{type:r,isOptional:!1,defaultValue:"generated"},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),E=t({name:"CommunicationParticipant",description:"A person or system that participates in conversations",fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!0},email:{type:e.EmailAddress(),isOptional:!0},accounts:{type:S,isArray:!0,isOptional:!1},identityLinks:{type:_,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),A=t({name:"Attachment",description:"A file or media attachment on a message",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},mimeType:{type:e.String_unsecure(),isOptional:!0},sizeBytes:{type:e.Int_unsecure(),isOptional:!0},url:{type:e.URL(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0}}}),I=t({name:"ThreadLink",description:"Link between a thread and an external business object (V2: rich-reference objectRef replaces V1 objectType/objectId)",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},objectRef:{type:e.JSONObject(),isOptional:!1},relation:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),T=t({name:"MessageIntent",description:"Classified message or thread intent with confidence and evidence",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},category:{type:y,isOptional:!1},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},evidenceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),C=t({name:"CommunicationMessage",description:"A single message within a communication thread",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:n,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},externalMessageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},bodyNormalized:{type:e.String_unsecure(),isOptional:!0},status:{type:l,isOptional:!1,defaultValue:"received"},intent:{type:T,isOptional:!0},attachments:{type:A,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),N=t({name:"CommunicationFormIntake",description:"Declarative source reference for a communication message mapped into an entity-bound form intake result",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:n,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},entityKey:{type:e.String_unsecure(),isOptional:!1},projectionKind:{type:e.String_unsecure(),isOptional:!1},formKey:{type:e.String_unsecure(),isOptional:!0},formVersion:{type:e.String_unsecure(),isOptional:!0},completionProfileKey:{type:e.String_unsecure(),isOptional:!0},acceptedValues:{type:e.JSONObject(),isOptional:!1},completionDebt:{type:e.JSONObject(),isArray:!0,isOptional:!1},captureStatus:{type:e.String_unsecure(),isOptional:!1,defaultValue:"accepted"},completionStatus:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),M=t({name:"CommunicationThread",description:"A conversation thread spanning one or more channels",fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!0},status:{type:u,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:n,isArray:!0,isOptional:!1},links:{type:I,isArray:!0,isOptional:!0},assignedTo:{type:e.String_unsecure(),isOptional:!0},priority:{type:e.String_unsecure(),isOptional:!0},tags:{type:e.String_unsecure(),isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),f=t({name:"CommunicationAction",description:"Structured action extracted from a conversation",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},owner:{type:e.String_unsecure(),isOptional:!0},deadline:{type:e.DateTime(),isOptional:!0},blockers:{type:e.String_unsecure(),isArray:!0,isOptional:!0},sourceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},safetyMode:{type:m,isOptional:!1,defaultValue:"draft_only"}}}),g=t({name:"ReplyDraft",description:"An AI-generated or human-authored reply draft",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},status:{type:d,isOptional:!1,defaultValue:"drafted"},generatedBy:{type:e.String_unsecure(),isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},promptVersion:{type:e.String_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},reviewedAt:{type:e.DateTime(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),k=t({name:"HandoffPacket",description:"A structured handoff between owners, teams, or systems",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},status:{type:c,isOptional:!1,defaultValue:"created"},fromOwner:{type:e.String_unsecure(),isOptional:!1},toOwner:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!1},keyFacts:{type:e.String_unsecure(),isArray:!0,isOptional:!0},openQuestions:{type:e.String_unsecure(),isArray:!0,isOptional:!0},requiredActions:{type:f,isArray:!0,isOptional:!0},evidenceLinks:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),O=t({name:"CommunicationSummary",description:"AI-generated summary of a thread or message range",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},content:{type:e.String_unsecure(),isOptional:!1},facts:{type:e.JSONObject(),isArray:!0,isOptional:!0},actions:{type:f,isArray:!0,isOptional:!0},decisions:{type:e.JSONObject(),isArray:!0,isOptional:!0},risks:{type:e.JSONObject(),isArray:!0,isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1}}}),h=t({name:"AgentSuggestion",description:"An AI-generated suggestion attached to a thread or message",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},suggestionType:{type:e.String_unsecure(),isOptional:!1},content:{type:e.String_unsecure(),isOptional:!1},status:{type:r,isOptional:!1,defaultValue:"generated"},modelName:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}});var p=["platform.communication-os","platform.ai-routing"],L=s({meta:{key:"comms.thread.summarize",version:"1.0.0",stability:"experimental",owners:[...p],tags:["comms","ai","thread","summarize"],description:"Produce a persona-scoped summary of a communication thread via the AI routing layer",goal:"Give each persona a concise, role-appropriate digest of a thread without exposing cross-persona data",context:"Capability-gated AI operation. Auditor variant omits PII and redacts sensitive identifiers. "+"Draft-only \u2014 summary is returned to caller, not persisted by this command. "+"Handler routes to the appropriate model via lib.ai-agent provider selection."},io:{input:o({name:"CommsThreadSummarizeInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},messageIds:{type:i.String_unsecure(),isArray:!0,isOptional:!0},audiencePersona:{type:i.String_unsecure(),isOptional:!0}}}),output:O,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},INSUFFICIENT_MESSAGES:{description:"Thread has too few messages to produce a meaningful summary",http:422,when:"Thread contains fewer messages than the minimum required for summarization"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"},CONTENT_POLICY_BLOCKED:{description:"Summary blocked by content safety policy",http:422,when:"Thread content triggers a content policy gate; summary cannot be generated without redaction"}}},policy:{auth:"user"}}),P=s({meta:{key:"comms.reply.draft",version:"1.0.0",stability:"experimental",owners:[...p],tags:["comms","ai","reply","draft"],description:"Generate a context-aware reply draft via the AI routing layer",goal:"Produce a safe, policy-checked reply draft that the actor can review and send",context:"Capability-gated AI operation. Not available to auditor persona. Draft status reflects policy evaluation: requires_review when policy gates apply. Handler calls communication.reply.draft internals after capability check."},io:{input:o({name:"CommsReplyDraftInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},messageId:{type:i.String_unsecure(),isOptional:!0},instruction:{type:i.String_unsecure(),isOptional:!0},toneHint:{type:i.String_unsecure(),isOptional:!0}}}),output:g,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},POLICY_BLOCKED:{description:"Reply draft blocked by content or safety policy",http:422,when:"Thread content or instruction triggers a policy gate; draft cannot be generated"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"},DRAFT_LIMIT_EXCEEDED:{description:"Too many pending drafts exist for this thread",http:429,when:"Actor has reached the maximum number of unreviewed drafts on this thread"}}},policy:{auth:"user"}}),H=s({meta:{key:"comms.handoff.suggest",version:"1.0.0",stability:"experimental",owners:[...p],tags:["comms","ai","handoff","suggest"],description:"Suggest whether a thread warrants a handoff and to whom, via the AI routing layer",goal:"Surface handoff opportunities with evidence before the actor decides to act",context:"AI suggestion only \u2014 does not create a HandoffPacket. "+"Handler evaluates thread urgency, owner gaps, and work-graph signals to produce a ranked suggestion. Auditor variant is read-only and may not trigger the `communication.handoff.create` action."},io:{input:o({name:"CommsHandoffSuggestInput",fields:{threadId:{type:i.String_unsecure(),isOptional:!1},suggestedToOwner:{type:i.String_unsecure(),isOptional:!0},context:{type:i.String_unsecure(),isOptional:!0}}}),output:h,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},INSUFFICIENT_CONTEXT:{description:"Thread has insufficient context to produce a handoff suggestion",http:422,when:"Thread is too short or lacks ownership/urgency signals for the model to reason about"},HANDOFF_NOT_WARRANTED:{description:"Analysis concludes no handoff is needed at this time",http:422,when:"Thread signals are below the handoff threshold; caller should surface this as a no-op result rather than an error"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"}}},policy:{auth:"user"}});export{H as CommsHandoffSuggestCommand,P as CommsReplyDraftCommand,L as CommsThreadSummarizeCommand};
@@ -0,0 +1,10 @@
1
+ export * from '../contracts/ai-assistance.operations.js';
2
+ export * from '../contracts/collaboration.operations.js';
3
+ export { CreateCommunicationGovernedWorkV1Command, TransitionCommunicationGovernedWorkV1Command, } from '../contracts/ecosystem-governed-work.operations.js';
4
+ export { DecideCommunicationIdentityV1Command } from '../contracts/ecosystem-identity.operations.js';
5
+ export * from '../contracts/ecosystem-message.operations.js';
6
+ export * from '../contracts/ecosystem-workspace.operations.js';
7
+ export * from '../contracts/operations.js';
8
+ export { CreateCommunicationSupportInternalNoteForIntentV1Command, CreateCommunicationSupportInternalNoteV1Command, } from '../contracts/support-internal-note.operations.js';
9
+ export * from '../contracts/thread-message.operations.js';
10
+ export * from './comms-ai.commands.js';
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{defineCommand as L}from"@lssm/lib.contracts-spec";import{defineSchemaModel as O,ScalarTypeEnum as c}from"@lssm/lib.schema";import{defineEnum as y}from"@lssm/lib.schema";var C=y("ChannelType",["email","sms","whatsapp","telegram","matrix","web_chat","voice","internal_chat","custom_adapter","future_bridge","unknown"]),N=y("ThreadStatus",["open","waiting_on_human","waiting_on_external_party","action_required","resolved","archived"]),K=y("MessageStatus",["received","normalized","classified","linked","triaged","replied","archived"]),Q=y("ReplyStatus",["drafted","requires_review","approved","sent","failed","blocked_by_policy"]),Ae=y("HandoffStatus",["created","assigned","acknowledged","completed","reopened"]),le=y("SuggestionStatus",["generated","shown","accepted","edited","rejected","applied","expired"]),Te=y("IntentCategory",["support","sales","bug_report","feature_request","billing","onboarding","coordination","general","spam","escalation"]),J=y("ActionSafetyMode",["read_only","draft_only","requires_review","policy_executable","blocked"]),Ee=y("FeedbackOutcome",["accepted","edited","rejected","unsafe","incomplete"]);import{defineSchemaModel as r,ScalarTypeEnum as e}from"@lssm/lib.schema";var $e=r({name:"ChannelAccount",description:"A channel account belonging to a participant",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:C,isOptional:!1},externalId:{type:e.String_unsecure(),isOptional:!1},displayName:{type:e.String_unsecure(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},isPrimary:{type:e.Boolean(),isOptional:!1,defaultValue:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),Y=r({name:"IdentityLink",description:"Proposed or confirmed relationship between participant identities",fields:{id:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!1},candidateParticipantId:{type:e.String_unsecure(),isOptional:!1},status:{type:le,isOptional:!1,defaultValue:"generated"},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),Xt=r({name:"CommunicationParticipant",description:"A person or system that participates in conversations",fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!0},email:{type:e.EmailAddress(),isOptional:!0},accounts:{type:$e,isArray:!0,isOptional:!1},identityLinks:{type:Y,isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),et=r({name:"Attachment",description:"A file or media attachment on a message",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},mimeType:{type:e.String_unsecure(),isOptional:!0},sizeBytes:{type:e.Int_unsecure(),isOptional:!0},url:{type:e.URL(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0}}}),E=r({name:"ThreadLink",description:"Link between a thread and an external business object (V2: rich-reference objectRef replaces V1 objectType/objectId)",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},objectRef:{type:e.JSONObject(),isOptional:!1},relation:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),de=r({name:"MessageIntent",description:"Classified message or thread intent with confidence and evidence",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},category:{type:Te,isOptional:!1},confidence:{type:e.Float_unsecure(),isOptional:!1},reasoning:{type:e.String_unsecure(),isOptional:!0},evidenceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),j=r({name:"CommunicationMessage",description:"A single message within a communication thread",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:C,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},externalMessageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},bodyNormalized:{type:e.String_unsecure(),isOptional:!0},status:{type:K,isOptional:!1,defaultValue:"received"},intent:{type:de,isOptional:!0},attachments:{type:et,isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),Zt=r({name:"CommunicationFormIntake",description:"Declarative source reference for a communication message mapped into an entity-bound form intake result",fields:{id:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},channelType:{type:C,isOptional:!1},channelAccountId:{type:e.String_unsecure(),isOptional:!1},participantId:{type:e.String_unsecure(),isOptional:!0},entityKey:{type:e.String_unsecure(),isOptional:!1},projectionKind:{type:e.String_unsecure(),isOptional:!1},formKey:{type:e.String_unsecure(),isOptional:!0},formVersion:{type:e.String_unsecure(),isOptional:!0},completionProfileKey:{type:e.String_unsecure(),isOptional:!0},acceptedValues:{type:e.JSONObject(),isOptional:!1},completionDebt:{type:e.JSONObject(),isArray:!0,isOptional:!1},captureStatus:{type:e.String_unsecure(),isOptional:!1,defaultValue:"accepted"},completionStatus:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),k=r({name:"CommunicationThread",description:"A conversation thread spanning one or more channels",fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!0},status:{type:N,isOptional:!1,defaultValue:"open"},participantIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},channelTypes:{type:C,isArray:!0,isOptional:!1},links:{type:E,isArray:!0,isOptional:!0},assignedTo:{type:e.String_unsecure(),isOptional:!0},priority:{type:e.String_unsecure(),isOptional:!0},tags:{type:e.String_unsecure(),isArray:!0,isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),X=r({name:"CommunicationAction",description:"Structured action extracted from a conversation",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},owner:{type:e.String_unsecure(),isOptional:!0},deadline:{type:e.DateTime(),isOptional:!0},blockers:{type:e.String_unsecure(),isArray:!0,isOptional:!0},sourceMessageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!1},safetyMode:{type:J,isOptional:!1,defaultValue:"draft_only"}}}),P=r({name:"ReplyDraft",description:"An AI-generated or human-authored reply draft",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},body:{type:e.String_unsecure(),isOptional:!1},status:{type:Q,isOptional:!1,defaultValue:"drafted"},generatedBy:{type:e.String_unsecure(),isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},promptVersion:{type:e.String_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},reviewedBy:{type:e.String_unsecure(),isOptional:!0},reviewedAt:{type:e.DateTime(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),Me=r({name:"HandoffPacket",description:"A structured handoff between owners, teams, or systems",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},status:{type:Ae,isOptional:!1,defaultValue:"created"},fromOwner:{type:e.String_unsecure(),isOptional:!1},toOwner:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!1},keyFacts:{type:e.String_unsecure(),isArray:!0,isOptional:!0},openQuestions:{type:e.String_unsecure(),isArray:!0,isOptional:!0},requiredActions:{type:X,isArray:!0,isOptional:!0},evidenceLinks:{type:e.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),Z=r({name:"CommunicationSummary",description:"AI-generated summary of a thread or message range",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageIds:{type:e.String_unsecure(),isArray:!0,isOptional:!0},content:{type:e.String_unsecure(),isOptional:!1},facts:{type:e.JSONObject(),isArray:!0,isOptional:!0},actions:{type:X,isArray:!0,isOptional:!0},decisions:{type:e.JSONObject(),isArray:!0,isOptional:!0},risks:{type:e.JSONObject(),isArray:!0,isOptional:!0},modelName:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1}}}),ee=r({name:"AgentSuggestion",description:"An AI-generated suggestion attached to a thread or message",fields:{id:{type:e.String_unsecure(),isOptional:!1},threadId:{type:e.String_unsecure(),isOptional:!1},messageId:{type:e.String_unsecure(),isOptional:!0},suggestionType:{type:e.String_unsecure(),isOptional:!1},content:{type:e.String_unsecure(),isOptional:!1},status:{type:le,isOptional:!1,defaultValue:"generated"},modelName:{type:e.String_unsecure(),isOptional:!0},confidence:{type:e.Float_unsecure(),isOptional:!0},policyVersion:{type:e.String_unsecure(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}});var B=["platform.communication-os"],an=L({meta:{key:"communication.decision.extract",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","decision","extract"],description:"Extract decisions and open questions from a thread",goal:"Make buried decisions reviewable with source references",context:"Read-only/draft-only operation for summaries and handoffs"},io:{input:O({name:"ExtractDecisionsInput",fields:{threadId:{type:c.String_unsecure(),isOptional:!1}}}),output:O({name:"ExtractDecisionsOutput",fields:{decisions:{type:c.JSONObject(),isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),sn=L({meta:{key:"communication.risk.extract",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","risk","blocker"],description:"Extract risks and blockers from a thread",goal:"Surface blockers, policy risks, and unresolved dependencies",context:"Read-only/draft-only operation for triage and escalation"},io:{input:O({name:"ExtractRisksInput",fields:{threadId:{type:c.String_unsecure(),isOptional:!1}}}),output:O({name:"ExtractRisksOutput",fields:{risks:{type:c.JSONObject(),isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),rn=L({meta:{key:"communication.reply.draft",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","reply","draft"],description:"Draft a reply using thread context and policy",goal:"Generate a safe, context-aware reply draft",context:"Draft-only operation; policy may require review or block the draft"},io:{input:O({name:"DraftReplyInput",fields:{threadId:{type:c.String_unsecure(),isOptional:!1},messageId:{type:c.String_unsecure(),isOptional:!0},instruction:{type:c.String_unsecure(),isOptional:!0}}}),output:P},policy:{auth:"user"}}),cn=L({meta:{key:"communication.reply.send",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","reply","send"],description:"Send an approved reply through its channel",goal:"Deliver a reply only when policy allows",context:"Policy-executable operation; every sent reply must be auditable"},io:{input:O({name:"SendReplyInput",fields:{draftId:{type:c.String_unsecure(),isOptional:!1}}}),output:O({name:"SendReplyOutput",fields:{draftId:{type:c.String_unsecure(),isOptional:!1},status:{type:Q,isOptional:!1},sentAt:{type:c.DateTime(),isOptional:!0}}})},policy:{auth:"user"}}),pn=L({meta:{key:"communication.reply.blockByPolicy",version:"1.0.0",stability:"experimental",owners:[...B],tags:["communication","reply","policy","blocked"],description:"Record that a reply was blocked by policy",goal:"Keep blocked reply decisions explicit and auditable",context:"Used by reply policy gates before any outbound side effect"},io:{input:O({name:"BlockReplyByPolicyInput",fields:{draftId:{type:c.String_unsecure(),isOptional:!1},policyRef:{type:c.String_unsecure(),isOptional:!1},reason:{type:c.String_unsecure(),isOptional:!1}}}),output:P},policy:{auth:"admin"}});import{defineCommand as q}from"@lssm/lib.contracts-spec";import{defineSchemaModel as te,ScalarTypeEnum as p}from"@lssm/lib.schema";var G=["platform.communication-os"],fn=q({meta:{key:"communication.handoff.create",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","handoff"],description:"Create a handoff packet for a thread",goal:"Transfer context safely between owners or systems",context:"Requires evidence links and does not close source thread automatically"},io:{input:te({name:"CreateHandoffInput",fields:{threadId:{type:p.String_unsecure(),isOptional:!1},fromOwner:{type:p.String_unsecure(),isOptional:!1},toOwner:{type:p.String_unsecure(),isOptional:!1},reason:{type:p.String_unsecure(),isOptional:!0}}}),output:Me},policy:{auth:"user"}}),gn=q({meta:{key:"communication.threadLink.propose",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","thread-link","propose"],description:"Propose a link between a thread and a business object",goal:"Let future vertical consumers bind domain objects without changing the core",context:"Draft-only operation; domain packs own object semantics"},io:{input:E,output:E},policy:{auth:"user"}}),hn=q({meta:{key:"communication.identityLink.propose",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","identity","propose"],description:"Propose a participant identity link",goal:"Resolve cross-channel identities without reckless auto-merge",context:"Draft-only operation; high-impact merges require human review"},io:{input:Y,output:Y},policy:{auth:"user"}}),On=q({meta:{key:"communication.escalation.request",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","escalation"],description:"Request human escalation for a thread",goal:"Surface high-risk, blocked, or unresolved conversations to a human owner",context:"Policy-executable operation that emits escalation evidence"},io:{input:te({name:"EscalateToHumanInput",fields:{threadId:{type:p.String_unsecure(),isOptional:!1},reason:{type:p.String_unsecure(),isOptional:!1},targetOwner:{type:p.String_unsecure(),isOptional:!0}}}),output:ee},policy:{auth:"user"}}),Sn=q({meta:{key:"communication.feedback.record",version:"1.0.0",stability:"experimental",owners:[...G],tags:["communication","feedback"],description:"Record human feedback on a suggestion, draft, or extraction",goal:"Make AI correction signals auditable and replayable",context:"Used by review surfaces and future evaluation runs"},io:{input:te({name:"RecordHumanFeedbackInput",fields:{targetId:{type:p.String_unsecure(),isOptional:!1},targetType:{type:p.String_unsecure(),isOptional:!1},outcome:{type:Ee,isOptional:!1},notes:{type:p.String_unsecure(),isOptional:!0}}}),output:te({name:"RecordHumanFeedbackOutput",fields:{feedbackId:{type:p.String_unsecure(),isOptional:!1},safetyMode:{type:J,isOptional:!1}}})},policy:{auth:"user"}});import{defineCommand as De,defineQuery as ct,docId as pt}from"@lssm/lib.contracts-spec";import{defineEnum as Ve,defineSchemaModel as ge,ScalarTypeEnum as u}from"@lssm/lib.schema";import{defineEnum as S,defineSchemaModel as f,ScalarTypeEnum as t}from"@lssm/lib.schema";var tt=S("CommunicationSpaceKind",["personal","organization"]),nt=S("CommunicationPrincipalKind",["human","agent","system"]),it=S("CommunicationConnectionPlacement",["device","managed_cloud","self_hosted"]),In=S("CommunicationConnectionNetwork",["email","sms","slack","teams","telegram","whatsapp","discord","matrix"]),ot=S("CommunicationEncryptionMode",["client_encrypted","governed_server_indexable"]),at=S("CommunicationMembershipState",["active","revoked"]),Re=S("CommunicationReceiptKind",["delivered","read"]),st=S("CommunicationConnectionHealth",["connecting","healthy","degraded","offline","revoked"]),ne={id:"communication-os.ecosystem-messaging.v2",title:"CommunicationOS ecosystem messaging contracts",body:"Versioned, workspace-scoped contracts for personal and organization spaces, rooms, human and agent membership, hybrid channel connections, synchronized messages, and revocable outbound authority. CommunicationSpec remains canonical; provider protocols are adapters. V1 thread and draft-only operations remain unchanged.",kind:"reference",route:"/docs/communication-os/ecosystem-messaging-v2",visibility:"public"},_=f({name:"CommunicationScopeV2",description:"Strict tenant, workspace, and space boundary for messaging state",fields:{tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1}}}),ie=f({name:"CommunicationSpaceV2",description:"Personal or organization messaging boundary under one account",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},name:{type:t.String_unsecure(),isOptional:!1},kind:{type:tt,isOptional:!1},encryptionMode:{type:ot,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1}}}),bn=f({name:"CommunicationPrincipalV2",description:"Auditable human, agent, or system identity",fields:{id:{type:t.String_unsecure(),isOptional:!1},kind:{type:nt,isOptional:!1},displayName:{type:t.String_unsecure(),isOptional:!1},ownerPrincipalId:{type:t.String_unsecure(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1}}}),oe=f({name:"CommunicationRoomV2",description:"Room or direct-message projection inside one space",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},name:{type:t.String_unsecure(),isOptional:!0},roomKind:{type:t.String_unsecure(),isOptional:!1},connectionIds:{type:t.String_unsecure(),isArray:!0,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),me=f({name:"CommunicationRoomMembershipV2",description:"Revocable principal membership and room-scoped capabilities",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},roomId:{type:t.String_unsecure(),isOptional:!1},principalId:{type:t.String_unsecure(),isOptional:!1},role:{type:t.String_unsecure(),isOptional:!1},state:{type:at,isOptional:!1},capabilities:{type:t.String_unsecure(),isArray:!0,isOptional:!1},expiresAt:{type:t.DateTime(),isOptional:!0},revokedAt:{type:t.DateTime(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1}}}),ye=f({name:"CommunicationChannelConnectionV2",description:"Credential-reference-only local, managed, or self-hosted channel connection",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},network:{type:t.String_unsecure(),isOptional:!1},placement:{type:it,isOptional:!1},externalAccountRef:{type:t.String_unsecure(),isOptional:!1},credentialRef:{type:t.String_unsecure(),isOptional:!1},health:{type:st,isOptional:!1},capabilities:{type:t.String_unsecure(),isArray:!0,isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),rt=f({name:"CommunicationAttachmentV2",description:"Public-safe metadata for an opaque, scope-bound message attachment",fields:{id:{type:t.String_unsecure(),isOptional:!1},name:{type:t.String_unsecure(),isOptional:!1},mimeType:{type:t.String_unsecure(),isOptional:!1},sizeBytes:{type:t.Int_unsecure(),isOptional:!1},sha256:{type:t.String_unsecure(),isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1}}}),w=f({name:"CommunicationMessageV2",description:"Canonical room message with explicit author and encryption posture",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},roomId:{type:t.String_unsecure(),isOptional:!1},authorPrincipalId:{type:t.String_unsecure(),isOptional:!1},connectionId:{type:t.String_unsecure(),isOptional:!0},externalMessageId:{type:t.String_unsecure(),isOptional:!0},body:{type:t.String_unsecure(),isOptional:!0},encryptedEnvelope:{type:t.JSONObject(),isOptional:!0},attachments:{type:rt,isArray:!0,isOptional:!0},replyToMessageId:{type:t.String_unsecure(),isOptional:!0},revision:{type:t.Int_unsecure(),isOptional:!1},deletedAt:{type:t.DateTime(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),fe=f({name:"CommunicationAuthorityGrantV2",description:"Explicit, revocable messaging authority granted to one principal",fields:{id:{type:t.String_unsecure(),isOptional:!1},tenantId:{type:t.String_unsecure(),isOptional:!1},workspaceId:{type:t.String_unsecure(),isOptional:!1},spaceId:{type:t.String_unsecure(),isOptional:!1},roomId:{type:t.String_unsecure(),isOptional:!0},connectionId:{type:t.String_unsecure(),isOptional:!0},principalId:{type:t.String_unsecure(),isOptional:!1},capabilities:{type:t.String_unsecure(),isArray:!0,isOptional:!1},grantedBy:{type:t.String_unsecure(),isOptional:!1},expiresAt:{type:t.DateTime(),isOptional:!0},revokedAt:{type:t.DateTime(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1}}});var he=["platform.communication-os"],ut={id:"communication-os.governed-work.v1",title:"CommunicationOS governed work contracts",body:"Persisted, scope-isolated reviews for identity, drafts, actions, handoffs, escalations, triage, summaries, agents, consent, retention, and policy. Managed decisions require current manager authority and every transition appends evidence.",kind:"reference",route:"/docs/communication-os/governed-work-v1",visibility:"public"},Oe=[pt(ut.id)],lt=Ve("CommunicationGovernedWorkKind",["identity_review","draft","action","handoff","escalation","triage","summary","agent","consent","retention","policy"]),Ne=Ve("CommunicationGovernedWorkStatus",["pending","approved","rejected","blocked","resolved","revoked"]),ae=ge({name:"CommunicationGovernedWorkV1",fields:{id:{type:u.String_unsecure(),isOptional:!1},kind:{type:lt,isOptional:!1},status:{type:Ne,isOptional:!1},title:{type:u.String_unsecure(),isOptional:!1},threadId:{type:u.String_unsecure(),isOptional:!0},details:{type:u.JSONObject(),isOptional:!1},revision:{type:u.Int_unsecure(),isOptional:!1},createdBy:{type:u.String_unsecure(),isOptional:!1},createdAt:{type:u.DateTime(),isOptional:!1},updatedBy:{type:u.String_unsecure(),isOptional:!1},updatedAt:{type:u.DateTime(),isOptional:!1}}}),An=ct({meta:{key:"communication.governed_work.list",version:"1.0.0",stability:"experimental",owners:[...he],tags:["communication","governance","work","query"],description:"List governed work in one authorized messaging space",goal:"Drive review queues from replayable state rather than fixtures",context:"The server derives scope and filters optional kinds",docId:Oe},io:{input:_,output:ge({name:"ListCommunicationGovernedWorkV1Output",fields:{items:{type:ae,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}}),dt=De({meta:{key:"communication.governed_work.create",version:"1.0.0",stability:"experimental",owners:[...he],tags:["communication","governance","work","create"],description:"Create one idempotent governed work item",goal:"Start an accountable review from a real user or runtime action",context:"Client-supplied tenant or principal authority is rejected",docId:Oe},io:{input:ae,output:ae},policy:{auth:"user"}}),mt=De({meta:{key:"communication.governed_work.transition",version:"1.0.0",stability:"experimental",owners:[...he],tags:["communication","governance","work","transition"],description:"Apply one policy-valid governed work transition",goal:"Record approval, denial, resolution, blocking, or revocation evidence",context:"Managed kinds require current manager authority and terminal transitions fail closed",docId:Oe},io:{input:ge({name:"TransitionCommunicationGovernedWorkV1Input",fields:{workId:{type:u.String_unsecure(),isOptional:!1},status:{type:Ne,isOptional:!1},reason:{type:u.String_unsecure(),isOptional:!0}}}),output:ae},policy:{auth:"user"}});import{defineCommand as yt,defineQuery as Pe,docId as ft}from"@lssm/lib.contracts-spec";import{defineEnum as gt,defineSchemaModel as M,ScalarTypeEnum as o}from"@lssm/lib.schema";var Se=["platform.communication-os"],ht={id:"communication-os.identity-resolution.v1",title:"CommunicationOS identity resolution contracts",body:"Scope-isolated account and contact projections plus a human-reviewed identity merge or rejection lifecycle. Provider credentials and raw identity evidence never enter public outputs.",kind:"reference",route:"/docs/communication-os/identity-resolution-v1",visibility:"public"},_e=[ft(ht.id)],je=gt("CommunicationIdentityReviewStatus",["pending","merged","rejected"]),Ot=M({name:"CommunicationAccountV2",description:"Public-safe provider account projection in one authorized space",fields:{id:{type:o.String_unsecure(),isOptional:!1},network:{type:o.String_unsecure(),isOptional:!1},externalAccountRef:{type:o.String_unsecure(),isOptional:!1},placement:{type:o.String_unsecure(),isOptional:!1},health:{type:o.String_unsecure(),isOptional:!1},createdAt:{type:o.DateTime(),isOptional:!1},updatedAt:{type:o.DateTime(),isOptional:!1}}}),St=M({name:"CommunicationContactV2",description:"Participant projection derived from persisted scoped messages",fields:{principalId:{type:o.String_unsecure(),isOptional:!1},displayName:{type:o.String_unsecure(),isOptional:!0},roomIds:{type:o.String_unsecure(),isArray:!0,isOptional:!1},messageCount:{type:o.Int_unsecure(),isOptional:!1},lastSeenAt:{type:o.DateTime(),isOptional:!1}}}),_t=M({name:"ListCommunicationAccountsV2Output",fields:{accounts:{type:Ot,isArray:!0,isOptional:!1}}}),vt=M({name:"ListCommunicationContactsV2Output",fields:{contacts:{type:St,isArray:!0,isOptional:!1}}}),Dn=Pe({meta:{key:"communication.account.list",version:"2.0.0",stability:"experimental",owners:[...Se],tags:["communication","account","identity"],description:"List public-safe provider accounts in one authorized space",goal:"Expose account readiness without leaking credential references",context:"Authority is derived by the server from the authenticated scope",docId:_e},io:{input:_,output:_t},policy:{auth:"user"}}),Vn=Pe({meta:{key:"communication.contact.list",version:"2.0.0",stability:"experimental",owners:[...Se],tags:["communication","contact","identity"],description:"List persisted participant projections in one authorized space",goal:"Provide a real scoped contact index without provider identity leakage",context:"Contacts are replayable projections, never transient UI inference",docId:_e},io:{input:_,output:vt},policy:{auth:"user"}}),It=yt({meta:{key:"communication.identity.decide",version:"1.0.0",stability:"experimental",owners:[...Se],tags:["communication","identity","review","governance"],description:"Merge or reject one pending identity review",goal:"Require an auditable human decision before cross-channel identity linkage",context:"Only authorized managers may decide and each review is single-transition",docId:_e},io:{input:M({name:"DecideCommunicationIdentityV1Input",fields:{reviewId:{type:o.String_unsecure(),isOptional:!1},decision:{type:je,isOptional:!1},reason:{type:o.String_unsecure(),isOptional:!0}}}),output:M({name:"DecideCommunicationIdentityV1Output",fields:{reviewId:{type:o.String_unsecure(),isOptional:!1},status:{type:je,isOptional:!1},revision:{type:o.Int_unsecure(),isOptional:!1}}})},policy:{auth:"admin"}});import{defineCommand as A,defineQuery as Ge,docId as bt}from"@lssm/lib.contracts-spec";import{defineSchemaModel as v,ScalarTypeEnum as n}from"@lssm/lib.schema";var g=["platform.communication-os"],h=[bt(ne.id)],ze={VALIDATION_FAILED:{description:"Message content, replay key, or attachment references are invalid.",http:422,when:"The request is malformed, empty, duplicated, or exceeds a declared limit."},FORBIDDEN:{description:"The authenticated principal cannot access or mutate the selected room.",http:403,when:"Workspace, space, room membership, connection binding, or send authority is absent."},SERVICE_UNAVAILABLE:{description:"The scoped messaging runtime or search projection is unavailable.",http:503,when:"A required durable runtime dependency cannot safely answer the operation."}},Bn=A({meta:{key:"communication.message.send",version:"2.1.0",stability:"experimental",owners:[...g],tags:["communication","message","send","authority"],description:"Send a canonical room message as an explicitly attributed principal",goal:"Give authorized humans and agents the same audited messaging path",context:"The runtime must re-evaluate membership, authority, consent, encryption posture, and connection policy immediately before dispatch",docId:h},io:{input:w,output:w},policy:{auth:"user"}}),xt=v({name:"SendCommunicationMessageV3Input",fields:{workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},connectionId:{type:n.String_unsecure(),isOptional:!0},idempotencyKey:{type:n.String_unsecure(),isOptional:!1},body:{type:n.String_unsecure(),isOptional:!0},encryptedEnvelope:{type:n.JSONObject(),isOptional:!0},attachmentIds:{type:n.String_unsecure(),isArray:!0,isOptional:!0},replyToMessageId:{type:n.String_unsecure(),isOptional:!0}}}),qn=A({meta:{key:"communication.message.send",version:"3.0.0",stability:"experimental",owners:[...g],tags:["communication","message","send","authority","idempotency"],description:"Send a canonical room message from a JSON-safe, replay-safe client intent",goal:"Keep tenant, author, revision, identifiers, and timestamps server-owned",context:"The runtime derives tenant and author from the authenticated context, verifies workspace/space/room membership and attachment ownership, then applies the idempotency key before dispatch",docId:h},io:{input:xt,output:w,errors:ze},policy:{auth:"user"}}),Ue=v({name:"MutateCommunicationMessageV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},messageId:{type:n.String_unsecure(),isOptional:!1},actorPrincipalId:{type:n.String_unsecure(),isOptional:!1},body:{type:n.String_unsecure(),isOptional:!0},encryptedEnvelope:{type:n.JSONObject(),isOptional:!0},expectedRevision:{type:n.Int_unsecure(),isOptional:!1}}}),Gn=A({meta:{key:"communication.message.edit",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","edit"],description:"Edit a message with optimistic revision protection",goal:"Preserve provider edits in the canonical event journal without rewriting history",context:"Unsupported provider edits must return an explicit capability error rather than silently diverge",docId:h},io:{input:Ue,output:w},policy:{auth:"user"}}),zn=A({meta:{key:"communication.message.delete",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","delete"],description:"Append an auditable message deletion or provider-retention marker",goal:"Represent local and provider deletion honestly across heterogeneous networks",context:"The event journal retains non-content evidence even when message content is erased",docId:h},io:{input:Ue,output:w},policy:{auth:"user"}}),Le=v({name:"CommunicationReactionV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},messageId:{type:n.String_unsecure(),isOptional:!1},principalId:{type:n.String_unsecure(),isOptional:!1},reaction:{type:n.String_unsecure(),isOptional:!1},active:{type:n.Boolean(),isOptional:!1}}}),Un=A({meta:{key:"communication.reaction.set",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","reaction"],description:"Add or remove a reaction on a canonical message",goal:"Normalize lightweight acknowledgement across supported networks",context:"Adapters report unsupported reactions explicitly",docId:h},io:{input:Le,output:Le},policy:{auth:"user"}}),Be=v({name:"CommunicationReceiptV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},messageId:{type:n.String_unsecure(),isOptional:!1},principalId:{type:n.String_unsecure(),isOptional:!1},kind:{type:Re,isOptional:!1},occurredAt:{type:n.DateTime(),isOptional:!1}}}),Fn=A({meta:{key:"communication.receipt.record",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","receipt"],description:"Record a delivered or read receipt",goal:"Keep unread and delivery projections consistent across clients",context:"Privacy policy may suppress outbound read receipts per space or connection",docId:h},io:{input:Be,output:Be},policy:{auth:"user"}}),qe=v({name:"CommunicationInboxStateV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},roomId:{type:n.String_unsecure(),isOptional:!1},principalId:{type:n.String_unsecure(),isOptional:!1},pinned:{type:n.Boolean(),isOptional:!1},archived:{type:n.Boolean(),isOptional:!1},snoozedUntil:{type:n.DateTime(),isOptional:!0},reminderAt:{type:n.DateTime(),isOptional:!0}}}),Hn=A({meta:{key:"communication.inbox-state.set",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","inbox","pin","archive","snooze","reminder"],description:"Set one principal's pin, archive, snooze, and reminder state",goal:"Synchronize inbox organization without leaking message content",context:"Personal inbox state is principal-private even inside organization workspaces",docId:h},io:{input:qe,output:qe},policy:{auth:"user"}}),Ct=v({name:"SearchCommunicationMessagesV2Input",fields:{tenantId:{type:n.String_unsecure(),isOptional:!1},workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},query:{type:n.String_unsecure(),isOptional:!1},roomIds:{type:n.String_unsecure(),isArray:!0,isOptional:!0},limit:{type:n.Int_unsecure(),isOptional:!0}}}),Fe=v({name:"SearchCommunicationMessagesV2Output",fields:{messages:{type:w,isArray:!0,isOptional:!1},nextCursor:{type:n.String_unsecure(),isOptional:!0}}}),Wn=Ge({meta:{key:"communication.message.search",version:"2.0.0",stability:"experimental",owners:[...g],tags:["communication","message","search"],description:"Search messages within exactly one authorized space",goal:"Provide cross-network search without cross-space index leakage",context:"Client-encrypted spaces search a local decrypted projection; server-indexable spaces use governed indexes",docId:h},io:{input:Ct,output:Fe},policy:{auth:"user"}}),kt=v({name:"SearchCommunicationMessagesV3Input",fields:{workspaceId:{type:n.String_unsecure(),isOptional:!1},spaceId:{type:n.String_unsecure(),isOptional:!1},query:{type:n.String_unsecure(),isOptional:!1},roomIds:{type:n.String_unsecure(),isArray:!0,isOptional:!0},limit:{type:n.Int_unsecure(),isOptional:!0}}}),Kn=Ge({meta:{key:"communication.message.search",version:"3.0.0",stability:"experimental",owners:[...g],tags:["communication","message","search","authority"],description:"Search messages inside the authenticated tenant and an authorized selected space",goal:"Remove client-supplied tenant authority from canonical search transport",context:"The runtime derives tenant from the authenticated context and verifies workspace, space, and optional room filters before querying any index",docId:h},io:{input:kt,output:Fe,errors:ze},policy:{auth:"user"}}),Qn={key:"communication.message.replay-authority",version:"1.0.0",invariants:["Recheck current room membership and connection authority before returning a prior send result.","A request key cannot substitute principal, room, connection, text, subject, HTML, metadata, encryption envelope, reply target or attachment IDs.","Queued acceptance is not provider delivery.","Requested attachments require a complete resolved manifest; missing attachment support must not silently send an incomplete message."]},Jn={key:"communication.message.queue-custody",version:"1.0.0",invariants:["An external send requires a durable journal-and-outbox adapter before it can be accepted.","Queued acceptance requires an exact persisted delivery record for the accepted message, connection and scope.","Outbox-key conflicts cannot silently drop provider delivery or report false success.","Message delivery uses delivery:<send idempotency key>; alternate delivery keys cannot duplicate a prior accepted message.","Message identity allocated by an atomic journal replay remains the delivery target; retries do not refer to discarded candidate IDs."]},Yn={key:"communication.delivery.context-reproof",version:"1.0.0",invariants:["Resolve the current delivery context before adapter access and again after provider health checks immediately before send.","Changed recipient, connection, credential binding, content, reply, attachment or routing metadata invalidates the pending send.","Missing or changed context yields a definitive rejection without invoking provider.send.","Journal delivery resolution requires current active sender membership and applicable agent grants; revoked or deleted messages cannot resolve for sending.","Context reproof supplements canonical Runtime Node authority and does not replace its approval or effect fence."]};import{defineCommand as R,defineQuery as He,docId as wt}from"@lssm/lib.contracts-spec";import{defineSchemaModel as se,ScalarTypeEnum as d}from"@lssm/lib.schema";var I=["platform.communication-os"],b=[wt(ne.id)],ti=R({meta:{key:"communication.space.create",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","space","workspace"],description:"Create an isolated personal or organization messaging space",goal:"Keep messages, identities, agents, search, and policy inside one explicit boundary",context:"The caller must already have access to the containing tenant and workspace",docId:b},io:{input:ie,output:ie},policy:{auth:"user"}}),ni=R({meta:{key:"communication.room.create",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","room","membership"],description:"Create a room or direct-message projection inside one space",goal:"Give humans and agents one canonical collaboration container",context:"Connection-backed rooms retain provider identifiers only through connection references",docId:b},io:{input:oe,output:oe},policy:{auth:"user"}}),At=se({name:"ListCommunicationSpacesV2Output",fields:{spaces:{type:ie,isArray:!0,isOptional:!1}}}),ii=He({meta:{key:"communication.space.list",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","space","workspace","query"],description:"List messaging spaces visible inside an authorized scope",goal:"Make space switching explicit without crossing an isolation boundary",context:"The authorization layer resolves accessible scopes; this query never widens the supplied scope",docId:b},io:{input:_,output:At},policy:{auth:"user"}}),Tt=se({name:"ListCommunicationRoomsV2Output",fields:{rooms:{type:oe,isArray:!0,isOptional:!1}}}),oi=He({meta:{key:"communication.room.list",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","room","workspace","query"],description:"List canonical rooms inside one authorized messaging space",goal:"Drive inbox and room navigation from a replayable projection",context:"Rooms are projected only from the append-only journal partition selected by the supplied scope",docId:b},io:{input:_,output:Tt},policy:{auth:"user"}}),ai=R({meta:{key:"communication.membership.set",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","membership","agent","authority"],description:"Add, update, or revoke a human, agent, or system room membership",goal:"Make every participant and its capabilities explicit and auditable",context:"Revocation takes effect before the next effect-bearing operation",docId:b},io:{input:me,output:me},policy:{auth:"admin"}}),si=R({meta:{key:"communication.authority.set",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","agent","authority","revocation"],description:"Grant or revoke scoped messaging authority for one principal",goal:"Permit human-equivalent agents without implicit or unbounded send access",context:"The runtime re-evaluates active membership, grant scope, expiry, and channel policy immediately before dispatch",docId:b},io:{input:fe,output:fe},policy:{auth:"admin"}}),ri=R({meta:{key:"communication.connection.connect",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","connection","hybrid","credentials"],description:"Register a device, managed-cloud, or self-hosted channel connection",goal:"Use one provider-neutral connection contract across all clients and workers",context:"Only a secret-manager reference may be persisted; raw provider credentials are forbidden",docId:b},io:{input:ye,output:ye},policy:{auth:"user"}}),Et=se({name:"SyncCommunicationConnectionV2Input",fields:{tenantId:{type:d.String_unsecure(),isOptional:!1},workspaceId:{type:d.String_unsecure(),isOptional:!1},spaceId:{type:d.String_unsecure(),isOptional:!1},connectionId:{type:d.String_unsecure(),isOptional:!1},cursor:{type:d.String_unsecure(),isOptional:!0},limit:{type:d.Int_unsecure(),isOptional:!0}}}),Mt=se({name:"SyncCommunicationConnectionV2Output",fields:{connectionId:{type:d.String_unsecure(),isOptional:!1},nextCursor:{type:d.String_unsecure(),isOptional:!0},acceptedEventIds:{type:d.String_unsecure(),isArray:!0,isOptional:!1},hasMore:{type:d.Boolean(),isOptional:!1}}}),ci=R({meta:{key:"communication.connection.sync",version:"2.0.0",stability:"experimental",owners:[...I],tags:["communication","connection","sync","cursor"],description:"Advance an authenticated channel connection from a cursor",goal:"Provide deterministic, resumable synchronization across device and server workers",context:"Duplicate provider events must be suppressed by their connection-scoped idempotency key",docId:b},io:{input:Et,output:Mt},policy:{auth:"user"}});import{defineCommand as Nt,defineQuery as jt}from"@lssm/lib.contracts-spec/operations";import{defineSchemaModel as pe,ScalarTypeEnum as s}from"@lssm/lib.schema";import{defineEnum as D,defineSchemaModel as ve,ScalarTypeEnum as a}from"@lssm/lib.schema";var Rt=D("ResidencyRegion",["eu","eu_fr","eu_de","us","uk","apac","self_managed"]),Dt=D("HostingMode",["saas","self_host","on_prem"]),re=D("DataClass",["message_body","participant_identity","channel_account","attachment","ai_derived","audit_evidence"]),ce=D("ConsentBasis",["consent","contract","legal_obligation","legitimate_interest"]),Ie=D("ConsentStatus",["granted","withdrawn","expired","not_recorded"]),Vt=ve({name:"RetentionWindow",description:"Documented retention window for a single governed data class.",fields:{dataClass:{type:re,isOptional:!1},retentionDays:{type:a.Int_unsecure(),isOptional:!1},basis:{type:ce,isOptional:!1},description:{type:a.String_unsecure(),isOptional:!0}}}),li=ve({name:"SovereigntyProfile",description:"Residency, retention, sovereign LLM provider and hosting posture for a tenant.",fields:{id:{type:a.String_unsecure(),isOptional:!1},tenantId:{type:a.String_unsecure(),isOptional:!1},residencyRegion:{type:Rt,isOptional:!1,defaultValue:"eu"},hostingMode:{type:Dt,isOptional:!1,defaultValue:"saas"},llmProviderId:{type:a.String_unsecure(),isOptional:!1},retentionWindows:{type:Vt,isArray:!0,isOptional:!1},dataResidencyEnforced:{type:a.Boolean(),isOptional:!1,defaultValue:!0},createdAt:{type:a.DateTime(),isOptional:!1},updatedAt:{type:a.DateTime(),isOptional:!1}}}),di=ve({name:"SubjectConsent",description:"Recorded RGPD consent decision for a single data subject.",fields:{id:{type:a.String_unsecure(),isOptional:!1},tenantId:{type:a.String_unsecure(),isOptional:!1},subjectId:{type:a.String_unsecure(),isOptional:!1},basis:{type:ce,isOptional:!1},status:{type:Ie,isOptional:!1,defaultValue:"not_recorded"},grantedAt:{type:a.DateTime(),isOptional:!0},withdrawnAt:{type:a.DateTime(),isOptional:!0},expiresAt:{type:a.DateTime(),isOptional:!0},evidenceRef:{type:a.String_unsecure(),isOptional:!0}}}),We=D("ErasureOutcome",["erased_local","erased_local_and_channel","erased_local_provider_retained_documented"]);var Ke=["platform.communication-os"],hi=Nt({meta:{key:"communication.subject.erase",version:"1.0.0",stability:"experimental",owners:[...Ke],tags:["communication","gdpr","rgpd","erasure","sovereignty"],description:"Erase a data subject across local persistence and channel providers",goal:"Honor a GDPR/RGPD right-to-erasure request with an auditable, three-state outcome that documents irrecoverable provider retention rather than failing closed",context:"Governed by ContractSpec Connect; handler emits a local delete descriptor plus ChannelAdapter.eraseSubject; provider-unrecallable channels (email/SMTP) resolve to a documented retention window from the Sovereignty Profile"},io:{input:pe({name:"EraseSubjectInput",description:"Right-to-erasure request for a single data subject.",fields:{tenantId:{type:s.String_unsecure(),isOptional:!1},subjectId:{type:s.String_unsecure(),isOptional:!1},requestedBy:{type:s.String_unsecure(),isOptional:!1},reason:{type:s.String_unsecure(),isOptional:!0},dataClasses:{type:re,isArray:!0,isOptional:!0}}}),output:pe({name:"EraseSubjectOutput",description:"Three-state erasure outcome with optional documented provider retention.",fields:{subjectId:{type:s.String_unsecure(),isOptional:!1},outcome:{type:We,isOptional:!1},localDeleted:{type:s.Boolean(),isOptional:!1},channelErased:{type:s.Boolean(),isOptional:!1},providerRetainedDataClass:{type:re,isOptional:!0},providerRetentionDays:{type:s.Int_unsecure(),isOptional:!0},retentionWindowRef:{type:s.String_unsecure(),isOptional:!0},auditEventRef:{type:s.String_unsecure(),isOptional:!1},erasedAt:{type:s.DateTime(),isOptional:!1}}}),errors:{SUBJECT_NOT_FOUND:{description:"No data subject exists for the provided subjectId",http:404,when:"subjectId does not resolve to any local persistence record"},SOVEREIGNTY_PROFILE_MISSING:{description:"No Sovereignty Profile is configured for the tenant; retention window cannot be documented",http:422,when:"A provider cannot recall data but no documented retention window exists to reference"},CHANNEL_ADAPTER_UNAVAILABLE:{description:"The channel adapter required to attempt provider erasure could not be reached",http:503,when:"ChannelAdapter.eraseSubject cannot be invoked; erasure fails closed rather than reporting an unverified outcome"},ERASURE_NOT_AUTHORIZED:{description:"The requesting actor is not authorized to erase this subject",http:403,when:"Policy gate denies the erasure request for the actor/tenant"}}},policy:{auth:"admin"}}),Oi=jt({meta:{key:"communication.subject.consent.check",version:"1.0.0",stability:"experimental",owners:[...Ke],tags:["communication","gdpr","rgpd","consent"],description:"Check the recorded RGPD consent state for a data subject",goal:"Let runtime gate processing on a subject lawful basis before side effects",context:"Read-only; returns the recorded consent status and lawful basis, never mutates consent"},io:{input:pe({name:"CheckSubjectConsentInput",fields:{tenantId:{type:s.String_unsecure(),isOptional:!1},subjectId:{type:s.String_unsecure(),isOptional:!1}}}),output:pe({name:"CheckSubjectConsentOutput",fields:{subjectId:{type:s.String_unsecure(),isOptional:!1},status:{type:Ie,isOptional:!1},basis:{type:ce,isOptional:!0},mayProcess:{type:s.Boolean(),isOptional:!1}}})},policy:{auth:"admin"}});import{defineCommand as Pt,defineQuery as be}from"@lssm/lib.contracts-spec/operations";import{defineSchemaModel as T,ScalarTypeEnum as l}from"@lssm/lib.schema";var ue=["platform.communication-os"],xi=Pt({meta:{key:"communication.thread.updateStatus",version:"1.0.0",stability:"experimental",owners:[...ue],tags:["communication","thread","status"],description:"Update a thread lifecycle status",goal:"Move operational conversations through explicit lifecycle states",context:"Runtime must enforce valid transitions from lifecycle definitions"},io:{input:T({name:"UpdateThreadStatusInput",fields:{threadId:{type:l.String_unsecure(),isOptional:!1},status:{type:N,isOptional:!1},reason:{type:l.String_unsecure(),isOptional:!0}}}),output:k},policy:{auth:"user"}}),Ci=be({meta:{key:"communication.thread.get",version:"1.0.0",stability:"experimental",owners:[...ue],tags:["communication","thread","get"],description:"Get a thread by ID with messages and links",goal:"Retrieve full thread context",context:"Read-only operation for inbox views, detail views, and agent context"},io:{input:T({name:"GetThreadInput",fields:{threadId:{type:l.String_unsecure(),isOptional:!1}}}),output:T({name:"GetThreadOutput",fields:{thread:{type:k,isOptional:!1},messages:{type:j,isArray:!0,isOptional:!1},links:{type:E,isArray:!0,isOptional:!0}}})},policy:{auth:"user"}}),ki=be({meta:{key:"communication.thread.search",version:"1.0.0",stability:"experimental",owners:[...ue],tags:["communication","thread","search"],description:"Search threads by status, participant, channel, or linked object",goal:"Find relevant conversations quickly",context:"Read-only operation for operational inboxes, agent search, and dashboards"},io:{input:T({name:"SearchThreadsInput",fields:{status:{type:N,isOptional:!0},participantId:{type:l.String_unsecure(),isOptional:!0},channelType:{type:C,isOptional:!0},linkedKindId:{type:l.String_unsecure(),isOptional:!0},linkedInstanceId:{type:l.String_unsecure(),isOptional:!0},assignedTo:{type:l.String_unsecure(),isOptional:!0},limit:{type:l.Int_unsecure(),isOptional:!0,defaultValue:20}}}),output:T({name:"SearchThreadsOutput",fields:{threads:{type:k,isArray:!0,isOptional:!1},total:{type:l.Int_unsecure(),isOptional:!1},hasMore:{type:l.Boolean(),isOptional:!1}}})},policy:{auth:"user"}}),wi=be({meta:{key:"communication.message.list",version:"1.0.0",stability:"experimental",owners:[...ue],tags:["communication","message","list"],description:"List messages for a thread",goal:"Provide ordered message context without loading unrelated operational state",context:"Read-only operation for inboxes, agent context, and handoff evidence"},io:{input:T({name:"ListMessagesInput",fields:{threadId:{type:l.String_unsecure(),isOptional:!1}}}),output:T({name:"ListMessagesOutput",fields:{messages:{type:j,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}});import{defineCommand as U}from"@lssm/lib.contracts-spec/operations";import{defineSchemaModel as z,ScalarTypeEnum as x}from"@lssm/lib.schema";var F=["platform.communication-os"],Di=U({meta:{key:"communication.thread.create",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","thread","create"],description:"Create a communication thread from normalized input",goal:"Persist a reusable conversation container before downstream work binds to it",context:"Used by ingest flows and generic operational inbox consumers"},io:{input:k,output:k},policy:{auth:"admin"}}),Vi=U({meta:{key:"communication.message.ingest",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","message","ingest"],description:"Ingest an inbound message from a channel adapter",goal:"Normalize and store an inbound message for triage",context:"Called by channel adapters after webhook verification and deduplication"},io:{input:j,output:z({name:"IngestMessageOutput",fields:{messageId:{type:x.String_unsecure(),isOptional:!1},threadId:{type:x.String_unsecure(),isOptional:!1},status:{type:K,isOptional:!1}}})},policy:{auth:"admin"}}),Ni=U({meta:{key:"communication.intent.classify",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","intent","classify"],description:"Classify the intent of a message or thread",goal:"Route and triage based on intent category and confidence",context:"Read-only AI operation; returns suggestion state, not canonical truth"},io:{input:z({name:"ClassifyIntentInput",fields:{threadId:{type:x.String_unsecure(),isOptional:!1},messageId:{type:x.String_unsecure(),isOptional:!0}}}),output:de},policy:{auth:"admin"}}),ji=U({meta:{key:"communication.summary.generate",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","summary"],description:"Generate a summary of a thread",goal:"Produce a concise summary with facts, actions, decisions, risks, and source references",context:"Draft-only AI operation used for handoffs, inbox views, and agent context"},io:{input:z({name:"GenerateSummaryInput",fields:{threadId:{type:x.String_unsecure(),isOptional:!1},messageIds:{type:x.String_unsecure(),isArray:!0,isOptional:!0}}}),output:Z},policy:{auth:"user"}}),Pi=U({meta:{key:"communication.action.extract",version:"1.0.0",stability:"experimental",owners:[...F],tags:["communication","action","extract"],description:"Extract implied actions from a thread",goal:"Turn conversation text into structured work candidates with evidence",context:"Draft-only AI operation; does not mutate external work items"},io:{input:z({name:"ExtractActionsInput",fields:{threadId:{type:x.String_unsecure(),isOptional:!1},messageIds:{type:x.String_unsecure(),isArray:!0,isOptional:!0}}}),output:z({name:"ExtractActionsOutput",fields:{actions:{type:X,isArray:!0,isOptional:!1}}})},policy:{auth:"user"}});import{defineCommand as Qe,defineEvent as Je,defineQuery as Lt,docId as Bt}from"@lssm/lib.contracts-spec";import{defineEnum as Ye,defineSchemaModel as V,ScalarTypeEnum as i}from"@lssm/lib.schema";var H=["platform.communication-os","platform.support-os"],qt={id:"communication-os.support-internal-note.v1",title:"CommunicationOS private Support note authority",body:"CommunicationOS owns private note content and immutable evidence. SupportOS stores only opaque note and evidence references. Service requests derive tenant, workspace, actor, audience, and capabilities from a short-lived AuthOS grant; verification is redacted and never returns note content.",kind:"reference",route:"/docs/communication-os/support-internal-notes-v1",visibility:"public"},W=[Bt(qt.id)],Xe=Ye("CommunicationSupportInternalNoteVisibility",["internal"]),Gt=V({name:"CommunicationSupportInternalNoteCreateV1Input",fields:{caseRef:{type:i.String_unsecure(),isOptional:!1},body:{type:i.String_unsecure(),isOptional:!1},idempotencyKey:{type:i.String_unsecure(),isOptional:!1}}}),zt=V({name:"CommunicationSupportInternalNoteCreateForIntentV1Input",fields:{caseRef:{type:i.String_unsecure(),isOptional:!1},intentRef:{type:i.String_unsecure(),isOptional:!1},body:{type:i.String_unsecure(),isOptional:!1},idempotencyKey:{type:i.String_unsecure(),isOptional:!1}}}),xe=V({name:"CommunicationSupportInternalNoteEvidenceV1",fields:{noteRef:{type:i.String_unsecure(),isOptional:!1},caseRef:{type:i.String_unsecure(),isOptional:!1},evidenceRef:{type:i.String_unsecure(),isOptional:!1},visibility:{type:Xe,isOptional:!1},createdAt:{type:i.DateTime(),isOptional:!1}}}),Ze=V({name:"CommunicationSupportInternalNoteIntentEvidenceV1",fields:{...xe.config.fields,intentRef:{type:i.String_unsecure(),isOptional:!1},deliveryRef:{type:i.String_unsecure(),isOptional:!1},grantEvidenceRef:{type:i.String_unsecure(),isOptional:!1}}}),Ut=V({name:"CommunicationSupportInternalNoteVerifyV1Input",fields:{caseRef:{type:i.String_unsecure(),isOptional:!1},noteRef:{type:i.String_unsecure(),isOptional:!1},evidenceRef:{type:i.String_unsecure(),isOptional:!1}}}),Ft=V({name:"CommunicationSupportInternalNoteVerificationV1",fields:{status:{type:Ye("CommunicationSupportInternalNoteVerificationStatus",["verified"]),isOptional:!1},caseRef:{type:i.String_unsecure(),isOptional:!1},noteRef:{type:i.String_unsecure(),isOptional:!1},evidenceRef:{type:i.String_unsecure(),isOptional:!1},visibility:{type:Xe,isOptional:!1}}}),Ht=Qe({meta:{key:"communication.support.internal-note.create",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","private"],description:"Create one encrypted private Support note in CommunicationOS",goal:"Keep note content in CommunicationOS while SupportOS stores opaque evidence",context:"Server scope and actor come only from a short-lived AuthOS downstream grant",docId:W},io:{input:Gt,output:xe},policy:{auth:"admin"}}),Wt=Qe({meta:{key:"communication.support.internal-note.create-for-intent",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","private","reconciliation"],description:"Create an encrypted Support note bound to a body-free SupportOS intent",goal:"Make cross-service note attachment replayable without copying content",context:"The short-lived AuthOS grant binds scope and actor; the intent is opaque, redacted correlation metadata",docId:W},io:{input:zt,output:Ze},policy:{auth:"admin"}}),Ki=Lt({meta:{key:"communication.support.internal-note.verify",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","verify"],description:"Verify exact private-note evidence without returning content",goal:"Let SupportOS validate its opaque note reference at the authority boundary",context:"The query requires exact tenant, workspace, case, note, evidence, audience, and capability binding",docId:W},io:{input:Ut,output:Ft},policy:{auth:"admin"}}),Qi=Je({meta:{key:"communication.support.internal-note.created",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","event"],description:"Immutable redacted evidence that a private Support note was created",docId:W},payload:xe}),Ji=Je({meta:{key:"communication.support.internal-note.reconciliation-ready",version:"1.0.0",stability:"experimental",owners:[...H],tags:["communication","support","internal-note","reconciliation"],description:"Redacted durable delivery evidence for a SupportOS note intent",docId:W},payload:Ze}),Yi={create:"communication.support.internal-note.create",createForIntent:"communication.support.internal-note.create-for-intent",verify:"communication.support.internal-note.verify"};import{defineCommand as Ce}from"@lssm/lib.contracts-spec";import{defineSchemaModel as ke,ScalarTypeEnum as m}from"@lssm/lib.schema";var we=["platform.communication-os","platform.ai-routing"],to=Ce({meta:{key:"comms.thread.summarize",version:"1.0.0",stability:"experimental",owners:[...we],tags:["comms","ai","thread","summarize"],description:"Produce a persona-scoped summary of a communication thread via the AI routing layer",goal:"Give each persona a concise, role-appropriate digest of a thread without exposing cross-persona data",context:"Capability-gated AI operation. Auditor variant omits PII and redacts sensitive identifiers. "+"Draft-only \u2014 summary is returned to caller, not persisted by this command. "+"Handler routes to the appropriate model via lib.ai-agent provider selection."},io:{input:ke({name:"CommsThreadSummarizeInput",fields:{threadId:{type:m.String_unsecure(),isOptional:!1},messageIds:{type:m.String_unsecure(),isArray:!0,isOptional:!0},audiencePersona:{type:m.String_unsecure(),isOptional:!0}}}),output:Z,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},INSUFFICIENT_MESSAGES:{description:"Thread has too few messages to produce a meaningful summary",http:422,when:"Thread contains fewer messages than the minimum required for summarization"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"},CONTENT_POLICY_BLOCKED:{description:"Summary blocked by content safety policy",http:422,when:"Thread content triggers a content policy gate; summary cannot be generated without redaction"}}},policy:{auth:"user"}}),no=Ce({meta:{key:"comms.reply.draft",version:"1.0.0",stability:"experimental",owners:[...we],tags:["comms","ai","reply","draft"],description:"Generate a context-aware reply draft via the AI routing layer",goal:"Produce a safe, policy-checked reply draft that the actor can review and send",context:"Capability-gated AI operation. Not available to auditor persona. Draft status reflects policy evaluation: requires_review when policy gates apply. Handler calls communication.reply.draft internals after capability check."},io:{input:ke({name:"CommsReplyDraftInput",fields:{threadId:{type:m.String_unsecure(),isOptional:!1},messageId:{type:m.String_unsecure(),isOptional:!0},instruction:{type:m.String_unsecure(),isOptional:!0},toneHint:{type:m.String_unsecure(),isOptional:!0}}}),output:P,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},POLICY_BLOCKED:{description:"Reply draft blocked by content or safety policy",http:422,when:"Thread content or instruction triggers a policy gate; draft cannot be generated"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"},DRAFT_LIMIT_EXCEEDED:{description:"Too many pending drafts exist for this thread",http:429,when:"Actor has reached the maximum number of unreviewed drafts on this thread"}}},policy:{auth:"user"}}),io=Ce({meta:{key:"comms.handoff.suggest",version:"1.0.0",stability:"experimental",owners:[...we],tags:["comms","ai","handoff","suggest"],description:"Suggest whether a thread warrants a handoff and to whom, via the AI routing layer",goal:"Surface handoff opportunities with evidence before the actor decides to act",context:"AI suggestion only \u2014 does not create a HandoffPacket. "+"Handler evaluates thread urgency, owner gaps, and work-graph signals to produce a ranked suggestion. Auditor variant is read-only and may not trigger the `communication.handoff.create` action."},io:{input:ke({name:"CommsHandoffSuggestInput",fields:{threadId:{type:m.String_unsecure(),isOptional:!1},suggestedToOwner:{type:m.String_unsecure(),isOptional:!0},context:{type:m.String_unsecure(),isOptional:!0}}}),output:ee,errors:{THREAD_NOT_FOUND:{description:"No thread exists for the provided threadId",http:404,when:"threadId does not resolve to a persisted thread"},INSUFFICIENT_CONTEXT:{description:"Thread has insufficient context to produce a handoff suggestion",http:422,when:"Thread is too short or lacks ownership/urgency signals for the model to reason about"},HANDOFF_NOT_WARRANTED:{description:"Analysis concludes no handoff is needed at this time",http:422,when:"Thread signals are below the handoff threshold; caller should surface this as a no-op result rather than an error"},AI_PROVIDER_UNAVAILABLE:{description:"Upstream AI provider could not be reached or returned an error",http:503,when:"lib.ai-agent provider selection fails or provider returns a non-retryable error"}}},policy:{auth:"user"}});export{pn as BlockReplyByPolicyCommand,Yn as COMMUNICATION_DELIVERY_REPROOF_CONTRACT,Jn as COMMUNICATION_MESSAGE_QUEUE_CUSTODY_CONTRACT,Qn as COMMUNICATION_MESSAGE_REPLAY_CONTRACT,Oi as CheckSubjectConsentQuery,Ni as ClassifyIntentCommand,io as CommsHandoffSuggestCommand,no as CommsReplyDraftCommand,to as CommsThreadSummarizeCommand,ri as ConnectCommunicationChannelV2Command,dt as CreateCommunicationGovernedWorkV1Command,ni as CreateCommunicationRoomV2Command,ti as CreateCommunicationSpaceV2Command,Wt as CreateCommunicationSupportInternalNoteForIntentV1Command,Ht as CreateCommunicationSupportInternalNoteV1Command,fn as CreateHandoffCommand,Di as CreateThreadCommand,It as DecideCommunicationIdentityV1Command,zn as DeleteCommunicationMessageV2Command,rn as DraftReplyCommand,Gn as EditCommunicationMessageV2Command,hi as EraseSubjectCommand,On as EscalateToHumanCommand,Pi as ExtractActionsCommand,an as ExtractDecisionsCommand,sn as ExtractRisksCommand,ji as GenerateSummaryCommand,Ci as GetThreadQuery,Vi as IngestMessageCommand,oi as ListCommunicationRoomsV2Query,ii as ListCommunicationSpacesV2Query,wi as ListMessagesQuery,hn as ProposeIdentityLinkCommand,gn as ProposeThreadLinkCommand,Fn as RecordCommunicationReceiptV2Command,Sn as RecordHumanFeedbackCommand,Wn as SearchCommunicationMessagesV2Query,Kn as SearchCommunicationMessagesV3Query,ki as SearchThreadsQuery,Bn as SendCommunicationMessageV2Command,qn as SendCommunicationMessageV3Command,xt as SendCommunicationMessageV3Input,cn as SendReplyCommand,si as SetCommunicationAuthorityGrantV2Command,Hn as SetCommunicationInboxStateV2Command,ai as SetCommunicationMembershipV2Command,Un as SetCommunicationReactionV2Command,ci as SyncCommunicationConnectionV2Command,mt as TransitionCommunicationGovernedWorkV1Command,xi as UpdateThreadStatusCommand};
@@ -0,0 +1,108 @@
1
+ import { z } from 'zod';
2
+ import type { CommunicationDeliveryIntentV1 } from './delivery-intent.js';
3
+ import type { CommunicationDeliveryProgressV1 } from './delivery-progress.js';
4
+ export declare const COMMUNICATION_AGENT_PROFILE_SCHEMA_VERSION: '1.0.0';
5
+ export declare const COMMUNICATION_AGENT_LIFECYCLE_LINK_SCHEMA_VERSION: '1.0.0';
6
+ export declare const CommunicationAgentOmnichannelDocBlock: {
7
+ id: string;
8
+ title: string;
9
+ body: string;
10
+ kind: "reference";
11
+ route: string;
12
+ visibility: "public";
13
+ };
14
+ export declare const CommunicationDigestV1Schema: z.ZodString;
15
+ export declare const CommunicationArtifactBindingV1Schema: z.ZodObject<{
16
+ ref: z.ZodString;
17
+ digest: z.ZodString;
18
+ }, z.core.$strict>;
19
+ export declare const CommunicationVersionedArtifactBindingV1Schema: z.ZodObject<{
20
+ ref: z.ZodString;
21
+ digest: z.ZodString;
22
+ revision: z.ZodNumber;
23
+ }, z.core.$strict>;
24
+ /** Canonical authority scope carried by every agent delivery artifact. */
25
+ export declare const CommunicationScopeBindingV1Schema: z.ZodObject<{
26
+ tenantRef: z.ZodString;
27
+ workspaceRef: z.ZodOptional<z.ZodString>;
28
+ spaceRef: z.ZodOptional<z.ZodString>;
29
+ subjectRef: z.ZodString;
30
+ }, z.core.$strict>;
31
+ export declare const CommunicationAgentProfileV1Schema: z.ZodObject<{
32
+ schemaVersion: z.ZodLiteral<"1.0.0">;
33
+ profileRef: z.ZodString;
34
+ revision: z.ZodNumber;
35
+ agentRef: z.ZodString;
36
+ applicationRef: z.ZodString;
37
+ scope: z.ZodObject<{
38
+ tenantRef: z.ZodString;
39
+ workspaceRef: z.ZodOptional<z.ZodString>;
40
+ spaceRef: z.ZodOptional<z.ZodString>;
41
+ subjectRef: z.ZodString;
42
+ }, z.core.$strict>;
43
+ routeBindings: z.ZodArray<z.ZodObject<{
44
+ ref: z.ZodString;
45
+ digest: z.ZodString;
46
+ revision: z.ZodNumber;
47
+ }, z.core.$strict>>;
48
+ connectionRefs: z.ZodArray<z.ZodString>;
49
+ preferenceSet: z.ZodObject<{
50
+ ref: z.ZodString;
51
+ digest: z.ZodString;
52
+ revision: z.ZodNumber;
53
+ }, z.core.$strict>;
54
+ policyRefs: z.ZodArray<z.ZodString>;
55
+ evidenceRefs: z.ZodArray<z.ZodString>;
56
+ createdAt: z.ZodString;
57
+ updatedAt: z.ZodString;
58
+ profileDigest: z.ZodString;
59
+ }, z.core.$strict>;
60
+ export declare const CommunicationAgentLifecycleLinkV1Schema: z.ZodObject<{
61
+ schemaVersion: z.ZodLiteral<"1.0.0">;
62
+ linkRef: z.ZodString;
63
+ profile: z.ZodObject<{
64
+ ref: z.ZodString;
65
+ digest: z.ZodString;
66
+ revision: z.ZodNumber;
67
+ }, z.core.$strict>;
68
+ agentRef: z.ZodString;
69
+ applicationRef: z.ZodString;
70
+ scope: z.ZodObject<{
71
+ tenantRef: z.ZodString;
72
+ workspaceRef: z.ZodOptional<z.ZodString>;
73
+ spaceRef: z.ZodOptional<z.ZodString>;
74
+ subjectRef: z.ZodString;
75
+ }, z.core.$strict>;
76
+ runRef: z.ZodOptional<z.ZodString>;
77
+ taskRef: z.ZodOptional<z.ZodString>;
78
+ helpRequestRef: z.ZodOptional<z.ZodString>;
79
+ approvalRequestRef: z.ZodOptional<z.ZodString>;
80
+ backgroundResultRef: z.ZodOptional<z.ZodString>;
81
+ canonicalConversation: z.ZodOptional<z.ZodObject<{
82
+ ref: z.ZodString;
83
+ digest: z.ZodString;
84
+ }, z.core.$strict>>;
85
+ session: z.ZodOptional<z.ZodObject<{
86
+ ref: z.ZodString;
87
+ digest: z.ZodString;
88
+ revision: z.ZodNumber;
89
+ }, z.core.$strict>>;
90
+ correlationRef: z.ZodString;
91
+ evidenceRefs: z.ZodArray<z.ZodString>;
92
+ }, z.core.$strict>;
93
+ export type CommunicationAgentProfileV1 = z.infer<typeof CommunicationAgentProfileV1Schema>;
94
+ export type CommunicationAgentLifecycleLinkV1 = z.infer<typeof CommunicationAgentLifecycleLinkV1Schema>;
95
+ export type CommunicationScopeBindingV1 = z.infer<typeof CommunicationScopeBindingV1Schema>;
96
+ export type CommunicationArtifactBindingV1 = z.infer<typeof CommunicationArtifactBindingV1Schema>;
97
+ export type CommunicationVersionedArtifactBindingV1 = z.infer<typeof CommunicationVersionedArtifactBindingV1Schema>;
98
+ export declare function communicationScopeBindingsEqualV1(left: CommunicationScopeBindingV1, right: CommunicationScopeBindingV1): boolean;
99
+ /** Pure cross-artifact validation; an empty result is the only valid binding. */
100
+ export declare function validateCommunicationAgentLifecycleBindingV1(input: {
101
+ profile: CommunicationAgentProfileV1;
102
+ lifecycleLink: CommunicationAgentLifecycleLinkV1;
103
+ }): string[];
104
+ /** Pure delivery/progress identity and scope binding validation. */
105
+ export declare function validateCommunicationDeliveryProgressBindingV1(input: {
106
+ intent: CommunicationDeliveryIntentV1;
107
+ progress: CommunicationDeliveryProgressV1;
108
+ }): string[];
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{z as o}from"zod";var d="1.0.0",g="1.0.0",y={id:"communication-os.agent-omnichannel.v1",title:"CommunicationOS agent omnichannel contracts",body:"Provider-neutral agent profiles and lifecycle links bind applications, runs, tasks, help requests, background results, routes, preferences, policies, and evidence through opaque references. They grant no provider access or effect authority.",kind:"reference",route:"/docs/communication-os/agent-omnichannel-v1",visibility:"public"},t=o.string().trim().min(1),a=o.string().datetime({offset:!0}),f=o.string().regex(/^sha256:[a-f0-9]{64}$/),p=o.object({ref:t,digest:f}).strict(),r=p.extend({revision:o.number().int().positive()}).strict(),m=o.object({tenantRef:t,workspaceRef:t.optional(),spaceRef:t.optional(),subjectRef:t}).strict(),h=o.object({schemaVersion:o.literal(d),profileRef:t,revision:o.number().int().positive(),agentRef:t,applicationRef:t,scope:m,routeBindings:o.array(r),connectionRefs:o.array(t),preferenceSet:r,policyRefs:o.array(t).min(1),evidenceRefs:o.array(t).min(1),createdAt:a,updatedAt:a,profileDigest:f}).strict().superRefine((e,i)=>{for(let s of["connectionRefs","policyRefs","evidenceRefs"])if(new Set(e[s]).size!==e[s].length)i.addIssue({code:o.ZodIssueCode.custom,path:[s],message:`${s} must be unique`});let n=e.routeBindings.map((s)=>s.ref);if(new Set(n).size!==n.length)i.addIssue({code:o.ZodIssueCode.custom,path:["routeBindings"],message:"route bindings must be unique"})}),C=o.object({schemaVersion:o.literal(g),linkRef:t,profile:r,agentRef:t,applicationRef:t,scope:m,runRef:t.optional(),taskRef:t.optional(),helpRequestRef:t.optional(),approvalRequestRef:t.optional(),backgroundResultRef:t.optional(),canonicalConversation:p.optional(),session:r.optional(),correlationRef:t,evidenceRefs:o.array(t).min(1)}).strict().superRefine((e,i)=>{if(new Set(e.evidenceRefs).size!==e.evidenceRefs.length)i.addIssue({code:o.ZodIssueCode.custom,path:["evidenceRefs"],message:"evidenceRefs must be unique"});if(!e.runRef&&!e.taskRef&&!e.helpRequestRef&&!e.approvalRequestRef&&!e.backgroundResultRef)i.addIssue({code:o.ZodIssueCode.custom,path:["runRef"],message:"at least one run, task, help request, approval request, or background result ref is required"})});function u(e,i){return e.tenantRef===i.tenantRef&&e.workspaceRef===i.workspaceRef&&e.spaceRef===i.spaceRef&&e.subjectRef===i.subjectRef}function v(e){let i=[];for(let n of["agentRef","applicationRef"])if(e.profile[n]!==e.lifecycleLink[n])i.push(`Lifecycle ${n} does not match the agent profile`);if(e.lifecycleLink.profile.ref!==e.profile.profileRef||e.lifecycleLink.profile.revision!==e.profile.revision||e.lifecycleLink.profile.digest!==e.profile.profileDigest)i.push("Lifecycle profile binding does not match the agent profile");if(!u(e.profile.scope,e.lifecycleLink.scope))i.push("Lifecycle scope does not match the agent profile");return i}function V(e){let{intent:i,progress:n}=e,s=[];if(n.deliveryRef!==i.deliveryRef||n.intent.ref!==i.deliveryRef||n.intent.digest!==i.deliveryDigest)s.push("Progress delivery does not match the intent");if(!u(n.scope,i.scope))s.push("Progress scope does not match the intent");if(n.recipientRef!==i.recipientRefs[0])s.push("Progress recipient does not match the intent");let c=i.requestedRoutes.find((l)=>l.ref===n.route.ref);if(!c||c.revision!==n.route.revision||c.digest!==n.route.digest)s.push("Progress route was not requested by the intent");if(Date.parse(n.occurredAt)<Date.parse(i.createdAt)||Date.parse(n.occurredAt)>Date.parse(i.expiresAt))s.push("Progress occurred outside the intent validity window");return s}export{g as COMMUNICATION_AGENT_LIFECYCLE_LINK_SCHEMA_VERSION,d as COMMUNICATION_AGENT_PROFILE_SCHEMA_VERSION,C as CommunicationAgentLifecycleLinkV1Schema,y as CommunicationAgentOmnichannelDocBlock,h as CommunicationAgentProfileV1Schema,p as CommunicationArtifactBindingV1Schema,f as CommunicationDigestV1Schema,m as CommunicationScopeBindingV1Schema,r as CommunicationVersionedArtifactBindingV1Schema,u as communicationScopeBindingsEqualV1,v as validateCommunicationAgentLifecycleBindingV1,V as validateCommunicationDeliveryProgressBindingV1};
@@ -0,0 +1 @@
1
+ export {};