@agenticprimitives/fabric 0.0.0-alpha.1 → 0.0.0-alpha.10

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 (147) hide show
  1. package/CLAUDE.md +22 -2
  2. package/README.md +16 -16
  3. package/dist/case-emissions.d.ts +95 -0
  4. package/dist/case-emissions.d.ts.map +1 -0
  5. package/dist/case-emissions.js +208 -0
  6. package/dist/case-emissions.js.map +1 -0
  7. package/dist/case-machine.d.ts +28 -2
  8. package/dist/case-machine.d.ts.map +1 -1
  9. package/dist/case-machine.js +34 -7
  10. package/dist/case-machine.js.map +1 -1
  11. package/dist/cloudflare/index.d.ts +1 -0
  12. package/dist/cloudflare/index.d.ts.map +1 -1
  13. package/dist/cloudflare/index.js +4 -0
  14. package/dist/cloudflare/index.js.map +1 -1
  15. package/dist/cloudflare/interaction-store.d.ts +55 -0
  16. package/dist/cloudflare/interaction-store.d.ts.map +1 -0
  17. package/dist/cloudflare/interaction-store.js +230 -0
  18. package/dist/cloudflare/interaction-store.js.map +1 -0
  19. package/dist/cloudflare/principal-gateway-do.d.ts +118 -2
  20. package/dist/cloudflare/principal-gateway-do.d.ts.map +1 -1
  21. package/dist/cloudflare/principal-gateway-do.js +182 -7
  22. package/dist/cloudflare/principal-gateway-do.js.map +1 -1
  23. package/dist/communicative-act.d.ts +24 -1
  24. package/dist/communicative-act.d.ts.map +1 -1
  25. package/dist/communicative-act.js +28 -0
  26. package/dist/communicative-act.js.map +1 -1
  27. package/dist/delivery-envelope.d.ts.map +1 -1
  28. package/dist/delivery-envelope.js +0 -1
  29. package/dist/delivery-envelope.js.map +1 -1
  30. package/dist/enum-retirement.d.ts +43 -0
  31. package/dist/enum-retirement.d.ts.map +1 -0
  32. package/dist/enum-retirement.js +93 -0
  33. package/dist/enum-retirement.js.map +1 -0
  34. package/dist/exchange-record.d.ts +35 -4
  35. package/dist/exchange-record.d.ts.map +1 -1
  36. package/dist/exchange-record.js.map +1 -1
  37. package/dist/exchange-reducer.d.ts +32 -4
  38. package/dist/exchange-reducer.d.ts.map +1 -1
  39. package/dist/exchange-reducer.js +75 -1
  40. package/dist/exchange-reducer.js.map +1 -1
  41. package/dist/exchange-state.d.ts +30 -8
  42. package/dist/exchange-state.d.ts.map +1 -1
  43. package/dist/exchange-state.js +12 -10
  44. package/dist/exchange-state.js.map +1 -1
  45. package/dist/inbox-doc.d.ts +2 -2
  46. package/dist/inbox-doc.d.ts.map +1 -1
  47. package/dist/inbox-doc.js.map +1 -1
  48. package/dist/inbox-projection.d.ts +2 -2
  49. package/dist/inbox-projection.d.ts.map +1 -1
  50. package/dist/inbox-projection.js.map +1 -1
  51. package/dist/inbox-revision.d.ts +42 -0
  52. package/dist/inbox-revision.d.ts.map +1 -0
  53. package/dist/inbox-revision.js +57 -0
  54. package/dist/inbox-revision.js.map +1 -0
  55. package/dist/index.d.ts +23 -3
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +36 -2
  58. package/dist/index.js.map +1 -1
  59. package/dist/interaction-machines.d.ts +136 -0
  60. package/dist/interaction-machines.d.ts.map +1 -0
  61. package/dist/interaction-machines.js +174 -0
  62. package/dist/interaction-machines.js.map +1 -0
  63. package/dist/interaction-profile.d.ts +126 -0
  64. package/dist/interaction-profile.d.ts.map +1 -0
  65. package/dist/interaction-profile.js +192 -0
  66. package/dist/interaction-profile.js.map +1 -0
  67. package/dist/interaction-record.d.ts +168 -0
  68. package/dist/interaction-record.d.ts.map +1 -0
  69. package/dist/interaction-record.js +108 -0
  70. package/dist/interaction-record.js.map +1 -0
  71. package/dist/interactions/machine.d.ts +2 -2
  72. package/dist/interactions/machine.d.ts.map +1 -1
  73. package/dist/interactions/machine.js +2 -2
  74. package/dist/interactions/machine.js.map +1 -1
  75. package/dist/interactions/store.d.ts +9 -0
  76. package/dist/interactions/store.d.ts.map +1 -1
  77. package/dist/interactions/store.js +57 -2
  78. package/dist/interactions/store.js.map +1 -1
  79. package/dist/messaging/board.d.ts +86 -6
  80. package/dist/messaging/board.d.ts.map +1 -1
  81. package/dist/messaging/board.js +100 -9
  82. package/dist/messaging/board.js.map +1 -1
  83. package/dist/messaging/consult-routing.d.ts +289 -0
  84. package/dist/messaging/consult-routing.d.ts.map +1 -0
  85. package/dist/messaging/consult-routing.js +455 -0
  86. package/dist/messaging/consult-routing.js.map +1 -0
  87. package/dist/messaging/consult.d.ts +158 -0
  88. package/dist/messaging/consult.d.ts.map +1 -0
  89. package/dist/messaging/consult.js +141 -0
  90. package/dist/messaging/consult.js.map +1 -0
  91. package/dist/messaging/conversation-interaction.d.ts +66 -0
  92. package/dist/messaging/conversation-interaction.d.ts.map +1 -0
  93. package/dist/messaging/conversation-interaction.js +139 -0
  94. package/dist/messaging/conversation-interaction.js.map +1 -0
  95. package/dist/messaging/delivery.d.ts +2 -2
  96. package/dist/messaging/delivery.d.ts.map +1 -1
  97. package/dist/messaging/delivery.js +8 -1
  98. package/dist/messaging/delivery.js.map +1 -1
  99. package/dist/messaging/directory.d.ts +16 -0
  100. package/dist/messaging/directory.d.ts.map +1 -1
  101. package/dist/messaging/directory.js.map +1 -1
  102. package/dist/messaging/envelope.d.ts +7 -3
  103. package/dist/messaging/envelope.d.ts.map +1 -1
  104. package/dist/messaging/envelope.js +18 -1
  105. package/dist/messaging/envelope.js.map +1 -1
  106. package/dist/messaging/hash.d.ts +8 -2
  107. package/dist/messaging/hash.d.ts.map +1 -1
  108. package/dist/messaging/hash.js +6 -0
  109. package/dist/messaging/hash.js.map +1 -1
  110. package/dist/messaging/inbox-assistant.d.ts +80 -0
  111. package/dist/messaging/inbox-assistant.d.ts.map +1 -0
  112. package/dist/messaging/inbox-assistant.js +125 -0
  113. package/dist/messaging/inbox-assistant.js.map +1 -0
  114. package/dist/messaging/index.d.ts +9 -3
  115. package/dist/messaging/index.d.ts.map +1 -1
  116. package/dist/messaging/index.js +17 -2
  117. package/dist/messaging/index.js.map +1 -1
  118. package/dist/messaging/projector.d.ts +3 -3
  119. package/dist/messaging/projector.d.ts.map +1 -1
  120. package/dist/messaging/projector.js.map +1 -1
  121. package/dist/messaging/receipts.d.ts +3 -3
  122. package/dist/messaging/receipts.d.ts.map +1 -1
  123. package/dist/messaging/receipts.js.map +1 -1
  124. package/dist/messaging/rules.d.ts +10 -3
  125. package/dist/messaging/rules.d.ts.map +1 -1
  126. package/dist/messaging/rules.js +8 -1
  127. package/dist/messaging/rules.js.map +1 -1
  128. package/dist/messaging/store.d.ts +4 -4
  129. package/dist/messaging/store.d.ts.map +1 -1
  130. package/dist/messaging/store.js +5 -3
  131. package/dist/messaging/store.js.map +1 -1
  132. package/dist/messaging/types.d.ts +52 -0
  133. package/dist/messaging/types.d.ts.map +1 -1
  134. package/dist/messaging/types.js +18 -1
  135. package/dist/messaging/types.js.map +1 -1
  136. package/dist/messaging/vault-store.d.ts +35 -2
  137. package/dist/messaging/vault-store.d.ts.map +1 -1
  138. package/dist/messaging/vault-store.js +53 -5
  139. package/dist/messaging/vault-store.js.map +1 -1
  140. package/dist/protocol-binding.d.ts +71 -0
  141. package/dist/protocol-binding.d.ts.map +1 -0
  142. package/dist/protocol-binding.js +0 -0
  143. package/dist/protocol-binding.js.map +1 -0
  144. package/dist/record-catalog.d.ts.map +1 -1
  145. package/dist/record-catalog.js +19 -0
  146. package/dist/record-catalog.js.map +1 -1
  147. package/package.json +7 -7
