@econ-v1/domain 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/dist/errors/index.d.ts +41 -0
  2. package/dist/errors/index.d.ts.map +1 -0
  3. package/dist/errors/index.js +45 -0
  4. package/dist/errors/index.js.map +1 -0
  5. package/dist/events/index.d.ts +55 -0
  6. package/dist/events/index.d.ts.map +1 -0
  7. package/dist/events/index.js +17 -0
  8. package/dist/events/index.js.map +1 -0
  9. package/dist/index.d.ts +47 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +24 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/models/agent.d.ts +12 -0
  14. package/dist/models/agent.d.ts.map +1 -0
  15. package/dist/models/agent.js +17 -0
  16. package/dist/models/agent.js.map +1 -0
  17. package/dist/models/conversation.d.ts +3 -0
  18. package/dist/models/conversation.d.ts.map +1 -0
  19. package/dist/models/conversation.js +2 -0
  20. package/dist/models/conversation.js.map +1 -0
  21. package/dist/models/delegation.d.ts +4 -0
  22. package/dist/models/delegation.d.ts.map +1 -0
  23. package/dist/models/delegation.js +23 -0
  24. package/dist/models/delegation.js.map +1 -0
  25. package/dist/models/device-identity.d.ts +4 -0
  26. package/dist/models/device-identity.d.ts.map +1 -0
  27. package/dist/models/device-identity.js +53 -0
  28. package/dist/models/device-identity.js.map +1 -0
  29. package/dist/models/graph.d.ts +20 -0
  30. package/dist/models/graph.d.ts.map +1 -0
  31. package/dist/models/graph.js +30 -0
  32. package/dist/models/graph.js.map +1 -0
  33. package/dist/models/index.d.ts +18 -0
  34. package/dist/models/index.d.ts.map +1 -0
  35. package/dist/models/index.js +8 -0
  36. package/dist/models/index.js.map +1 -0
  37. package/dist/models/json.d.ts +8 -0
  38. package/dist/models/json.d.ts.map +1 -0
  39. package/dist/models/json.js +2 -0
  40. package/dist/models/json.js.map +1 -0
  41. package/dist/models/l402.d.ts +15 -0
  42. package/dist/models/l402.d.ts.map +1 -0
  43. package/dist/models/l402.js +2 -0
  44. package/dist/models/l402.js.map +1 -0
  45. package/dist/models/live-query-definition.d.ts +22 -0
  46. package/dist/models/live-query-definition.d.ts.map +1 -0
  47. package/dist/models/live-query-definition.js +2 -0
  48. package/dist/models/live-query-definition.js.map +1 -0
  49. package/dist/models/outbox-intent.d.ts +10 -0
  50. package/dist/models/outbox-intent.d.ts.map +1 -0
  51. package/dist/models/outbox-intent.js +2 -0
  52. package/dist/models/outbox-intent.js.map +1 -0
  53. package/dist/models/outbox.d.ts +50 -0
  54. package/dist/models/outbox.d.ts.map +1 -0
  55. package/dist/models/outbox.js +133 -0
  56. package/dist/models/outbox.js.map +1 -0
  57. package/dist/models/owner-views.d.ts +67 -0
  58. package/dist/models/owner-views.d.ts.map +1 -0
  59. package/dist/models/owner-views.js +7 -0
  60. package/dist/models/owner-views.js.map +1 -0
  61. package/dist/models/payment.d.ts +32 -0
  62. package/dist/models/payment.d.ts.map +1 -0
  63. package/dist/models/payment.js +3 -0
  64. package/dist/models/payment.js.map +1 -0
  65. package/dist/models/query-diff.d.ts +7 -0
  66. package/dist/models/query-diff.d.ts.map +1 -0
  67. package/dist/models/query-diff.js +2 -0
  68. package/dist/models/query-diff.js.map +1 -0
  69. package/dist/models/repository-write.d.ts +7 -0
  70. package/dist/models/repository-write.d.ts.map +1 -0
  71. package/dist/models/repository-write.js +2 -0
  72. package/dist/models/repository-write.js.map +1 -0
  73. package/dist/models/revisioned-commands.d.ts +24 -0
  74. package/dist/models/revisioned-commands.d.ts.map +1 -0
  75. package/dist/models/revisioned-commands.js +35 -0
  76. package/dist/models/revisioned-commands.js.map +1 -0
  77. package/dist/models/revisioned.d.ts +19 -0
  78. package/dist/models/revisioned.d.ts.map +1 -0
  79. package/dist/models/revisioned.js +2 -0
  80. package/dist/models/revisioned.js.map +1 -0
  81. package/dist/models/settings.d.ts +5 -0
  82. package/dist/models/settings.d.ts.map +1 -0
  83. package/dist/models/settings.js +2 -0
  84. package/dist/models/settings.js.map +1 -0
  85. package/dist/models/sync.d.ts +50 -0
  86. package/dist/models/sync.d.ts.map +1 -0
  87. package/dist/models/sync.js +2 -0
  88. package/dist/models/sync.js.map +1 -0
  89. package/dist/models/wallet.d.ts +52 -0
  90. package/dist/models/wallet.d.ts.map +1 -0
  91. package/dist/models/wallet.js +2 -0
  92. package/dist/models/wallet.js.map +1 -0
  93. package/dist/queries/conversations.d.ts +12 -0
  94. package/dist/queries/conversations.d.ts.map +1 -0
  95. package/dist/queries/conversations.js +59 -0
  96. package/dist/queries/conversations.js.map +1 -0
  97. package/dist/queries/notifications.d.ts +5 -0
  98. package/dist/queries/notifications.d.ts.map +1 -0
  99. package/dist/queries/notifications.js +27 -0
  100. package/dist/queries/notifications.js.map +1 -0
  101. package/dist/queries/revisioned.d.ts +17 -0
  102. package/dist/queries/revisioned.d.ts.map +1 -0
  103. package/dist/queries/revisioned.js +58 -0
  104. package/dist/queries/revisioned.js.map +1 -0
  105. package/dist/queries/wallet.d.ts +11 -0
  106. package/dist/queries/wallet.d.ts.map +1 -0
  107. package/dist/queries/wallet.js +42 -0
  108. package/dist/queries/wallet.js.map +1 -0
  109. package/dist/services/conversation-service.d.ts +42 -0
  110. package/dist/services/conversation-service.d.ts.map +1 -0
  111. package/dist/services/conversation-service.js +95 -0
  112. package/dist/services/conversation-service.js.map +1 -0
  113. package/dist/services/conversation-sync.d.ts +7 -0
  114. package/dist/services/conversation-sync.d.ts.map +1 -0
  115. package/dist/services/conversation-sync.js +9 -0
  116. package/dist/services/conversation-sync.js.map +1 -0
  117. package/dist/services/gossip-service.d.ts +18 -0
  118. package/dist/services/gossip-service.d.ts.map +1 -0
  119. package/dist/services/gossip-service.js +53 -0
  120. package/dist/services/gossip-service.js.map +1 -0
  121. package/dist/services/lan-candidate-refresh-service.d.ts +11 -0
  122. package/dist/services/lan-candidate-refresh-service.d.ts.map +1 -0
  123. package/dist/services/lan-candidate-refresh-service.js +32 -0
  124. package/dist/services/lan-candidate-refresh-service.js.map +1 -0
  125. package/dist/services/outbox-service.d.ts +47 -0
  126. package/dist/services/outbox-service.d.ts.map +1 -0
  127. package/dist/services/outbox-service.js +151 -0
  128. package/dist/services/outbox-service.js.map +1 -0
  129. package/dist/services/owner-view-service.d.ts +10 -0
  130. package/dist/services/owner-view-service.d.ts.map +1 -0
  131. package/dist/services/owner-view-service.js +21 -0
  132. package/dist/services/owner-view-service.js.map +1 -0
  133. package/dist/services/peer-directory-service.d.ts +26 -0
  134. package/dist/services/peer-directory-service.d.ts.map +1 -0
  135. package/dist/services/peer-directory-service.js +79 -0
  136. package/dist/services/peer-directory-service.js.map +1 -0
  137. package/dist/services/revisioned-domain-service.d.ts +46 -0
  138. package/dist/services/revisioned-domain-service.d.ts.map +1 -0
  139. package/dist/services/revisioned-domain-service.js +205 -0
  140. package/dist/services/revisioned-domain-service.js.map +1 -0
  141. package/dist/services/session-service.d.ts +10 -0
  142. package/dist/services/session-service.d.ts.map +1 -0
  143. package/dist/services/session-service.js +20 -0
  144. package/dist/services/session-service.js.map +1 -0
  145. package/dist/services/sync/authoritative-mirror.d.ts +24 -0
  146. package/dist/services/sync/authoritative-mirror.d.ts.map +1 -0
  147. package/dist/services/sync/authoritative-mirror.js +71 -0
  148. package/dist/services/sync/authoritative-mirror.js.map +1 -0
  149. package/dist/services/sync/index.d.ts +8 -0
  150. package/dist/services/sync/index.d.ts.map +1 -0
  151. package/dist/services/sync/index.js +4 -0
  152. package/dist/services/sync/index.js.map +1 -0
  153. package/dist/services/sync/log-sync.d.ts +12 -0
  154. package/dist/services/sync/log-sync.d.ts.map +1 -0
  155. package/dist/services/sync/log-sync.js +20 -0
  156. package/dist/services/sync/log-sync.js.map +1 -0
  157. package/dist/services/sync/revision-merge.d.ts +20 -0
  158. package/dist/services/sync/revision-merge.d.ts.map +1 -0
  159. package/dist/services/sync/revision-merge.js +46 -0
  160. package/dist/services/sync/revision-merge.js.map +1 -0
  161. package/dist/services/sync/strategy.d.ts +2 -0
  162. package/dist/services/sync/strategy.d.ts.map +1 -0
  163. package/dist/services/sync/strategy.js +2 -0
  164. package/dist/services/sync/strategy.js.map +1 -0
  165. package/dist/services/transport-manager.d.ts +22 -0
  166. package/dist/services/transport-manager.d.ts.map +1 -0
  167. package/dist/services/transport-manager.js +133 -0
  168. package/dist/services/transport-manager.js.map +1 -0
  169. package/dist/services/wallet-mirror-service.d.ts +46 -0
  170. package/dist/services/wallet-mirror-service.d.ts.map +1 -0
  171. package/dist/services/wallet-mirror-service.js +334 -0
  172. package/dist/services/wallet-mirror-service.js.map +1 -0
  173. package/package.json +56 -0
