managed-deepagents 0.4.0-dev.68 → 0.4.0-dev.69

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 (135) hide show
  1. package/README.md +1 -1
  2. package/dist/channels/assistant-text.d.ts +7 -0
  3. package/dist/channels/assistant-text.d.ts.map +1 -0
  4. package/dist/channels/assistant-text.js +28 -0
  5. package/dist/channels/assistant-text.js.map +1 -0
  6. package/dist/channels/binding.d.ts +34 -0
  7. package/dist/channels/binding.d.ts.map +1 -0
  8. package/dist/channels/binding.js +67 -0
  9. package/dist/channels/binding.js.map +1 -0
  10. package/dist/channels/errors.d.ts +11 -0
  11. package/dist/channels/errors.d.ts.map +1 -0
  12. package/dist/channels/errors.js +25 -0
  13. package/dist/channels/errors.js.map +1 -0
  14. package/dist/channels/index.d.ts +19 -0
  15. package/dist/channels/index.d.ts.map +1 -0
  16. package/dist/channels/index.js +14 -0
  17. package/dist/channels/index.js.map +1 -0
  18. package/dist/channels/runtime.d.ts +40 -0
  19. package/dist/channels/runtime.d.ts.map +1 -0
  20. package/dist/channels/runtime.js +76 -0
  21. package/dist/channels/runtime.js.map +1 -0
  22. package/dist/channels/schedule-delivery.d.ts +67 -0
  23. package/dist/channels/schedule-delivery.d.ts.map +1 -0
  24. package/dist/channels/schedule-delivery.js +193 -0
  25. package/dist/channels/schedule-delivery.js.map +1 -0
  26. package/dist/channels/slack/define.d.ts +87 -0
  27. package/dist/channels/slack/define.d.ts.map +1 -0
  28. package/dist/channels/slack/define.js +141 -0
  29. package/dist/channels/slack/define.js.map +1 -0
  30. package/dist/channels/slack/http.d.ts +86 -0
  31. package/dist/channels/slack/http.d.ts.map +1 -0
  32. package/dist/channels/slack/http.js +441 -0
  33. package/dist/channels/slack/http.js.map +1 -0
  34. package/dist/channels/slack/index.d.ts +18 -0
  35. package/dist/channels/slack/index.d.ts.map +1 -0
  36. package/dist/channels/slack/index.js +13 -0
  37. package/dist/channels/slack/index.js.map +1 -0
  38. package/dist/channels/slack/normalize.d.ts +62 -0
  39. package/dist/channels/slack/normalize.d.ts.map +1 -0
  40. package/dist/channels/slack/normalize.js +320 -0
  41. package/dist/channels/slack/normalize.js.map +1 -0
  42. package/dist/channels/slack/source-thread.d.ts +34 -0
  43. package/dist/channels/slack/source-thread.d.ts.map +1 -0
  44. package/dist/channels/slack/source-thread.js +92 -0
  45. package/dist/channels/slack/source-thread.js.map +1 -0
  46. package/dist/channels/slack/transport.d.ts +48 -0
  47. package/dist/channels/slack/transport.d.ts.map +1 -0
  48. package/dist/channels/slack/transport.js +178 -0
  49. package/dist/channels/slack/transport.js.map +1 -0
  50. package/dist/channels/store.d.ts +51 -0
  51. package/dist/channels/store.d.ts.map +1 -0
  52. package/dist/channels/store.js +76 -0
  53. package/dist/channels/store.js.map +1 -0
  54. package/dist/channels/types.d.ts +116 -0
  55. package/dist/channels/types.d.ts.map +1 -0
  56. package/dist/channels/types.js +24 -0
  57. package/dist/channels/types.js.map +1 -0
  58. package/dist/identity/links.d.ts +62 -0
  59. package/dist/identity/links.d.ts.map +1 -0
  60. package/dist/identity/links.js +176 -0
  61. package/dist/identity/links.js.map +1 -0
  62. package/dist/identity/slack-connect-http.d.ts +21 -0
  63. package/dist/identity/slack-connect-http.d.ts.map +1 -0
  64. package/dist/identity/slack-connect-http.js +129 -0
  65. package/dist/identity/slack-connect-http.js.map +1 -0
  66. package/dist/identity/slack-oauth.d.ts +60 -0
  67. package/dist/identity/slack-oauth.d.ts.map +1 -0
  68. package/dist/identity/slack-oauth.js +193 -0
  69. package/dist/identity/slack-oauth.js.map +1 -0
  70. package/dist/index.d.ts +6 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +3 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/runtime/auth.d.ts +40 -0
  75. package/dist/runtime/auth.d.ts.map +1 -1
  76. package/dist/runtime/auth.js +123 -9
  77. package/dist/runtime/auth.js.map +1 -1
  78. package/dist/runtime/cors.d.ts +28 -0
  79. package/dist/runtime/cors.d.ts.map +1 -0
  80. package/dist/runtime/cors.js +92 -0
  81. package/dist/runtime/cors.js.map +1 -0
  82. package/dist/runtime/identity-http.d.ts +6 -0
  83. package/dist/runtime/identity-http.d.ts.map +1 -1
  84. package/dist/runtime/identity-http.js +90 -2
  85. package/dist/runtime/identity-http.js.map +1 -1
  86. package/dist/runtime/identity-runtime.d.ts +41 -1
  87. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  88. package/dist/runtime/identity-runtime.js +142 -2
  89. package/dist/runtime/identity-runtime.js.map +1 -1
  90. package/dist/runtime/index.d.ts +2 -1
  91. package/dist/runtime/index.d.ts.map +1 -1
  92. package/dist/runtime/index.js +75 -191
  93. package/dist/runtime/index.js.map +1 -1
  94. package/dist/runtime/langsmith-connector.d.ts.map +1 -1
  95. package/dist/runtime/langsmith-connector.js +4 -3
  96. package/dist/runtime/langsmith-connector.js.map +1 -1
  97. package/dist/runtime/managed-tools.d.ts +6 -0
  98. package/dist/runtime/managed-tools.d.ts.map +1 -1
  99. package/dist/runtime/managed-tools.js +10 -0
  100. package/dist/runtime/managed-tools.js.map +1 -1
  101. package/dist/runtime/memory/context-io.d.ts +5 -0
  102. package/dist/runtime/memory/context-io.d.ts.map +1 -0
  103. package/dist/runtime/memory/context-io.js +28 -0
  104. package/dist/runtime/memory/context-io.js.map +1 -0
  105. package/dist/runtime/memory/index.d.ts +8 -0
  106. package/dist/runtime/memory/index.d.ts.map +1 -0
  107. package/dist/runtime/memory/index.js +6 -0
  108. package/dist/runtime/memory/index.js.map +1 -0
  109. package/dist/runtime/memory/mounts.d.ts +38 -0
  110. package/dist/runtime/memory/mounts.d.ts.map +1 -0
  111. package/dist/runtime/memory/mounts.js +185 -0
  112. package/dist/runtime/memory/mounts.js.map +1 -0
  113. package/dist/runtime/memory/paths.d.ts +10 -0
  114. package/dist/runtime/memory/paths.d.ts.map +1 -0
  115. package/dist/runtime/memory/paths.js +50 -0
  116. package/dist/runtime/memory/paths.js.map +1 -0
  117. package/dist/runtime/memory/seed.d.ts +30 -0
  118. package/dist/runtime/memory/seed.d.ts.map +1 -0
  119. package/dist/runtime/memory/seed.js +185 -0
  120. package/dist/runtime/memory/seed.js.map +1 -0
  121. package/dist/runtime/memory/user-repo.d.ts +19 -0
  122. package/dist/runtime/memory/user-repo.d.ts.map +1 -0
  123. package/dist/runtime/memory/user-repo.js +57 -0
  124. package/dist/runtime/memory/user-repo.js.map +1 -0
  125. package/dist/runtime/types.d.ts +11 -2
  126. package/dist/runtime/types.d.ts.map +1 -1
  127. package/dist/schedules.d.ts +6 -3
  128. package/dist/schedules.d.ts.map +1 -1
  129. package/dist/schedules.js +22 -0
  130. package/dist/schedules.js.map +1 -1
  131. package/dist/types.d.ts +4 -11
  132. package/dist/types.d.ts.map +1 -1
  133. package/dist/types.js +1 -1
  134. package/dist/types.js.map +1 -1
  135. package/package.json +16 -7
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Slack Web API transport for managed channel egress.
3
+ *
4
+ * Uses `fetch` against `https://slack.com/api/*` — no Slack SDK dependency.
5
+ * Credentials stay in process env / constructor args; they never appear on
6
+ * `runtime.channel`.
7
+ */
8
+ import { ChannelError } from "../errors.js";
9
+ const DEFAULT_SLACK_API = "https://slack.com/api";
10
+ /** Optional override so tests can point at a local mock Slack Web API. */
11
+ export const SLACK_API_BASE_ENV = "SLACK_API_BASE";
12
+ /** Default status string for Slack Assistants `assistant.threads.setStatus`. */
13
+ export const DEFAULT_ASSISTANT_STATUS = "is thinking…";
14
+ /**
15
+ * Curated rotating loading strings shown by Slack while the indicator is active.
16
+ * Capped at 10 by Slack's API.
17
+ */
18
+ export const DEFAULT_LOADING_MESSAGES = [
19
+ "Pondering…",
20
+ "Cogitating…",
21
+ "Ruminating…",
22
+ "Noodling…",
23
+ "Percolating…",
24
+ "Marinating…",
25
+ "Simmering…",
26
+ "Conjuring…",
27
+ "Tinkering…",
28
+ "Schlepping…",
29
+ ];
30
+ /**
31
+ * Build a {@link ChannelTransport} backed by Slack `chat.postMessage` /
32
+ * `chat.update`.
33
+ */
34
+ export function createSlackWebApiTransport(options) {
35
+ const token = options.botToken.trim();
36
+ if (!token) {
37
+ throw new Error("Slack bot token is required for channel transport");
38
+ }
39
+ const apiBase = (options.apiBase ??
40
+ process.env[SLACK_API_BASE_ENV] ??
41
+ DEFAULT_SLACK_API).replace(/\/$/, "");
42
+ const doFetch = options.fetch ?? fetch;
43
+ return {
44
+ async post(input) {
45
+ const body = {
46
+ channel: input.conversationId,
47
+ text: input.text,
48
+ };
49
+ if (input.threadId) {
50
+ body.thread_ts = input.threadId;
51
+ }
52
+ applyNative(body, input.native?.payload);
53
+ const result = await slackApi(doFetch, token, apiBase, "chat.postMessage", body);
54
+ const ts = typeof result.ts === "string" ? result.ts : undefined;
55
+ const channel = typeof result.channel === "string"
56
+ ? result.channel
57
+ : input.conversationId;
58
+ return {
59
+ id: ts ? `slack:${channel}:${ts}` : `slack:${crypto.randomUUID()}`,
60
+ ...(ts ? { providerMessageId: ts } : {}),
61
+ };
62
+ },
63
+ async update(input) {
64
+ const parts = parseSlackMessageId(input.id);
65
+ if (!parts) {
66
+ throw new ChannelError("channel_provider_rejected", `cannot update Slack message with id "${input.id}"`);
67
+ }
68
+ const body = {
69
+ channel: parts.channel,
70
+ ts: parts.ts,
71
+ };
72
+ if (input.text !== undefined) {
73
+ body.text = input.text;
74
+ }
75
+ applyNative(body, input.native?.payload);
76
+ const result = await slackApi(doFetch, token, apiBase, "chat.update", body);
77
+ const ts = typeof result.ts === "string" ? result.ts : parts.ts;
78
+ return {
79
+ id: `slack:${parts.channel}:${ts}`,
80
+ providerMessageId: ts,
81
+ };
82
+ },
83
+ };
84
+ }
85
+ /**
86
+ * Set (or clear) Slack's Assistants thread status indicator.
87
+ *
88
+ * Wraps `assistant.threads.setStatus`. Failures are logged and never thrown —
89
+ * the indicator is a UX nicety, not a correctness requirement. Returns whether
90
+ * Slack accepted the update.
91
+ */
92
+ export async function setSlackAssistantStatus(options) {
93
+ const token = options.botToken.trim();
94
+ const channelId = options.channelId.trim();
95
+ const threadTs = options.threadTs.trim();
96
+ if (!token || !channelId || !threadTs) {
97
+ return false;
98
+ }
99
+ const status = options.status ?? DEFAULT_ASSISTANT_STATUS;
100
+ const apiBase = (options.apiBase ??
101
+ process.env[SLACK_API_BASE_ENV] ??
102
+ DEFAULT_SLACK_API).replace(/\/$/, "");
103
+ const doFetch = options.fetch ?? fetch;
104
+ const body = {
105
+ channel_id: channelId,
106
+ thread_ts: threadTs,
107
+ status,
108
+ };
109
+ if (status && options.loadingMessages && options.loadingMessages.length > 0) {
110
+ body.loading_messages = options.loadingMessages.slice(0, 10);
111
+ }
112
+ try {
113
+ await slackApi(doFetch, token, apiBase, "assistant.threads.setStatus", body);
114
+ return true;
115
+ }
116
+ catch (error) {
117
+ console.warn(`[mda] Slack assistant.threads.setStatus failed:`, error instanceof Error ? error.message : String(error));
118
+ return false;
119
+ }
120
+ }
121
+ function applyNative(body, payload) {
122
+ if (!payload)
123
+ return;
124
+ // Allow a narrow set of Slack message fields from native escape hatches.
125
+ for (const key of ["blocks", "attachments", "mrkdwn"]) {
126
+ if (key in payload) {
127
+ body[key] = payload[key];
128
+ }
129
+ }
130
+ }
131
+ function parseSlackMessageId(id) {
132
+ // Expected: slack:{channel}:{ts}
133
+ if (!id.startsWith("slack:"))
134
+ return undefined;
135
+ const rest = id.slice("slack:".length);
136
+ const split = rest.lastIndexOf(":");
137
+ if (split <= 0)
138
+ return undefined;
139
+ const channel = rest.slice(0, split);
140
+ const ts = rest.slice(split + 1);
141
+ if (!channel || !ts)
142
+ return undefined;
143
+ return { channel, ts };
144
+ }
145
+ async function slackApi(doFetch, token, apiBase, method, body) {
146
+ let response;
147
+ try {
148
+ response = await doFetch(`${apiBase}/${method}`, {
149
+ method: "POST",
150
+ headers: {
151
+ Authorization: `Bearer ${token}`,
152
+ "Content-Type": "application/json; charset=utf-8",
153
+ },
154
+ body: JSON.stringify(body),
155
+ });
156
+ }
157
+ catch (error) {
158
+ throw new ChannelError("channel_provider_rejected", `Slack ${method} network error: ${error instanceof Error ? error.message : String(error)}`);
159
+ }
160
+ let payload;
161
+ try {
162
+ payload = (await response.json());
163
+ }
164
+ catch {
165
+ throw new ChannelError("channel_provider_rejected", `Slack ${method} returned non-JSON (HTTP ${response.status})`);
166
+ }
167
+ if (!response.ok || payload.ok !== true) {
168
+ const err = typeof payload.error === "string"
169
+ ? payload.error
170
+ : `HTTP ${response.status}`;
171
+ if (err === "ratelimited" || response.status === 429) {
172
+ throw new ChannelError("channel_provider_rate_limited", `Slack ${method} rate limited`);
173
+ }
174
+ throw new ChannelError("channel_provider_rejected", `Slack ${method} failed: ${err}`);
175
+ }
176
+ return payload;
177
+ }
178
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/channels/slack/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Process-local channel delivery dedupe for Phase 1.
3
+ *
4
+ * Event-id acceptance is process-local only: fine for unit tests and
5
+ * single-replica / local `mda dev`. Multi-replica Host deployments can still
6
+ * double-invoke on Slack retries until durable placement lands.
7
+ */
8
+ import type { ChannelEvent, ChannelProvider } from "./types.js";
9
+ export type DeliveryStatus = "accepted" | "filtered" | "running" | "response_pending" | "delivered";
10
+ export interface DeliveryRecord {
11
+ deliveryId: string;
12
+ deploymentId: string;
13
+ channelDefinitionId: string;
14
+ provider: ChannelProvider;
15
+ providerEventId?: string;
16
+ status: DeliveryStatus;
17
+ attemptCount: number;
18
+ sourceThreadKey?: string;
19
+ runId?: string;
20
+ outboundMessageIds: string[];
21
+ filterReason?: string;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ }
25
+ /** Process-local store used by unit tests and local development. */
26
+ export declare class InMemoryChannelStore {
27
+ readonly deliveries: Map<string, DeliveryRecord>;
28
+ /** Maps acceptance key → deliveryId for idempotent acceptance. */
29
+ readonly acceptanceIndex: Map<string, string>;
30
+ acceptanceKey(parts: {
31
+ deploymentId: string;
32
+ channelDefinitionId: string;
33
+ apiAppId: string;
34
+ eventId: string;
35
+ }): string;
36
+ acceptDelivery(input: {
37
+ deploymentId: string;
38
+ channelDefinitionId: string;
39
+ provider: ChannelProvider;
40
+ apiAppId: string;
41
+ eventId?: string;
42
+ sourceThreadKey?: string;
43
+ status: Extract<DeliveryStatus, "accepted" | "filtered">;
44
+ filterReason?: string;
45
+ event?: ChannelEvent;
46
+ }): {
47
+ delivery: DeliveryRecord;
48
+ duplicate: boolean;
49
+ };
50
+ }
51
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/channels/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,UAAU,GACV,SAAS,GACT,kBAAkB,GAClB,WAAW,CAAC;AAEhB,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oEAAoE;AACpE,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,UAAU,8BAAqC;IACxD,kEAAkE;IAClE,QAAQ,CAAC,eAAe,sBAA6B;IAErD,aAAa,CAAC,KAAK,EAAE;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,MAAM;IASV,cAAc,CAAC,KAAK,EAAE;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,QAAQ,EAAE,eAAe,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;QACzD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,YAAY,CAAC;KACtB,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;CAuDrD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Process-local channel delivery dedupe for Phase 1.
3
+ *
4
+ * Event-id acceptance is process-local only: fine for unit tests and
5
+ * single-replica / local `mda dev`. Multi-replica Host deployments can still
6
+ * double-invoke on Slack retries until durable placement lands.
7
+ */
8
+ /** Process-local store used by unit tests and local development. */
9
+ export class InMemoryChannelStore {
10
+ deliveries = new Map();
11
+ /** Maps acceptance key → deliveryId for idempotent acceptance. */
12
+ acceptanceIndex = new Map();
13
+ acceptanceKey(parts) {
14
+ return [
15
+ parts.deploymentId,
16
+ parts.channelDefinitionId,
17
+ parts.apiAppId,
18
+ parts.eventId,
19
+ ].join("\0");
20
+ }
21
+ acceptDelivery(input) {
22
+ const now = new Date().toISOString();
23
+ if (input.eventId) {
24
+ const key = this.acceptanceKey({
25
+ deploymentId: input.deploymentId,
26
+ channelDefinitionId: input.channelDefinitionId,
27
+ apiAppId: input.apiAppId,
28
+ eventId: input.eventId,
29
+ });
30
+ const existingId = this.acceptanceIndex.get(key);
31
+ if (existingId) {
32
+ const existing = this.deliveries.get(existingId);
33
+ if (existing) {
34
+ existing.attemptCount += 1;
35
+ existing.updatedAt = now;
36
+ return { delivery: existing, duplicate: true };
37
+ }
38
+ }
39
+ const deliveryId = input.event?.deliveryId ?? crypto.randomUUID();
40
+ const delivery = {
41
+ deliveryId,
42
+ deploymentId: input.deploymentId,
43
+ channelDefinitionId: input.channelDefinitionId,
44
+ provider: input.provider,
45
+ providerEventId: input.eventId,
46
+ status: input.status,
47
+ attemptCount: 1,
48
+ sourceThreadKey: input.sourceThreadKey,
49
+ outboundMessageIds: [],
50
+ filterReason: input.filterReason,
51
+ createdAt: now,
52
+ updatedAt: now,
53
+ };
54
+ this.deliveries.set(deliveryId, delivery);
55
+ this.acceptanceIndex.set(key, deliveryId);
56
+ return { delivery, duplicate: false };
57
+ }
58
+ const deliveryId = input.event?.deliveryId ?? crypto.randomUUID();
59
+ const delivery = {
60
+ deliveryId,
61
+ deploymentId: input.deploymentId,
62
+ channelDefinitionId: input.channelDefinitionId,
63
+ provider: input.provider,
64
+ status: input.status,
65
+ attemptCount: 1,
66
+ sourceThreadKey: input.sourceThreadKey,
67
+ outboundMessageIds: [],
68
+ filterReason: input.filterReason,
69
+ createdAt: now,
70
+ updatedAt: now,
71
+ };
72
+ this.deliveries.set(deliveryId, delivery);
73
+ return { delivery, duplicate: false };
74
+ }
75
+ }
76
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/channels/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Channel-neutral authoring and runtime contracts.
3
+ *
4
+ * Provider-specific fields belong in a validated `native` payload or the
5
+ * managed adapter — never on these core types.
6
+ */
7
+ /** Closed, managed adapter set; `"slack"` is the initial member. */
8
+ export type ChannelProvider = "slack";
9
+ export type JsonValue = null | boolean | number | string | readonly JsonValue[] | {
10
+ readonly [key: string]: JsonValue;
11
+ };
12
+ /** Opaque conversation address in a provider/installation. */
13
+ export interface ChannelAddress {
14
+ /** Opaque conversation identifier in this provider/installation. */
15
+ conversationId: string;
16
+ /** Opaque provider thread/root identifier, when the provider has threads. */
17
+ threadId?: string;
18
+ }
19
+ export interface ChannelAttachmentRef {
20
+ /** Opaque MDA reference, not a provider ID or bearer URL. */
21
+ id: string;
22
+ kind: "file" | "image" | "audio" | "video" | "link" | "unknown";
23
+ name?: string;
24
+ contentType?: string;
25
+ size?: number;
26
+ }
27
+ export interface ChannelInboundMessage {
28
+ id: string;
29
+ text: string;
30
+ attachments: readonly ChannelAttachmentRef[];
31
+ }
32
+ export interface ChannelEvent {
33
+ /** MDA delivery/audit id. */
34
+ deliveryId: string;
35
+ /** Provider logical-event id, if one exists. */
36
+ eventId?: string;
37
+ type: string;
38
+ occurredAt?: string;
39
+ address: ChannelAddress;
40
+ message?: ChannelInboundMessage;
41
+ interaction?: {
42
+ action: string;
43
+ value?: JsonValue;
44
+ };
45
+ }
46
+ export interface ChannelNativePayload {
47
+ provider: ChannelProvider;
48
+ payload: {
49
+ readonly [key: string]: JsonValue;
50
+ };
51
+ }
52
+ /**
53
+ * Destination for channel delivery.
54
+ *
55
+ * Schedules cannot use `current_thread` (no originating thread).
56
+ */
57
+ export type ChannelDestination = {
58
+ type: "current_thread";
59
+ } | {
60
+ type: "provider_thread";
61
+ conversationId: string;
62
+ threadId: string;
63
+ } | {
64
+ type: "provider_conversation";
65
+ conversationId: string;
66
+ };
67
+ export interface ChannelMessage {
68
+ /** Required plain-text representation and fallback. */
69
+ text: string;
70
+ to?: ChannelDestination;
71
+ native?: ChannelNativePayload;
72
+ }
73
+ export interface PostedChannelMessage {
74
+ /** Stable MDA-owned id used by update and delivery records. */
75
+ id: string;
76
+ providerMessageId?: string;
77
+ url?: string;
78
+ }
79
+ export interface ChannelMessageUpdate {
80
+ text?: string;
81
+ native?: ChannelNativePayload;
82
+ }
83
+ export interface ChannelCapabilities {
84
+ update: boolean;
85
+ }
86
+ /**
87
+ * Provider-neutral reply surface injected on channel-originated runs only.
88
+ *
89
+ * Absent for ordinary HTTP and schedule runs.
90
+ */
91
+ export interface RuntimeChannel {
92
+ /** File-derived configured channel name. */
93
+ name: string;
94
+ provider: ChannelProvider;
95
+ event: ChannelEvent;
96
+ address: ChannelAddress;
97
+ capabilities: ChannelCapabilities;
98
+ post(message: ChannelMessage, options?: {
99
+ final?: boolean;
100
+ }): Promise<PostedChannelMessage>;
101
+ update?(id: string, message: ChannelMessageUpdate): Promise<PostedChannelMessage>;
102
+ }
103
+ /** Stable machine-readable channel error codes (npm / PyPI / traces). */
104
+ export type ChannelErrorCode = "channel_invalid_signature" | "channel_replay_rejected" | "channel_installation_not_found" | "channel_event_filtered" | "channel_identity_unresolvable" | "channel_destination_forbidden" | "channel_invocation_rate_limited" | "channel_run_failed" | "channel_provider_rate_limited" | "channel_provider_rejected";
105
+ /** Narrow a destination to its discriminant + required address fields. */
106
+ export declare function normalizeChannelDestination(destination: ChannelDestination): {
107
+ type: "current_thread";
108
+ } | {
109
+ type: "provider_thread";
110
+ conversationId: string;
111
+ threadId: string;
112
+ } | {
113
+ type: "provider_conversation";
114
+ conversationId: string;
115
+ };
116
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Channel-neutral authoring and runtime contracts.
3
+ *
4
+ * Provider-specific fields belong in a validated `native` payload or the
5
+ * managed adapter — never on these core types.
6
+ */
7
+ /** Narrow a destination to its discriminant + required address fields. */
8
+ export function normalizeChannelDestination(destination) {
9
+ if (destination.type === "current_thread") {
10
+ return { type: "current_thread" };
11
+ }
12
+ if (destination.type === "provider_thread") {
13
+ return {
14
+ type: "provider_thread",
15
+ conversationId: destination.conversationId,
16
+ threadId: destination.threadId,
17
+ };
18
+ }
19
+ return {
20
+ type: "provider_conversation",
21
+ conversationId: destination.conversationId,
22
+ };
23
+ }
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmIH,0EAA0E;AAC1E,MAAM,UAAU,2BAA2B,CACzC,WAA+B;IAK/B,IAAI,WAAW,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC3C,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,QAAQ,EAAE,WAAW,CAAC,QAAQ;SAC/B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,cAAc,EAAE,WAAW,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Durable Slack ↔ actor account links (Open SWE–style mapping).
3
+ *
4
+ * Stored in the LangGraph Store under `["mda_identity_links"]`, with an
5
+ * in-memory backend for unit tests. Slack Events look up `slack:T:U` before
6
+ * invoke; the web Connect-with-Slack flow upserts after OIDC.
7
+ */
8
+ import { Client } from "@langchain/langgraph-sdk";
9
+ export declare const IDENTITY_LINKS_NAMESPACE: readonly ["mda_identity_links"];
10
+ export interface IdentityLinkRecord {
11
+ actorId: string;
12
+ slackUserId: string;
13
+ slackTeamId?: string;
14
+ /** Fully-qualified Slack actor key, e.g. `slack:T123:U456`. */
15
+ slackActorId: string;
16
+ email?: string;
17
+ linkedAt: string;
18
+ source: "slack_oauth";
19
+ }
20
+ export interface IdentityLinkStore {
21
+ getBySlackActorId(slackActorId: string): Promise<IdentityLinkRecord | null>;
22
+ getByActorId(actorId: string): Promise<IdentityLinkRecord | null>;
23
+ upsert(record: IdentityLinkRecord): Promise<void>;
24
+ removeByActorId(actorId: string): Promise<void>;
25
+ }
26
+ /** In-memory store for tests (and as a process-local cache layer). */
27
+ export declare class InMemoryIdentityLinkStore implements IdentityLinkStore {
28
+ private readonly bySlack;
29
+ private readonly byActor;
30
+ getBySlackActorId(slackActorId: string): Promise<IdentityLinkRecord | null>;
31
+ getByActorId(actorId: string): Promise<IdentityLinkRecord | null>;
32
+ upsert(record: IdentityLinkRecord): Promise<void>;
33
+ removeByActorId(actorId: string): Promise<void>;
34
+ }
35
+ /** LangGraph Store–backed identity links. */
36
+ export declare class LangGraphIdentityLinkStore implements IdentityLinkStore {
37
+ private readonly client;
38
+ constructor(client: Client);
39
+ getBySlackActorId(slackActorId: string): Promise<IdentityLinkRecord | null>;
40
+ getByActorId(actorId: string): Promise<IdentityLinkRecord | null>;
41
+ upsert(record: IdentityLinkRecord): Promise<void>;
42
+ removeByActorId(actorId: string): Promise<void>;
43
+ private getItem;
44
+ }
45
+ /** Override the process-default link store (tests). */
46
+ export declare function setIdentityLinkStore(store: IdentityLinkStore | null): void;
47
+ /** Resolve the process-default link store (in-memory until a Client is wired). */
48
+ export declare function getIdentityLinkStore(): IdentityLinkStore;
49
+ /** Build a Store-backed client when loopback + ingress secret are available. */
50
+ export declare function createLangGraphIdentityLinkStore(options?: {
51
+ apiUrl?: string;
52
+ apiKey?: string;
53
+ ingressSecret?: string;
54
+ }): LangGraphIdentityLinkStore | null;
55
+ export declare function slackActorIdFromParts(teamId: string, userId: string): string;
56
+ export declare function buildIdentityLinkRecord(input: {
57
+ actorId: string;
58
+ slackUserId: string;
59
+ slackTeamId?: string;
60
+ email?: string;
61
+ }): IdentityLinkRecord;
62
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/identity/links.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAUlD,eAAO,MAAM,wBAAwB,iCAAyC,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAC5E,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,sEAAsE;AACtE,qBAAa,yBAA0B,YAAW,iBAAiB;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAE3D,iBAAiB,CACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAI/B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAIjE,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAajD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQtD;AAED,6CAA6C;AAC7C,qBAAa,0BAA2B,YAAW,iBAAiB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAErC,iBAAiB,CACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAI/B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAIjE,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BjD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAevC,OAAO;CAUtB;AAID,uDAAuD;AACvD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAE1E;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,IAAI,iBAAiB,CAOxD;AAED,gFAAgF;AAChF,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,0BAA0B,GAAG,IAAI,CAqBnC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,kBAAkB,CAWrB"}