@@ -1,10 +1,44 @@
1
1
  // In-memory InteractionStore: cases + transition log with idempotent replay
2
2
  // and deterministic expiry sweeps (spec 309 §6.1, §8.10).
3
3
  import { applyInteractionTransition, isTerminalState } from './machine.js';
4
+ import { applyCaseEmissions, caseTransitionEmissions } from '../case-emissions.js';
4
5
  export function createInMemoryInteractionStore() {
5
6
  const cases = new Map();
6
7
  const events = new Map();
7
8
  const appliedKeys = new Map();
9
+ const decisions = new Map();
10
+ const commitments = new Map();
11
+ /**
12
+ * spec 340 W10 — record what the transition emitted into the other two machines.
13
+ *
14
+ * Called only after the case machine ACCEPTED, and derived from the PRE-transition case: the seed
15
+ * reads identity and party fields, none of which a transition changes.
16
+ *
17
+ * A rejected emission does not roll back the case. That is deliberate and it is the honest option:
18
+ * the case transition is already a fact, and the alternatives are worse — silently dropping it would
19
+ * make an unrecorded determination indistinguishable from a recorded one, and unwinding an accepted
20
+ * transition would let the decision machine veto a move the case machine's own rules permitted.
21
+ * `void` on a case that never had a commitment is the ordinary, expected case of this.
22
+ */
23
+ function emit(before, event) {
24
+ const emissions = caseTransitionEmissions(before, {
25
+ version: 'ap.case.event.v1',
26
+ caseId: event.interactionId,
27
+ transition: event.transition,
28
+ actor: event.actor,
29
+ at: event.at,
30
+ });
31
+ if (!emissions.decision && !emissions.commitment)
32
+ return;
33
+ const out = applyCaseEmissions(emissions, {
34
+ decision: decisions.get(event.interactionId) ?? null,
35
+ commitment: commitments.get(event.interactionId) ?? null,
36
+ }, { actor: event.actor, at: event.at });
37
+ if (out.decision?.applied)
38
+ decisions.set(event.interactionId, out.decision.record);
39
+ if (out.commitment?.applied)
40
+ commitments.set(event.interactionId, out.commitment.record);
41
+ }
8
42
  return {
9
43
  putCase(c) {
10
44
  if (c.state !== 'draft') {
@@ -27,15 +61,26 @@ export function createInMemoryInteractionStore() {
27
61
  if (event.idempotencyKey !== undefined && keys.has(event.idempotencyKey)) {
28
62
  return { ok: true, case: current };
29
63
  }
30
- const result = applyInteractionTransition(current, event);
64
+ // W10b-3: the case machine cannot see the decision machine, so the store — which holds both —
65
+ // supplies it. `issue-credential` refuses without a granted determination.
66
+ const result = applyInteractionTransition(current, event, {
67
+ decisionState: decisions.get(event.interactionId)?.state ?? null,
68
+ });
31
69
  if (!result.ok)
32
70
  return result;
33
71
  cases.set(event.interactionId, result.case);
34
72
  events.get(event.interactionId).push(event);
35
73
  if (event.idempotencyKey !== undefined)
36
74
  keys.add(event.idempotencyKey);
75
+ emit(current, event);
37
76
  return result;
38
77
  },
78
+ getDecision(id) {
79
+ return decisions.get(id) ?? null;
80
+ },
81
+ getCommitment(id) {
82
+ return commitments.get(id) ?? null;
83
+ },
39
84
  listEvents(id) {
40
85
  return [...(events.get(id) ?? [])];
41
86
  },
@@ -55,10 +100,20 @@ export function createInMemoryInteractionStore() {
55
100
  transition: 'expire',
56
101
  actor: c.responder, // role 'any' — deterministic sweep, not a user action
57
102
  at: nowIso,
58
- });
103
+ }, { decisionState: decisions.get(c.id)?.state ?? null });
59
104
  if (result.ok) {
60
105
  cases.set(c.id, result.case);
61
106
  expired.push(result.case);
107
+ // The sweep records the determination too. `expire` is the one decision transition the
108
+ // machine lets any actor make, and the emission attributes it to the creditor rather than
109
+ // to `c.responder` — the sweep's stand-in actor, who decided nothing.
110
+ emit(c, {
111
+ version: 'ap.interaction.event.v1',
112
+ interactionId: c.id,
113
+ transition: 'expire',
114
+ actor: c.responder,
115
+ at: nowIso,
116
+ });
62
117
  }
63
118
  }