@@ -0,0 +1,52 @@
1
+ import type { AuthoritativeSnapshot } from "./sync.js";
2
+ import type { L402Receipt } from "./l402.js";
3
+ import type { PaymentRecord, WalletCommandResult } from "./payment.js";
4
+ export interface WalletSnapshotPayload {
5
+ readonly balanceMsat: number;
6
+ readonly l402: readonly L402Receipt[];
7
+ readonly payments: readonly PaymentRecord[];
8
+ readonly spendableMsat: number;
9
+ }
10
+ export type WalletAuthoritativeSnapshot = AuthoritativeSnapshot<WalletSnapshotPayload>;
11
+ export interface WalletBalanceView {
12
+ readonly balanceMsat?: number;
13
+ readonly freshness: "fresh" | "stale" | "unavailable";
14
+ readonly observedAt?: string;
15
+ readonly spendableMsat?: number;
16
+ readonly staleAt?: string;
17
+ }
18
+ export interface PaymentHistoryView {
19
+ readonly freshness: "fresh" | "stale" | "unavailable";
20
+ readonly items: readonly PaymentRecord[];
21
+ readonly observedAt?: string;
22
+ readonly staleAt?: string;
23
+ }
24
+ export interface WalletMirrorRepository {
25
+ readCommandResult(idempotencyKey: string): Promise<WalletCommandResult | undefined>;
26
+ readSnapshot(): Promise<WalletAuthoritativeSnapshot | undefined>;
27
+ writeCommandResult(idempotencyKey: string, result: WalletCommandResult): Promise<void>;
28
+ /** Implementations must emit the normal domain entity event when this write commits. */
29
+ writeSnapshot(snapshot: WalletAuthoritativeSnapshot): Promise<void>;
30
+ }
31
+ export interface CreateInvoiceInput {
32
+ readonly amountMsat: number;
33
+ readonly description?: string;
34
+ readonly idempotencyKey: string;
35
+ }
36
+ export interface PayInvoiceInput {
37
+ readonly amountMsat: number;
38
+ readonly expiresAt?: string;
39
+ readonly idempotencyKey: string;
40
+ readonly invoiceId: string;
41
+ }
42
+ export type WalletCommand = {
43
+ readonly amountMsat: number;
44
+ readonly description?: string;
45
+ readonly kind: "create-invoice";
46
+ } | {
47
+ readonly amountMsat: number;
48
+ readonly expiresAt?: string;
49
+ readonly invoiceId: string;
50
+ readonly kind: "pay-invoice";
51
+ };
52
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/models/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEvE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,MAAM,2BAA2B,GAAG,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;AAEvF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;IACtD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;IACtD,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IACpF,YAAY,IAAI,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,CAAC;IACjE,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,wFAAwF;IACxF,aAAa,CAAC,QAAQ,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC/F;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/models/wallet.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { ConversationRepository } from "@econ-v1/ports";
2
+ import type { ConversationListParams, MessageListParams } from "../models/conversation.js";
3
+ import type { LiveQueryDefinition } from "../models/live-query-definition.js";
4
+ export declare function createConversationListQuery(repository: Pick<ConversationRepository, "listConversations">): LiveQueryDefinition<ConversationListParams, Awaited<ReturnType<ConversationRepository["listConversations"]>>[number]>;
5
+ export declare function createConversationMessagesQuery(repository: Pick<ConversationRepository, "listMessages">): LiveQueryDefinition<MessageListParams & {
6
+ readonly conversationId: string;
7
+ }, Awaited<ReturnType<ConversationRepository["listMessages"]>>[number]>;
8
+ export declare function parseConversationListParams(value: unknown): ConversationListParams;
9
+ export declare function parseConversationMessagesParams(value: unknown): MessageListParams & {
10
+ readonly conversationId: string;
11
+ };
12
+ //# sourceMappingURL=conversations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../src/queries/conversations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,IAAI,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,GAC5D,mBAAmB,CAAC,sBAAsB,EAAE,OAAO,CAAC,UAAU,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAOvH;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,IAAI,CAAC,sBAAsB,EAAE,cAAc,CAAC,GACvD,mBAAmB,CAAC,iBAAiB,GAAG;IAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,UAAU,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAUnJ;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAGlF;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,GAAG;IAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAQvH"}
@@ -0,0 +1,59 @@
1
+ export function createConversationListQuery(repository) {
2
+ return {
3
+ invalidateOn: ["domain.entity-changed", "sync.delta-applied"],
4
+ key: (row) => row.id,
5
+ name: "conversation.list.v1",
6
+ run: async (params) => await repository.listConversations(parseConversationListParams(params)),
7
+ };
8
+ }
9
+ export function createConversationMessagesQuery(repository) {
10
+ return {
11
+ invalidateOn: ["domain.entity-changed", "sync.delta-applied"],
12
+ key: (row) => row.id,
13
+ name: "conversation.messages.v1",
14
+ run: async (params) => {
15
+ const parsed = parseConversationMessagesParams(params);
16
+ return await repository.listMessages(parsed.conversationId, parsed);
17
+ },
18
+ };
19
+ }
20
+ export function parseConversationListParams(value) {
21
+ const record = exactRecord(value, ["before", "limit"], "conversation list");
22
+ return { ...optionalBefore(record.before, "conversation list"), ...optionalLimit(record.limit, "conversation list") };
23
+ }
24
+ export function parseConversationMessagesParams(value) {
25
+ const record = exactRecord(value, ["before", "conversationId", "limit"], "conversation messages");
26
+ if (typeof record.conversationId !== "string" || record.conversationId.trim() === "")
27
+ throw invalid("conversation messages");
28
+ return {
29
+ conversationId: record.conversationId,
30
+ ...optionalBefore(record.before, "conversation messages"),
31
+ ...optionalLimit(record.limit, "conversation messages"),
32
+ };
33
+ }
34
+ function exactRecord(value, allowed, label) {
35
+ if (value === null || typeof value !== "object" || Array.isArray(value))
36
+ throw invalid(label);
37
+ const record = value;
38
+ if (Object.keys(record).some((key) => !allowed.includes(key)))
39
+ throw invalid(label);
40
+ return record;
41
+ }
42
+ function optionalBefore(value, label) {
43
+ if (value === undefined)
44
+ return {};
45
+ if (typeof value !== "string" || value.trim() === "")
46
+ throw invalid(label);
47
+ return { before: value };
48
+ }
49
+ function optionalLimit(value, label) {
50
+ if (value === undefined)
51
+ return {};
52
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > 100)
53
+ throw invalid(label);
54
+ return { limit: value };
55
+ }
56
+ function invalid(label) {
57
+ return new TypeError(`Invalid ${label} query parameters`);
58
+ }
59
+ //# sourceMappingURL=conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/queries/conversations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { NotificationListParams, NotificationRepository } from "@econ-v1/ports";
2
+ import type { LiveQueryDefinition } from "../models/live-query-definition.js";
3
+ export declare function createNotificationsQuery(repository: Pick<NotificationRepository, "listNotifications">): LiveQueryDefinition<NotificationListParams, Awaited<ReturnType<NotificationRepository["listNotifications"]>>[number]>;
4
+ export declare function parseNotificationListParams(value: unknown): NotificationListParams;
5
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/queries/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,IAAI,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,GAC5D,mBAAmB,CAAC,sBAAsB,EAAE,OAAO,CAAC,UAAU,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAOvH;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAUlF"}
@@ -0,0 +1,27 @@
1
+ export function createNotificationsQuery(repository) {
2
+ return {
3
+ invalidateOn: ["domain.entity-changed", "sync.delta-applied"],
4
+ key: (row) => row.id,
5
+ name: "notifications.list.v1",
6
+ run: async (params) => await repository.listNotifications(parseNotificationListParams(params)),
7
+ };
8
+ }
9
+ export function parseNotificationListParams(value) {
10
+ if (value === null || typeof value !== "object" || Array.isArray(value))
11
+ throw invalid();
12
+ const record = value;
13
+ if (Object.keys(record).some((key) => !["limit", "unreadOnly"].includes(key)))
14
+ throw invalid();
15
+ if (record.limit !== undefined && (typeof record.limit !== "number" || !Number.isInteger(record.limit) || record.limit < 1 || record.limit > 100))
16
+ throw invalid();
17
+ if (record.unreadOnly !== undefined && typeof record.unreadOnly !== "boolean")
18
+ throw invalid();
19
+ return {
20
+ ...(record.limit === undefined ? {} : { limit: record.limit }),
21
+ ...(record.unreadOnly === undefined ? {} : { unreadOnly: record.unreadOnly }),
22
+ };
23
+ }
24
+ function invalid() {
25
+ return new TypeError("Invalid notifications query parameters");
26
+ }
27
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/queries/notifications.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB,CACtC,UAA6D;IAE7D,OAAO;QACL,YAAY,EAAE,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;QAC7D,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE;QACpB,IAAI,EAAE,uBAAuB;QAC7B,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;KAC/F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IACzF,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IAC/F,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IACnK,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,OAAO,EAAE,CAAC;IAC/F,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;KAC9E,CAAC;AACJ,CAAC;AAED,SAAS,OAAO;IACd,OAAO,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { JsonValue } from "../models/json.js";
2
+ import type { RevisionEntity } from "../models/sync.js";
3
+ import type { LiveQueryDefinition } from "../models/live-query-definition.js";
4
+ export interface RevisionedListRepository<TValue extends JsonValue = JsonValue> {
5
+ list(): Promise<readonly RevisionEntity<TValue>[]>;
6
+ read(id: string): Promise<RevisionEntity<TValue> | undefined>;
7
+ }
8
+ export declare function createAgentListQuery<TValue extends JsonValue>(repository: Pick<RevisionedListRepository<TValue>, "list">): LiveQueryDefinition<unknown, RevisionEntity<TValue>>;
9
+ export declare function createAgentDetailQuery<TValue extends JsonValue>(repository: Pick<RevisionedListRepository<TValue>, "read">): LiveQueryDefinition<unknown, RevisionEntity<TValue>>;
10
+ export declare function createSettingsRevisionedListQuery<TValue extends JsonValue>(repository: Pick<RevisionedListRepository<TValue>, "list">): LiveQueryDefinition<unknown, RevisionEntity<TValue>>;
11
+ export declare function createSettingDetailQuery<TValue extends JsonValue>(repository: Pick<RevisionedListRepository<TValue>, "read">): LiveQueryDefinition<unknown, RevisionEntity<TValue>>;
12
+ export declare function createGraphListQuery<TValue extends JsonValue>(repository: Pick<RevisionedListRepository<TValue>, "list">): LiveQueryDefinition<unknown, RevisionEntity<TValue>>;
13
+ export declare function createGraphDetailQuery<TValue extends JsonValue>(repository: Pick<RevisionedListRepository<TValue>, "read">): LiveQueryDefinition<unknown, RevisionEntity<TValue>>;
14
+ export declare function parseRevisionDetailParams(value: unknown): {
15
+ readonly id: string;
16
+ };
17
+ //# sourceMappingURL=revisioned.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revisioned.d.ts","sourceRoot":"","sources":["../../src/queries/revisioned.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,MAAM,WAAW,wBAAwB,CAAC,MAAM,SAAS,SAAS,GAAG,SAAS;IAC5E,IAAI,IAAI,OAAO,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;CAC/D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,SAAS,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAE/K;AAED,wBAAgB,sBAAsB,CAAC,MAAM,SAAS,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAEjL;AAED,wBAAgB,iCAAiC,CAAC,MAAM,SAAS,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAE5L;AAED,wBAAgB,wBAAwB,CAAC,MAAM,SAAS,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAEnL;AAED,wBAAgB,oBAAoB,CAAC,MAAM,SAAS,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAE/K;AAED,wBAAgB,sBAAsB,CAAC,MAAM,SAAS,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAEjL;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAKjF"}
@@ -0,0 +1,58 @@
1
+ import { DomainError } from "../errors/index.js";
2
+ export function createAgentListQuery(repository) {
3
+ return createListQuery("agents.list.v1", repository);
4
+ }
5
+ export function createAgentDetailQuery(repository) {
6
+ return createDetailQuery("agents.detail.v1", repository);
7
+ }
8
+ export function createSettingsRevisionedListQuery(repository) {
9
+ return createListQuery("settings.revisioned-list.v1", repository);
10
+ }
11
+ export function createSettingDetailQuery(repository) {
12
+ return createDetailQuery("settings.revisioned-detail.v1", repository);
13
+ }
14
+ export function createGraphListQuery(repository) {
15
+ return createListQuery("graphs.list.v1", repository);
16
+ }
17
+ export function createGraphDetailQuery(repository) {
18
+ return createDetailQuery("graphs.detail.v1", repository);
19
+ }
20
+ export function parseRevisionDetailParams(value) {
21
+ if (value === null || typeof value !== "object" || Array.isArray(value))
22
+ throw invalid();
23
+ const record = value;
24
+ if (Object.keys(record).length !== 1 || typeof record.id !== "string" || record.id.trim() === "")
25
+ throw invalid();
26
+ return { id: record.id };
27
+ }
28
+ function createListQuery(name, repository) {
29
+ return {
30
+ invalidateOn: ["domain.entity-changed", "outbox.state-changed", "sync.delta-applied"],
31
+ key: (row) => row.id,
32
+ name,
33
+ run: async (params) => {
34
+ parseEmptyParams(params);
35
+ return await repository.list();
36
+ },
37
+ };
38
+ }
39
+ function createDetailQuery(name, repository) {
40
+ return {
41
+ invalidateOn: ["domain.entity-changed", "outbox.state-changed", "sync.delta-applied"],
42
+ key: (row) => row.id,
43
+ name,
44
+ run: async (params) => {
45
+ const record = await repository.read(parseRevisionDetailParams(params).id);
46
+ return record === undefined ? [] : [record];
47
+ },
48
+ };
49
+ }
50
+ function parseEmptyParams(value) {
51
+ if (value === null || typeof value !== "object" || Array.isArray(value) || Object.keys(value).length !== 0) {
52
+ throw new DomainError({ code: "invalid_request", message: "Invalid revision list query parameters" });
53
+ }
54
+ }
55
+ function invalid() {
56
+ return new DomainError({ code: "invalid_request", message: "Invalid revision detail parameters" });
57
+ }
58
+ //# sourceMappingURL=revisioned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revisioned.js","sourceRoot":"","sources":["../../src/queries/revisioned.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUjD,MAAM,UAAU,oBAAoB,CAA2B,UAA0D;IACvH,OAAO,eAAe,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAA2B,UAA0D;IACzH,OAAO,iBAAiB,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iCAAiC,CAA2B,UAA0D;IACpI,OAAO,eAAe,CAAC,6BAA6B,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAA2B,UAA0D;IAC3H,OAAO,iBAAiB,CAAC,+BAA+B,EAAE,UAAU,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAA2B,UAA0D;IACvH,OAAO,eAAe,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAA2B,UAA0D;IACzH,OAAO,iBAAiB,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IACzF,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,MAAM,OAAO,EAAE,CAAC;IAClH,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,eAAe,CACtB,IAA4B,EAC5B,UAA0D;IAE1D,OAAO;QACL,YAAY,EAAE,CAAC,uBAAuB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;QACrF,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE;QACpB,IAAI;QACJ,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACpB,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,IAA4B,EAC5B,UAA0D;IAE1D,OAAO;QACL,YAAY,EAAE,CAAC,uBAAuB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;QACrF,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE;QACpB,IAAI;QACJ,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3G,MAAM,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,SAAS,OAAO;IACd,OAAO,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;AACrG,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { LiveQueryDefinition } from "../models/live-query-definition.js";
2
+ import type { WalletBalanceView, PaymentHistoryView } from "../models/wallet.js";
3
+ import type { L402HistoryView } from "../models/l402.js";
4
+ import type { WalletMirrorService } from "../services/wallet-mirror-service.js";
5
+ export declare const WALLET_BALANCE_QUERY: "wallet.balance.v1";
6
+ export declare const PAYMENT_HISTORY_QUERY: "payments.history.v1";
7
+ export declare const L402_HISTORY_QUERY: "l402.history.v1";
8
+ export declare function createWalletBalanceQuery(service: Pick<WalletMirrorService, "readBalance">): LiveQueryDefinition<unknown, WalletBalanceView>;
9
+ export declare function createPaymentHistoryQuery(service: Pick<WalletMirrorService, "listPayments">): LiveQueryDefinition<unknown, PaymentHistoryView>;
10
+ export declare function createL402HistoryQuery(service: Pick<WalletMirrorService, "listL402Receipts">): LiveQueryDefinition<unknown, L402HistoryView>;
11
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/queries/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,eAAO,MAAM,oBAAoB,EAAG,mBAA4B,CAAC;AACjE,eAAO,MAAM,qBAAqB,EAAG,qBAA8B,CAAC;AACpE,eAAO,MAAM,kBAAkB,EAAG,iBAA0B,CAAC;AAE7D,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAU3I;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAU9I;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAU5I"}
@@ -0,0 +1,42 @@
1
+ export const WALLET_BALANCE_QUERY = "wallet.balance.v1";
2
+ export const PAYMENT_HISTORY_QUERY = "payments.history.v1";
3
+ export const L402_HISTORY_QUERY = "l402.history.v1";
4
+ export function createWalletBalanceQuery(service) {
5
+ return {
6
+ invalidateOn: ["domain.entity-changed", "outbox.state-changed", "sync.delta-applied"],
7
+ key: () => "wallet-balance",
8
+ name: WALLET_BALANCE_QUERY,
9
+ run: async (params) => {
10
+ parseEmptyParams(params);
11
+ return [await service.readBalance()];
12
+ },
13
+ };
14
+ }
15
+ export function createPaymentHistoryQuery(service) {
16
+ return {
17
+ invalidateOn: ["domain.entity-changed", "outbox.state-changed", "sync.delta-applied"],
18
+ key: () => "payment-history",
19
+ name: PAYMENT_HISTORY_QUERY,
20
+ run: async (params) => {
21
+ parseEmptyParams(params);
22
+ return [await service.listPayments()];
23
+ },
24
+ };
25
+ }
26
+ export function createL402HistoryQuery(service) {
27
+ return {
28
+ invalidateOn: ["domain.entity-changed", "outbox.state-changed", "sync.delta-applied"],
29
+ key: () => "l402-history",
30
+ name: L402_HISTORY_QUERY,
31
+ run: async (params) => {
32
+ parseEmptyParams(params);
33
+ return [await service.listL402Receipts()];
34
+ },
35
+ };
36
+ }
37
+ function parseEmptyParams(value) {
38
+ if (value === null || typeof value !== "object" || Array.isArray(value) || Object.keys(value).length !== 0) {
39
+ throw new TypeError("Wallet queries do not accept parameters");
40
+ }
41
+ }
42
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/queries/wallet.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAA4B,CAAC;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAA8B,CAAC;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAA0B,CAAC;AAE7D,MAAM,UAAU,wBAAwB,CAAC,OAAiD;IACxF,OAAO;QACL,YAAY,EAAE,CAAC,uBAAuB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;QACrF,GAAG,EAAE,GAAG,EAAE,CAAC,gBAAgB;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACpB,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAkD;IAC1F,OAAO;QACL,YAAY,EAAE,CAAC,uBAAuB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;QACrF,GAAG,EAAE,GAAG,EAAE,CAAC,iBAAiB;QAC5B,IAAI,EAAE,qBAAqB;QAC3B,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACpB,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,CAAC,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAsD;IAC3F,OAAO;QACL,YAAY,EAAE,CAAC,uBAAuB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;QACrF,GAAG,EAAE,GAAG,EAAE,CAAC,cAAc;QACzB,IAAI,EAAE,kBAAkB;QACxB,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACpB,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,CAAC,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3G,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { Conversation, ConversationListParams, ConversationLogDelta, ConversationMessage, ConversationRepository, Notification, NotificationListParams, NotificationRepository, OutboxRepository, RepositoryEvent } from "@econ-v1/ports";
2
+ export interface SendMessageInput {
3
+ readonly body: string;
4
+ readonly conversationId: string;
5
+ readonly idempotencyKey: string;
6
+ readonly messageId?: string;
7
+ readonly senderId: string;
8
+ }
9
+ export interface ConversationServiceOptions {
10
+ /** The platform adapter owns UUID/ID generation; the domain stays runtime-neutral. */
11
+ readonly id: () => string;
12
+ readonly now?: () => string;
13
+ }
14
+ export declare class ConversationService {
15
+ #private;
16
+ constructor(dependencies: {
17
+ readonly conversations: ConversationRepository;
18
+ readonly notifications: NotificationRepository;
19
+ readonly outbox: OutboxRepository;
20
+ }, options: ConversationServiceOptions);
21
+ sendMessage(input: SendMessageInput): Promise<ConversationMessage>;
22
+ applyDelta(delta: ConversationLogDelta): Promise<void>;
23
+ acknowledgeMessage(input: {
24
+ readonly acknowledgedAt?: string;
25
+ readonly messageId: string;
26
+ readonly serverMessageId?: string;
27
+ }): Promise<void>;
28
+ failMessage(input: {
29
+ readonly messageId: string;
30
+ readonly reason: string;
31
+ readonly failedAt?: string;
32
+ }): Promise<void>;
33
+ listConversations(params?: ConversationListParams): Promise<readonly Conversation[]>;
34
+ listMessages(conversationId: string, params?: {
35
+ readonly before?: string;
36
+ readonly limit?: number;
37
+ }): Promise<readonly ConversationMessage[]>;
38
+ listNotifications(params?: NotificationListParams): Promise<readonly Notification[]>;
39
+ markNotificationRead(notificationId: string, readAt?: string): Promise<void>;
40
+ }
41
+ export type ConversationRepositoryWrite = RepositoryEvent;
42
+ //# sourceMappingURL=conversation-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-service.d.ts","sourceRoot":"","sources":["../../src/services/conversation-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,EAEtB,gBAAgB,EAChB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,sFAAsF;IACtF,QAAQ,CAAC,EAAE,EAAE,MAAM,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,qBAAa,mBAAmB;;gBAQ5B,YAAY,EAAE;QACZ,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAC;QAC/C,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAC;QAC/C,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;KACnC,EACD,OAAO,EAAE,0BAA0B;IAS/B,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmClE,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAetD,kBAAkB,CAAC,KAAK,EAAE;QAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;KACnC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQX,WAAW,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAStH,iBAAiB,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAIpF,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC;IAI7I,iBAAiB,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAIpF,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAIxF;AAMD,MAAM,MAAM,2BAA2B,GAAG,eAAe,CAAC"}
@@ -0,0 +1,95 @@
1
+ export class ConversationService {
2
+ #conversations;
3
+ #id;
4
+ #notifications;
5
+ #now;
6
+ #outbox;
7
+ constructor(dependencies, options) {
8
+ this.#conversations = dependencies.conversations;
9
+ this.#id = options.id;
10
+ this.#notifications = dependencies.notifications;
11
+ this.#now = options.now ?? (() => new Date().toISOString());
12
+ this.#outbox = dependencies.outbox;
13
+ }
14
+ async sendMessage(input) {
15
+ requireText(input.body, "message body");
16
+ requireText(input.conversationId, "conversation id");
17
+ requireText(input.idempotencyKey, "message idempotency key");
18
+ requireText(input.senderId, "message sender id");
19
+ const createdAt = this.#now();
20
+ const message = {
21
+ body: input.body,
22
+ ...(input.messageId === undefined ? {} : { clientMessageId: input.messageId }),
23
+ conversationId: input.conversationId,
24
+ createdAt,
25
+ id: input.messageId ?? this.#id(),
26
+ senderId: input.senderId,
27
+ state: "pending",
28
+ };
29
+ await this.#conversations.appendPendingMessage({ message }).commit();
30
+ const outbox = {
31
+ createdAt,
32
+ domain: "conversation",
33
+ id: `conversation:${message.id}`,
34
+ idempotencyKey: input.idempotencyKey,
35
+ payload: {
36
+ body: message.body,
37
+ conversationId: message.conversationId,
38
+ messageId: message.id,
39
+ operation: "conversation.send-message",
40
+ senderId: message.senderId,
41
+ },
42
+ state: "pending",
43
+ updatedAt: createdAt,
44
+ };
45
+ await this.#outbox.create(outbox);
46
+ return message;
47
+ }
48
+ async applyDelta(delta) {
49
+ switch (delta.kind) {
50
+ case "notification.read":
51
+ case "notification.upsert":
52
+ await this.#notifications.applyDelta(delta).commit();
53
+ return;
54
+ case "conversation.upsert":
55
+ case "message.ack":
56
+ case "message.append":
57
+ case "message.fail":
58
+ await this.#conversations.applyDelta(delta).commit();
59
+ return;
60
+ }
61
+ }
62
+ async acknowledgeMessage(input) {
63
+ await this.#conversations.acknowledgeMessage({
64
+ acknowledgedAt: input.acknowledgedAt ?? this.#now(),
65
+ messageId: input.messageId,
66
+ ...(input.serverMessageId === undefined ? {} : { serverMessageId: input.serverMessageId }),
67
+ });
68
+ }
69
+ async failMessage(input) {
70
+ requireText(input.reason, "message failure reason");
71
+ await this.#conversations.failMessage({
72
+ failedAt: input.failedAt ?? this.#now(),
73
+ messageId: input.messageId,
74
+ reason: input.reason,
75
+ });
76
+ }
77
+ async listConversations(params) {
78
+ return await this.#conversations.listConversations(params);
79
+ }
80
+ async listMessages(conversationId, params) {
81
+ return await this.#conversations.listMessages(conversationId, params);
82
+ }
83
+ async listNotifications(params) {
84
+ return await this.#notifications.listNotifications(params);
85
+ }
86
+ async markNotificationRead(notificationId, readAt = this.#now()) {
87
+ requireText(notificationId, "notification id");
88
+ await this.#notifications.markRead({ notificationId, readAt }).commit();
89
+ }
90
+ }
91
+ function requireText(value, label) {
92
+ if (value.trim() === "")
93
+ throw new TypeError(`${label} must be a non-empty string`);
94
+ }
95
+ //# sourceMappingURL=conversation-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-service.js","sourceRoot":"","sources":["../../src/services/conversation-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ConversationLogDelta } from "../models/conversation.js";
2
+ import type { SyncDeltaContext } from "../models/sync.js";
3
+ import { LogSync } from "./sync/log-sync.js";
4
+ import type { ConversationService } from "./conversation-service.js";
5
+ export declare function createConversationLogSync(service: Pick<ConversationService, "applyDelta">): LogSync<ConversationLogDelta>;
6
+ export type ConversationSyncContext = SyncDeltaContext;
7
+ //# sourceMappingURL=conversation-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-sync.d.ts","sourceRoot":"","sources":["../../src/services/conversation-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAMzH;AAED,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { LogSync } from "./sync/log-sync.js";
2
+ export function createConversationLogSync(service) {
3
+ return new LogSync({
4
+ apply: async (payload) => {
5
+ await service.applyDelta(payload);
6
+ },
7
+ });
8
+ }
9
+ //# sourceMappingURL=conversation-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-sync.js","sourceRoot":"","sources":["../../src/services/conversation-sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,MAAM,UAAU,yBAAyB,CAAC,OAAgD;IACxF,OAAO,IAAI,OAAO,CAAC;QACjB,KAAK,EAAE,KAAK,EAAE,OAA6B,EAAE,EAAE;YAC7C,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { PeerTransportPort } from "@econ-v1/ports";
2
+ import { PeerDirectoryService, type PeerAdvertisement } from "./peer-directory-service.js";
3
+ declare const GOSSIP_VERSION = 1;
4
+ export interface GossipAdvertisement extends PeerAdvertisement {
5
+ readonly version: typeof GOSSIP_VERSION;
6
+ }
7
+ export interface GossipServiceOptions {
8
+ readonly directory: PeerDirectoryService;
9
+ readonly transport: PeerTransportPort;
10
+ }
11
+ export declare class GossipService {
12
+ #private;
13
+ constructor(options: GossipServiceOptions);
14
+ publishAdvertisement(topic: string, advertisement: PeerAdvertisement): Promise<void>;
15
+ advertisements(topic: string, signal?: AbortSignal): AsyncIterable<GossipAdvertisement>;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=gossip-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gossip-service.d.ts","sourceRoot":"","sources":["../../src/services/gossip-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAEL,oBAAoB,EACpB,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAErC,QAAA,MAAM,cAAc,IAAI,CAAC;AAEzB,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,QAAQ,CAAC,OAAO,EAAE,OAAO,cAAc,CAAC;CACzC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;CACvC;AAED,qBAAa,aAAa;;gBAIZ,OAAO,EAAE,oBAAoB;IAKnC,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnF,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,mBAAmB,CAAC;CAW/F"}
@@ -0,0 +1,53 @@
1
+ import { normalizeAdvertisement, PeerDirectoryService, } from "./peer-directory-service.js";
2
+ const GOSSIP_VERSION = 1;
3
+ export class GossipService {
4
+ #directory;
5
+ #transport;
6
+ constructor(options) {
7
+ this.#directory = options.directory;
8
+ this.#transport = options.transport;
9
+ }
10
+ async publishAdvertisement(topic, advertisement) {
11
+ const normalized = normalizeAdvertisement(advertisement);
12
+ const value = { ...normalized, version: GOSSIP_VERSION };
13
+ await this.#transport.publish(topic, new TextEncoder().encode(JSON.stringify(value)));
14
+ }
15
+ async *advertisements(topic, signal) {
16
+ const seen = new Set();
17
+ for await (const payload of this.#transport.subscribe(topic, signal)) {
18
+ const parsed = parseAdvertisement(payload);
19
+ if (parsed === undefined)
20
+ continue;
21
+ const key = `${parsed.irohNodeId}:${parsed.observedAt}`;
22
+ if (seen.has(key) || !this.#directory.upsert(parsed))
23
+ continue;
24
+ seen.add(key);
25
+ yield parsed;
26
+ }
27
+ }
28
+ }
29
+ function parseAdvertisement(payload) {
30
+ try {
31
+ const value = JSON.parse(new TextDecoder().decode(payload));
32
+ if (!isRecord(value) || value.version !== GOSSIP_VERSION ||
33
+ !Array.isArray(value.directAddresses) ||
34
+ !value.directAddresses.every((address) => typeof address === "string") ||
35
+ typeof value.did !== "string" || typeof value.irohNodeId !== "string" || typeof value.observedAt !== "string") {
36
+ return undefined;
37
+ }
38
+ const normalized = normalizeAdvertisement({
39
+ directAddresses: value.directAddresses,
40
+ did: value.did,
41
+ irohNodeId: value.irohNodeId,
42
+ observedAt: value.observedAt,
43
+ });
44
+ return { ...normalized, version: GOSSIP_VERSION };
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ function isRecord(value) {
51
+ return typeof value === "object" && value !== null && !Array.isArray(value);
52
+ }
53
+ //# sourceMappingURL=gossip-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gossip-service.js","sourceRoot":"","sources":["../../src/services/gossip-service.ts"],"names":[],"mappings":"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"}