64
119
  return expired;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/interactions/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/interactions/store.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,95 @@
1
1
  import type { CanonicalAgentId } from '@agenticprimitives/types';
2
- import type { ConversationDescriptorV1, MessageEnvelopeV1 } from './types.js';
2
+ import type { AnyMessageEnvelope, ContextRefV1, ConversationDescriptorV1 } from './types.js';
3
+ import { type ConsultProvenanceV1 } from './consult.js';
3
4
  export interface ChannelMessageEntryV1 {
4
- envelope: MessageEnvelopeV1;
5
+ envelope: AnyMessageEnvelope;
5
6
  authorName: string;
7
+ /** spec 324 §9 acting-agent provenance (spec 327): WHO performed the authoring move when it was
8
+ * not a human session — for org-assistant posts, the org SA (CAIP-10). Absent ⇒ human-session
9
+ * post. Never erased; the UI renders an "agent" badge from it. */
10
+ actor?: CanonicalAgentId;
11
+ /** spec 329 §6 — PROV attribution on a turn-2 synthesis post (consulted agents + the contributing
12
+ * ConsultationIntent record ids). Absent on every non-synthesis post. */
13
+ prov?: ConsultProvenanceV1;
14
+ }
15
+ /** Steward-controlled org-assistant enablement for one topic (spec 327; 318 §8.1 slice — the org's
16
+ * OWN agent, not a participant bot). Handle + display name are captured AT ENABLE TIME so trigger
17
+ * matching and attribution need no per-post chain read (ADR-0012); re-enabling refreshes both
18
+ * after a name rotation. */
19
+ export interface TopicAssistantV1 {
20
+ /** 'mention' — reply only when a post @-mentions the org. 'all' — reply to every member post. */
21
+ trigger: 'mention' | 'all';
22
+ /** Lowercased mention label, e.g. 'grace' for grace.impact — matched as @grace / @grace.impact.
23
+ * Empty ONLY for trigger:'all' (a nameless org cannot be mentioned). */
24
+ mentionHandle: string;
25
+ /** Author display name stamped on assistant posts (org primary name / profile display name). */
26
+ displayName: string;
27
+ enabledBy: string;
28
+ enabledAt: string;
29
+ }
30
+ /** Steward-controlled member ROUTING enablement for one topic (spec 329 §7): the org's assistant
31
+ * may consult opted-in member agents in this topic. Requires the assistant ON (routing is a mode
32
+ * of the 327 assistant, never a second bot); the org-level consult wire (§3.1) is custodied
33
+ * separately at the org's execution point — flag without wire ⇒ routing stays inert. */
34
+ export interface TopicRoutingV1 {
35
+ /** Fan-out K per routed question (1..5, default 3 — spec 329 §4). */
36
+ maxFanout: number;
37
+ enabledBy: string;
38
+ enabledAt: string;
6
39
  }
7
40
  export interface ChannelV1 {
8
41
  descriptor: ConversationDescriptorV1;
9
42
  title: string;
10
43
  createdBy: string;
11
44
  messages: ChannelMessageEntryV1[];
45
+ /** apmsg:participationPolicy — `open` (every org MEMBER automatically participates; derived, never a
46
+ * stored list) or `restricted` (invite-only; `participants` is the projection of accepted
47
+ * DiscussionParticipation situations). Absent ⇒ resolved from legacy `visibility` (public→open,
48
+ * private→restricted); absent both ⇒ open. */
49
+ participationPolicy?: 'open' | 'restricted';
12
50
  visibility?: 'public' | 'private';
13
- /** For a private topic: the member SAs (lowercased 0x) allowed to see/post. The creator is always included. */
51
+ /** For a restricted topic: the PARTICIPANT SAs (lowercased 0x) allowed to see/post — a projection of
52
+ * accepted participations (the creator is always included). Legacy field name `members` kept on the
53
+ * wire; these are discussion PARTICIPANTS, not the org member roster. */
14
54
  members?: string[];
55
+ /** Present ⇔ the org's own agent participates in this topic (spec 327). */
56
+ assistant?: TopicAssistantV1;
57
+ /** Present ⇔ member routing is steward-enabled on this topic (spec 329; requires `assistant`). */
58
+ routing?: TopicRoutingV1;
15
59
  }
16
- /** Can `viewerSa` (0x) see this topic? Public ⇒ always; private ⇒ only if listed in `members`. `isSteward`
17
- * overrides (a steward manages every topic). One mechanism — used by the store list + the UI. */
60
+ /** Resolve a topic's participation policy, mapping the legacy `visibility` wire field
61
+ * (public→open, private→restricted). Absent both ⇒ open (the default + all legacy topics). */
62
+ export declare function channelParticipationPolicy(channel: Pick<ChannelV1, 'participationPolicy' | 'visibility'>): 'open' | 'restricted';
63
+ /** Can `viewerSa` (0x) see this topic? OPEN ⇒ always (every org member; the caller already gated org
64
+ * membership). RESTRICTED ⇒ only listed participants. `isSteward` overrides (a steward/custodian is a
65
+ * facilitator of every topic). One mechanism — used by the store list + the UI. */
18
66
  export declare function canSeeChannel(channel: ChannelV1, viewerSa: string, isSteward?: boolean): boolean;
19
67
  /** Bounded per-channel history in the board doc (projection only — bodies live in the vault). */
20
68
  export declare const BOARD_HISTORY_LIMIT = 200;
69
+ /** Should a just-committed post trigger the topic's org assistant (spec 327 §3)? Pure predicate —
70
+ * the caller supplies the posted body text (it never round-trips through the stored entry, whose
71
+ * body is hash-bound in the vault). False when the assistant is off, when the post is itself
72
+ * agent-authored (`actor` set), or when the author IS the org — the community contextRef, NOT
73
+ * `descriptor.owner` (that is the topic CREATOR) — so the assistant NEVER triggers itself, even
74
+ * in `trigger:'all'` topics. */
75
+ export declare function assistantTrigger(channel: Pick<ChannelV1, 'assistant' | 'descriptor'>, post: {
76
+ from: CanonicalAgentId;
77
+ actor?: CanonicalAgentId;
78
+ bodyText: string;
79
+ }): boolean;
80
+ /** Enable/refresh (`assistant` set) or disable (`assistant` undefined) the org assistant on a topic
81
+ * (mutates the channel on success). Steward gating + audit are the caller's, as with every board
82
+ * mutation. `trigger:'mention'` requires a mention handle — a nameless org cannot be mentioned. */
83
+ export declare function setTopicAssistant(board: ChannelV1[], channelId: string, assistant: TopicAssistantV1 | undefined): BoardResult<{
84
+ channel: ChannelV1;
85
+ }>;
86
+ /** Enable/refresh (`routing` set) or disable (`routing` undefined) member routing on a topic
87
+ * (spec 329 §7). Enabling REQUIRES the 327 assistant to be on (routing is a mode of the
88
+ * assistant's turn); fan-out is clamped fail-closed to the approved 1..5 window. Disabling the
89
+ * ASSISTANT also disables routing transitively (setTopicAssistant clears it below). */
90
+ export declare function setTopicRouting(board: ChannelV1[], channelId: string, routing: TopicRoutingV1 | undefined): BoardResult<{
91
+ channel: ChannelV1;
92
+ }>;
21
93
  export type BoardResult<T> = {
22
94
  ok: true;
23
95
  } & T | {
@@ -33,6 +105,7 @@ export declare function createBoardChannel(board: ChannelV1[], opts: {
33
105
  title: string;
34
106
  createdBy: string;
35
107
  now?: string;
108
+ participationPolicy?: 'open' | 'restricted';
36
109
  visibility?: 'public' | 'private';
37
110
  members?: string[];
38
111
  creatorSa?: string;
@@ -48,7 +121,14 @@ export declare function appendBoardPost(board: ChannelV1[], opts: {
48
121
  authorName: string;
49
122
  bodyText: string;
50
123
  now?: string;
124
+ actor?: CanonicalAgentId;
125
+ /** spec 329 §6 — EXTRA context refs beyond the channel's own (the `routed-consultation` chip on
126
+ * the turn-1 status + turn-2 synthesis). Appended after the descriptor refs, deduped by
127
+ * kind+id; the envelope validator's MAX_CONTEXT_REFS bound still applies (fail-closed). */
128
+ contextRefs?: ContextRefV1[];
129
+ /** spec 329 §6 — PROV attribution stored on the entry (synthesis posts only). */
130
+ prov?: ConsultProvenanceV1;
51
131
  }): Promise<BoardResult<{
52
- envelope: MessageEnvelopeV1;
132
+ envelope: AnyMessageEnvelope;
53
133
  }>>;
54
134
  //# sourceMappingURL=board.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../src/messaging/board.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAKjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,wBAAwB,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAGlC,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAClC,+GAA+G;IAC/G,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;kGACkG;AAClG,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAK9F;AAED,iGAAiG;AACjG,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E;;6FAE6F;AAC7F,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAAE,EAClB,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9K,WAAW,CAAC;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC,CA+BrC;AAED;;uFAEuF;AACvF,wBAAsB,eAAe,CACnC,KAAK,EAAE,SAAS,EAAE,EAClB,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtG,OAAO,CAAC,WAAW,CAAC;IAAE,QAAQ,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC,CA8BvD"}
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../src/messaging/board.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,19 @@ import { generateConversationId, generateMessageId, validateMessageEnvelope } fr
2
2
  import { sha256Hex32 } from './hash.js';
3
3
  import { validateConversationDescriptor } from './conversation.js';
4
4
  import { topicBodyResource } from './vault-store.js';
5
- /** Can `viewerSa` (0x) see this topic? Public ⇒ always; private ⇒ only if listed in `members`. `isSteward`
6
- * overrides (a steward manages every topic). One mechanism — used by the store list + the UI. */
5
+ import { ROUTING_FANOUT_DEFAULT, ROUTING_FANOUT_MAX, ROUTING_FANOUT_MIN } from './consult.js';
6
+ /** Resolve a topic's participation policy, mapping the legacy `visibility` wire field
7
+ * (public→open, private→restricted). Absent both ⇒ open (the default + all legacy topics). */
8
+ export function channelParticipationPolicy(channel) {
9
+ if (channel.participationPolicy)
10
+ return channel.participationPolicy;
11
+ return channel.visibility === 'private' ? 'restricted' : 'open';
12
+ }
13
+ /** Can `viewerSa` (0x) see this topic? OPEN ⇒ always (every org member; the caller already gated org
14
+ * membership). RESTRICTED ⇒ only listed participants. `isSteward` overrides (a steward/custodian is a
15
+ * facilitator of every topic). One mechanism — used by the store list + the UI. */
7
16
  export function canSeeChannel(channel, viewerSa, isSteward = false) {
8
- if (channel.visibility !== 'private')
17
+ if (channelParticipationPolicy(channel) === 'open')
9
18
  return true;
10
19
  if (isSteward)
11
20
  return true;
@@ -14,6 +23,82 @@ export function canSeeChannel(channel, viewerSa, isSteward = false) {
14
23
  }
15
24
  /** Bounded per-channel history in the board doc (projection only — bodies live in the vault). */
16
25
  export const BOARD_HISTORY_LIMIT = 200;
26
+ /** Should a just-committed post trigger the topic's org assistant (spec 327 §3)? Pure predicate —
27
+ * the caller supplies the posted body text (it never round-trips through the stored entry, whose
28
+ * body is hash-bound in the vault). False when the assistant is off, when the post is itself
29
+ * agent-authored (`actor` set), or when the author IS the org — the community contextRef, NOT
30
+ * `descriptor.owner` (that is the topic CREATOR) — so the assistant NEVER triggers itself, even
31
+ * in `trigger:'all'` topics. */
32
+ export function assistantTrigger(channel, post) {
33
+ const assistant = channel.assistant;
34
+ if (!assistant)
35
+ return false;
36
+ if (post.actor)
37
+ return false;
38
+ const org = channel.descriptor.contextRefs?.find((r) => r.kind === 'community')?.id?.toLowerCase();
39
+ if (org && String(post.from).toLowerCase().endsWith(org))
40
+ return false;
41
+ if (assistant.trigger === 'all')
42
+ return true;
43
+ const handle = assistant.mentionHandle.trim().toLowerCase();
44
+ if (!handle)
45
+ return false;
46
+ // @handle, optionally with its dotted parent name (@handle.<parent>…) — TLD-agnostic (the parent
47
+ // registry is app config, never package vocabulary — ADR-0021). Case-insensitive, word-bounded
48
+ // (name labels are [a-z0-9-]); a preceding name char (e.g. an email local part) is not a mention.
49
+ const esc = handle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
50
+ const mention = new RegExp(`(?:^|[^a-z0-9-])@${esc}(?:\\.[a-z0-9-]+)*(?![a-z0-9-])`, 'i');
51
+ if (mention.test(post.bodyText))
52
+ return true;
53
+ // `@ask` — the universal, org-agnostic assistant alias: members shouldn't have to remember the
54
+ // org's handle to talk to its assistant. Same word-bounding rules; only meaningful where an
55
+ // assistant is enabled, so it can never mis-route across orgs.
56
+ return ASK_ALIAS.test(post.bodyText);
57
+ }
58
+ const ASK_ALIAS = /(?:^|[^a-z0-9-])@ask(?![a-z0-9-])/i;
59
+ /** Enable/refresh (`assistant` set) or disable (`assistant` undefined) the org assistant on a topic
60
+ * (mutates the channel on success). Steward gating + audit are the caller's, as with every board
61
+ * mutation. `trigger:'mention'` requires a mention handle — a nameless org cannot be mentioned. */
62
+ export function setTopicAssistant(board, channelId, assistant) {
63
+ const channel = board.find((c) => c.descriptor.id === channelId);
64
+ if (!channel)
65
+ return { ok: false, error: 'unknown channel' };
66
+ if (!assistant) {
67
+ delete channel.assistant;
68
+ // spec 329 §8 — assistant off ⇒ routing off transitively (routing is a mode of the assistant).
69
+ delete channel.routing;
70
+ return { ok: true, channel };
71
+ }
72
+ const mentionHandle = assistant.mentionHandle.trim().toLowerCase();
73
+ if (assistant.trigger === 'mention' && !mentionHandle) {
74
+ return { ok: false, error: 'mention trigger requires the org to have a primary name' };
75
+ }
76
+ if (!assistant.displayName.trim())
77
+ return { ok: false, error: 'displayName required' };
78
+ channel.assistant = { ...assistant, mentionHandle };
79
+ return { ok: true, channel };
80
+ }
81
+ /** Enable/refresh (`routing` set) or disable (`routing` undefined) member routing on a topic
82
+ * (spec 329 §7). Enabling REQUIRES the 327 assistant to be on (routing is a mode of the
83
+ * assistant's turn); fan-out is clamped fail-closed to the approved 1..5 window. Disabling the
84
+ * ASSISTANT also disables routing transitively (setTopicAssistant clears it below). */
85
+ export function setTopicRouting(board, channelId, routing) {
86
+ const channel = board.find((c) => c.descriptor.id === channelId);
87
+ if (!channel)
88
+ return { ok: false, error: 'unknown channel' };
89
+ if (!routing) {
90
+ delete channel.routing;
91
+ return { ok: true, channel };
92
+ }
93
+ if (!channel.assistant)
94
+ return { ok: false, error: 'routing requires the topic assistant to be enabled first' };
95
+ const raw = Number(routing.maxFanout);
96
+ const maxFanout = Number.isFinite(raw)
97
+ ? Math.min(Math.max(Math.round(raw), ROUTING_FANOUT_MIN), ROUTING_FANOUT_MAX)
98
+ : ROUTING_FANOUT_DEFAULT;
99
+ channel.routing = { ...routing, maxFanout };
100
+ return { ok: true, channel };
101
+ }
17
102
  /** Create a channel on the board (mutates `board` on success). Title-unique per context.
18
103
  * `contextId` is the org/context SA (substrate vocabulary — spec 322 §5; the wire literal
19
104
  * `kind:'community'` is inside signed hashes and renames only at 316's envelope re-cut). */
@@ -24,7 +109,8 @@ export function createBoardChannel(board, opts) {
24
109
  if (board.some((c) => c.title.toLowerCase() === title.toLowerCase())) {
25
110
  return { ok: false, error: 'a channel with this title already exists' };
26
111
  }
27
- const isPrivate = opts.visibility === 'private';
112
+ // New callers say participationPolicy; legacy callers say visibility. restricted ≡ private.
113
+ const isPrivate = opts.participationPolicy ? opts.participationPolicy === 'restricted' : opts.visibility === 'private';
28
114
  const descriptor = {
29
115
  version: 'ap.conversation.v1',
30
116
  id: generateConversationId(),
@@ -40,12 +126,14 @@ export function createBoardChannel(board, opts) {
40
126
  const errors = validateConversationDescriptor(descriptor);
41
127
  if (errors.length > 0)
42
128
  return { ok: false, error: `invalid channel: ${errors.join(', ')}` };
43
- // The creator is always a member of a private topic; dedupe + lowercase.
129
+ // The creator is always a participant of a restricted topic; dedupe + lowercase.
44
130
  const members = isPrivate
45
131
  ? [...new Set([opts.creatorSa?.toLowerCase(), ...(opts.members ?? []).map((m) => m.toLowerCase())].filter((m) => !!m))]
46
132
  : undefined;
47
133
  const channel = {
48
134
  descriptor, title, createdBy: opts.createdBy, messages: [],
135
+ // Dual-write: participationPolicy is the vocabulary; visibility stays for legacy readers.
136
+ participationPolicy: isPrivate ? 'restricted' : 'open',
49
137
  ...(isPrivate ? { visibility: 'private', members } : {}),
50
138
  };
51
139
  board.push(channel);
@@ -63,11 +151,14 @@ export async function appendBoardPost(board, opts) {
63
151
  return { ok: false, error: 'unknown channel' };
64
152
  const now = opts.now ?? new Date().toISOString();
65
153
  const messageId = generateMessageId();
154
+ const baseRefs = channel.descriptor.contextRefs ?? [];
155
+ const extraRefs = (opts.contextRefs ?? []).filter((r) => !baseRefs.some((b) => b.kind === r.kind && b.id === r.id));
156
+ const contextRefs = [...baseRefs, ...extraRefs];
66
157
  const envelope = {
67
- version: 'ap.message.v1',
158
+ version: 'ap.message.v2',
68
159
  id: messageId,
69
160
  conversationId: channel.descriptor.id,
70
- kind: 'plain',
161
+ performative: 'INFORM',
71
162
  from: opts.from,
72
163
  // Shared-board addressing: the descriptor's owner stands for the board (spec 313 §6).
73
164
  to: [channel.descriptor.owner],
@@ -76,12 +167,12 @@ export async function appendBoardPost(board, opts) {
76
167
  body: { resource: topicBodyResource(channel.descriptor.id, messageId), classification: 'internal', updatedAt: now },
77
168
  bodyHash: await sha256Hex32(new TextEncoder().encode(bodyText)),
78
169
  bodyContentType: 'text/plain',
79
- contextRefs: channel.descriptor.contextRefs,
170
+ contextRefs,
80
171
  };
81
172
  const errors = validateMessageEnvelope(envelope);
82
173
  if (errors.length > 0)
83
174
  return { ok: false, error: `invalid post: ${errors.join(', ')}` };
84
- channel.messages.push({ envelope, authorName: opts.authorName });
175
+ channel.messages.push({ envelope, authorName: opts.authorName, ...(opts.actor ? { actor: opts.actor } : {}), ...(opts.prov ? { prov: opts.prov } : {}) });
85
176
  if (channel.messages.length > BOARD_HISTORY_LIMIT) {
86
177
  channel.messages.splice(0, channel.messages.length - BOARD_HISTORY_LIMIT);
87
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/messaging/board.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAoBrD;kGACkG;AAClG,MAAM,UAAU,aAAa,CAAC,OAAkB,EAAE,QAAgB,EAAE,SAAS,GAAG,KAAK;IACnF,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAIvC;;6FAE6F;AAC7F,MAAM,UAAU,kBAAkB,CAChC,KAAkB,EAClB,IAA+K;IAE/K,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;IAC5F,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACrE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;IAC1E,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC;IAChD,MAAM,UAAU,GAA6B;QAC3C,OAAO,EAAE,oBAAoB;QAC7B,EAAE,EAAE,sBAAsB,EAAE;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK;QACL,YAAY,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QACtE,iBAAiB,EAAE,iBAAiB;QACpC,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC/C,gGAAgG;QAChG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,cAAuB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;IACF,MAAM,MAAM,GAAG,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC5F,yEAAyE;IACzE,MAAM,OAAO,GAAG,SAAS;QACvB,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpI,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAAc;QACzB,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE;QAC1D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED;;uFAEuF;AACvF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAkB,EAClB,IAAuG;IAEvG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;IAC/F,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;IACtE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAE7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAsB;QAClC,OAAO,EAAE,eAAe;QACxB,EAAE,EAAE,SAAS;QACb,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE;QACrC,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,sFAAsF;QACtF,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAC9B,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,UAAU;QAC1B,IAAI,EAAE,EAAE,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE;QACnH,QAAQ,EAAE,MAAM,WAAW,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/D,eAAe,EAAE,YAAY;QAC7B,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;KAC5C,CAAC;IACF,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACzF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;QAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/messaging/board.ts"],"names":[],"mappings":"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"}