@essentialai/cogent 3.1.0 → 3.4.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 (38) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/auth/index.d.ts +51 -0
  3. package/dist/auth/index.d.ts.map +1 -0
  4. package/dist/auth/index.js +66 -0
  5. package/dist/auth/index.js.map +1 -0
  6. package/dist/schemas/api-requests.d.ts +8 -0
  7. package/dist/schemas/api-requests.d.ts.map +1 -1
  8. package/dist/schemas/api-requests.js +2 -0
  9. package/dist/schemas/api-requests.js.map +1 -1
  10. package/dist/slack-format/attribution.d.ts +12 -0
  11. package/dist/slack-format/attribution.d.ts.map +1 -0
  12. package/dist/slack-format/attribution.js +37 -0
  13. package/dist/slack-format/attribution.js.map +1 -0
  14. package/dist/slack-format/index.d.ts +8 -0
  15. package/dist/slack-format/index.d.ts.map +1 -0
  16. package/dist/slack-format/index.js +6 -0
  17. package/dist/slack-format/index.js.map +1 -0
  18. package/dist/slack-format/md-to-slack.d.ts +20 -0
  19. package/dist/slack-format/md-to-slack.d.ts.map +1 -0
  20. package/dist/slack-format/md-to-slack.js +28 -0
  21. package/dist/slack-format/md-to-slack.js.map +1 -0
  22. package/dist/slack-format/mentions.d.ts +21 -0
  23. package/dist/slack-format/mentions.d.ts.map +1 -0
  24. package/dist/slack-format/mentions.js +93 -0
  25. package/dist/slack-format/mentions.js.map +1 -0
  26. package/dist/slack-format/peer-helpers.d.ts +22 -0
  27. package/dist/slack-format/peer-helpers.d.ts.map +1 -0
  28. package/dist/slack-format/peer-helpers.js +23 -0
  29. package/dist/slack-format/peer-helpers.js.map +1 -0
  30. package/dist/slack-format/slack-to-md.d.ts +18 -0
  31. package/dist/slack-format/slack-to-md.d.ts.map +1 -0
  32. package/dist/slack-format/slack-to-md.js +66 -0
  33. package/dist/slack-format/slack-to-md.js.map +1 -0
  34. package/dist/slack-format/types.d.ts +17 -0
  35. package/dist/slack-format/types.d.ts.map +1 -0
  36. package/dist/slack-format/types.js +2 -0
  37. package/dist/slack-format/types.js.map +1 -0
  38. package/package.json +13 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,40 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.4.0] - 2026-06-03
4
+
5
+ ### Added
6
+ - `CreateSessionRequest` / `JoinSessionRequest` (+ their Zod schemas) gain an **optional**
7
+ `orgId` field — the 3rd join credential for Business Edition Org_ID-gated channels.
8
+ Backward-compatible: optional + still `.strict()`, so free-edition clients that omit it are
9
+ unaffected, and the free relay ignores it. Org_ID is generated high-entropy by the control
10
+ plane; the relay stores/verifies only its bcrypt hash.
11
+
12
+ ## [3.3.0] - 2026-06-03
13
+
14
+ ### Added
15
+ - New `./auth` subpath export — shared hashing/token primitives (`AuthService`):
16
+ bcrypt `hashSecret`/`verifySecret`, `generateToken`, SHA-256 `hashToken`,
17
+ `timingSafeCompare`. Caller injects the bcrypt cost factor. Moved verbatim from
18
+ the relay so the relay and the upcoming Business Edition control plane hash
19
+ Org_IDs and channel secrets identically (no drift between deployed services).
20
+
21
+ ### Changed
22
+ - Added `bcryptjs` as a runtime dependency (used by `AuthService`).
23
+
24
+ ## [3.2.0] - 2026-06-01
25
+
26
+ ### Added
27
+ - New `./slack-format` subpath export — shared Slack <-> markdown translation engine,
28
+ reused by the Slack adapter (and the upcoming Business Edition's distributed app):
29
+ - `slackToMarkdown`, `markdownToSlack`
30
+ - `extractUserIds`, `resolveInboundMentions`, `resolveOutboundMentions`
31
+ - `derivePeerId`, `buildPeerLabel`, `platformLabel`, `getAgentEmoji`
32
+ - `UserLookup` / `CachedUser` / `PlatformUserInfo` types (decouples the pure mention
33
+ resolvers from any Bolt-bound user cache)
34
+
35
+ ### Changed
36
+ - Added `slackify-markdown` as a runtime dependency (used by `markdownToSlack`).
37
+
3
38
  ## [3.0.0] - 2026-03-19
4
39
 
5
40
  ### Added
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Authentication / hashing primitives shared across Cogent services.
3
+ *
4
+ * Responsibilities:
5
+ * - bcrypt hashing of session secrets (one-time, during create/join)
6
+ * - Random bearer token generation with SHA-256 hashing for storage
7
+ * - Timing-safe comparison for token verification (every request)
8
+ *
9
+ * bcrypt is used for secrets (slow, salted -- appropriate for passwords).
10
+ * SHA-256 is used for tokens (fast -- tokens are high-entropy random values).
11
+ * Timing-safe comparison prevents timing attacks on token verification.
12
+ *
13
+ * The bcrypt cost factor is caller-injected so each deployment (free relay,
14
+ * business control plane) supplies its own configured rounds.
15
+ */
16
+ export declare class AuthService {
17
+ private readonly bcryptRounds;
18
+ constructor(bcryptRounds: number);
19
+ /**
20
+ * Hash a plaintext secret using bcrypt.
21
+ * Used during session creation and join operations.
22
+ */
23
+ hashSecret(plainSecret: string): Promise<string>;
24
+ /**
25
+ * Verify a plaintext secret against a bcrypt hash.
26
+ * Used during session join to validate the provided secret.
27
+ */
28
+ verifySecret(plainSecret: string, hash: string): Promise<boolean>;
29
+ /**
30
+ * Generate a cryptographically random bearer token.
31
+ * Returns both the plaintext token (to send to client) and its
32
+ * SHA-256 hash (to store on disk for lookup).
33
+ */
34
+ generateToken(): {
35
+ token: string;
36
+ tokenHash: string;
37
+ };
38
+ /**
39
+ * Compute the SHA-256 hash of a token string.
40
+ * Used by auth middleware to look up tokens in the session store index.
41
+ */
42
+ hashToken(token: string): string;
43
+ /**
44
+ * Timing-safe string comparison.
45
+ * Hashes both strings with SHA-256 to normalize length, then uses
46
+ * crypto.timingSafeEqual on the resulting buffers. This prevents
47
+ * timing attacks regardless of input string lengths.
48
+ */
49
+ timingSafeCompare(a: string, b: string): boolean;
50
+ }
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,YAAY,EAAE,MAAM;IAIhC;;;OAGG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAItD;;;OAGG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvE;;;;OAIG;IACH,aAAa,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAMrD;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIhC;;;;;OAKG;IACH,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;CAKjD"}
@@ -0,0 +1,66 @@
1
+ import crypto from "node:crypto";
2
+ import bcrypt from "bcryptjs";
3
+ /**
4
+ * Authentication / hashing primitives shared across Cogent services.
5
+ *
6
+ * Responsibilities:
7
+ * - bcrypt hashing of session secrets (one-time, during create/join)
8
+ * - Random bearer token generation with SHA-256 hashing for storage
9
+ * - Timing-safe comparison for token verification (every request)
10
+ *
11
+ * bcrypt is used for secrets (slow, salted -- appropriate for passwords).
12
+ * SHA-256 is used for tokens (fast -- tokens are high-entropy random values).
13
+ * Timing-safe comparison prevents timing attacks on token verification.
14
+ *
15
+ * The bcrypt cost factor is caller-injected so each deployment (free relay,
16
+ * business control plane) supplies its own configured rounds.
17
+ */
18
+ export class AuthService {
19
+ bcryptRounds;
20
+ constructor(bcryptRounds) {
21
+ this.bcryptRounds = bcryptRounds;
22
+ }
23
+ /**
24
+ * Hash a plaintext secret using bcrypt.
25
+ * Used during session creation and join operations.
26
+ */
27
+ async hashSecret(plainSecret) {
28
+ return bcrypt.hash(plainSecret, this.bcryptRounds);
29
+ }
30
+ /**
31
+ * Verify a plaintext secret against a bcrypt hash.
32
+ * Used during session join to validate the provided secret.
33
+ */
34
+ async verifySecret(plainSecret, hash) {
35
+ return bcrypt.compare(plainSecret, hash);
36
+ }
37
+ /**
38
+ * Generate a cryptographically random bearer token.
39
+ * Returns both the plaintext token (to send to client) and its
40
+ * SHA-256 hash (to store on disk for lookup).
41
+ */
42
+ generateToken() {
43
+ const token = crypto.randomBytes(32).toString("hex");
44
+ const tokenHash = this.hashToken(token);
45
+ return { token, tokenHash };
46
+ }
47
+ /**
48
+ * Compute the SHA-256 hash of a token string.
49
+ * Used by auth middleware to look up tokens in the session store index.
50
+ */
51
+ hashToken(token) {
52
+ return crypto.createHash("sha256").update(token).digest("hex");
53
+ }
54
+ /**
55
+ * Timing-safe string comparison.
56
+ * Hashes both strings with SHA-256 to normalize length, then uses
57
+ * crypto.timingSafeEqual on the resulting buffers. This prevents
58
+ * timing attacks regardless of input string lengths.
59
+ */
60
+ timingSafeCompare(a, b) {
61
+ const hashA = crypto.createHash("sha256").update(a).digest();
62
+ const hashB = crypto.createHash("sha256").update(b).digest();
63
+ return crypto.timingSafeEqual(hashA, hashB);
64
+ }
65
+ }
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,WAAW;IACL,YAAY,CAAS;IAEtC,YAAY,YAAoB;QAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,IAAY;QAClD,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,KAAa;QACrB,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,CAAS,EAAE,CAAS;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -3,10 +3,18 @@ import { z } from "zod";
3
3
  export interface CreateSessionRequest {
4
4
  label?: string;
5
5
  secret: string;
6
+ /**
7
+ * Optional Org_ID — the 3rd join credential for Business Edition channels.
8
+ * When supplied on a multi-tenant relay, the channel becomes Org_ID-gated.
9
+ * Ignored by the free relay. Generated high-entropy by the control plane.
10
+ */
11
+ orgId?: string;
6
12
  }
7
13
  /** Request body for joining an existing session. */
8
14
  export interface JoinSessionRequest {
9
15
  secret: string;
16
+ /** Optional Org_ID — required to join an Org_ID-gated business channel. */
17
+ orgId?: string;
10
18
  }
11
19
  /** Request body for registering a peer in a session. */
12
20
  export interface RegisterPeerRequest {
@@ -1 +1 @@
1
- {"version":3,"file":"api-requests.d.ts","sourceRoot":"","sources":["../../src/schemas/api-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,sDAAsD;AACtD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,oDAAoD;AACpD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;IACtD,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;CAAG;AAEzC,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;CAC7D;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAK5D,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAIxD,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAU1D,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAE9D,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAOxD,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAMlD,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAKtC,CAAC"}
1
+ {"version":3,"file":"api-requests.d.ts","sourceRoot":"","sources":["../../src/schemas/api-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,sDAAsD;AACtD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oDAAoD;AACpD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;IACtD,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;CAAG;AAEzC,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;CAC7D;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAM5D,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAKxD,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAU1D,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAE9D,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAOxD,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAMlD,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAKtC,CAAC"}
@@ -8,6 +8,7 @@ export const CreateSessionRequestSchema = z
8
8
  .object({
9
9
  label: z.string().regex(/^[a-z0-9][a-z0-9-]{1,30}[a-z0-9]$/).optional().describe("Optional human-readable session label (3-32 lowercase alphanumeric + hyphens)"),
10
10
  secret: z.string().min(8).describe("Shared secret for joining the session (min 8 chars)"),
11
+ orgId: z.string().min(1).optional().describe("Optional Org_ID -- gates the channel to Business Edition orgs (multi-tenant relay only)"),
11
12
  })
12
13
  .strict();
13
14
  /**
@@ -17,6 +18,7 @@ export const CreateSessionRequestSchema = z
17
18
  export const JoinSessionRequestSchema = z
18
19
  .object({
19
20
  secret: z.string().min(1).describe("Shared secret for the session"),
21
+ orgId: z.string().min(1).optional().describe("Optional Org_ID -- required for Org_ID-gated business channels"),
20
22
  })
21
23
  .strict();
22
24
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"api-requests.js","sourceRoot":"","sources":["../../src/schemas/api-requests.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-requests.js","sourceRoot":"","sources":["../../src/schemas/api-requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Map an agent label to an emoji for the Slack bot icon.
3
+ * Backend/server agents get gear, frontend get palette, etc.
4
+ */
5
+ export declare function getAgentEmoji(label: string): string;
6
+ /**
7
+ * Human-readable platform name for the Slack sender-attribution tag, e.g.
8
+ * "(via Codex)". Unknown/absent platform falls back to "CC" -- pre-3.3 peers
9
+ * had no platform field and were all Claude Code.
10
+ */
11
+ export declare function platformLabel(platform?: string): string;
12
+ //# sourceMappingURL=attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/slack-format/attribution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAcvD"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Map an agent label to an emoji for the Slack bot icon.
3
+ * Backend/server agents get gear, frontend get palette, etc.
4
+ */
5
+ export function getAgentEmoji(label) {
6
+ const lower = label.toLowerCase();
7
+ if (lower.includes("backend") || lower.includes("server"))
8
+ return ":gear:";
9
+ if (lower.includes("frontend") || lower.includes("ui") || lower.includes("ux"))
10
+ return ":art:";
11
+ if (lower.includes("qa") || lower.includes("test") || lower.includes("quality"))
12
+ return ":mag:";
13
+ if (lower.includes("devops") || lower.includes("infra") || lower.includes("deploy"))
14
+ return ":rocket:";
15
+ return ":robot_face:";
16
+ }
17
+ /**
18
+ * Human-readable platform name for the Slack sender-attribution tag, e.g.
19
+ * "(via Codex)". Unknown/absent platform falls back to "CC" -- pre-3.3 peers
20
+ * had no platform field and were all Claude Code.
21
+ */
22
+ export function platformLabel(platform) {
23
+ switch (platform) {
24
+ case "codex":
25
+ return "Codex";
26
+ case "slack":
27
+ return "Slack";
28
+ case "gchat":
29
+ return "Google Chat";
30
+ case "web":
31
+ return "Web";
32
+ case "cc":
33
+ default:
34
+ return "CC";
35
+ }
36
+ }
37
+ //# sourceMappingURL=attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../src/slack-format/attribution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3E,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/F,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,OAAO,CAAC;IAChG,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,UAAU,CAAC;IACvG,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAiB;IAC7C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,aAAa,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,IAAI,CAAC;QACV;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { slackToMarkdown } from "./slack-to-md.js";
2
+ export { markdownToSlack } from "./md-to-slack.js";
3
+ export { extractUserIds, resolveInboundMentions, resolveOutboundMentions } from "./mentions.js";
4
+ export { getAgentEmoji, platformLabel } from "./attribution.js";
5
+ export { derivePeerId, buildPeerLabel } from "./peer-helpers.js";
6
+ export type { UserLookup, CachedUser } from "./types.js";
7
+ export type { PlatformUserInfo } from "./peer-helpers.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/slack-format/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { slackToMarkdown } from "./slack-to-md.js";
2
+ export { markdownToSlack } from "./md-to-slack.js";
3
+ export { extractUserIds, resolveInboundMentions, resolveOutboundMentions } from "./mentions.js";
4
+ export { getAgentEmoji, platformLabel } from "./attribution.js";
5
+ export { derivePeerId, buildPeerLabel } from "./peer-helpers.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/slack-format/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { UserLookup } from "./types.js";
2
+ /**
3
+ * Convert standard Markdown to Slack mrkdwn format.
4
+ * Uses slackify-markdown (AST-based, remark/unified) for reliable conversion.
5
+ *
6
+ * Key transformations:
7
+ * - **bold** -> *bold* (asterisk count swap)
8
+ * - *italic* -> _italic_ (asterisk to underscore)
9
+ * - [text](url) -> <url|text>
10
+ * - # Header -> *Header* (bold, since mrkdwn has no headers)
11
+ * - ~~strike~~ -> ~strike~
12
+ * - Code blocks and inline code preserved
13
+ *
14
+ * When `users` is provided, @Name mentions are resolved to <@userId>.
15
+ * When omitted, mentions are left as-is (backward compatible).
16
+ *
17
+ * The library adds a trailing newline; we trim it for clean output.
18
+ */
19
+ export declare function markdownToSlack(text: string, users?: UserLookup): string;
20
+ //# sourceMappingURL=md-to-slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-to-slack.d.ts","sourceRoot":"","sources":["../../src/slack-format/md-to-slack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CASxE"}
@@ -0,0 +1,28 @@
1
+ import { slackifyMarkdown } from "slackify-markdown";
2
+ import { resolveOutboundMentions } from "./mentions.js";
3
+ /**
4
+ * Convert standard Markdown to Slack mrkdwn format.
5
+ * Uses slackify-markdown (AST-based, remark/unified) for reliable conversion.
6
+ *
7
+ * Key transformations:
8
+ * - **bold** -> *bold* (asterisk count swap)
9
+ * - *italic* -> _italic_ (asterisk to underscore)
10
+ * - [text](url) -> <url|text>
11
+ * - # Header -> *Header* (bold, since mrkdwn has no headers)
12
+ * - ~~strike~~ -> ~strike~
13
+ * - Code blocks and inline code preserved
14
+ *
15
+ * When `users` is provided, @Name mentions are resolved to <@userId>.
16
+ * When omitted, mentions are left as-is (backward compatible).
17
+ *
18
+ * The library adds a trailing newline; we trim it for clean output.
19
+ */
20
+ export function markdownToSlack(text, users) {
21
+ let result = slackifyMarkdown(text).replace(/\n$/, "");
22
+ // Resolve outbound @Name mentions to <@userId> if lookup available
23
+ if (users) {
24
+ result = resolveOutboundMentions(result, users);
25
+ }
26
+ return result;
27
+ }
28
+ //# sourceMappingURL=md-to-slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-to-slack.js","sourceRoot":"","sources":["../../src/slack-format/md-to-slack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAkB;IAC9D,IAAI,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEvD,mEAAmE;IACnE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { UserLookup } from "./types.js";
2
+ /**
3
+ * Extract unique Slack user IDs from a message body.
4
+ * Used to pre-warm a user cache before sync resolution.
5
+ */
6
+ export declare function extractUserIds(text: string): string[];
7
+ /**
8
+ * Resolve inbound Slack <@userId> mentions to readable @DisplayName.
9
+ * Synchronous -- only resolves users already in the lookup.
10
+ * Unknown user IDs are left as <@UXXXX>.
11
+ */
12
+ export declare function resolveInboundMentions(text: string, users: UserLookup): string;
13
+ /**
14
+ * Resolve outbound @Name mentions to Slack <@userId> format.
15
+ * Synchronous -- only resolves names already in the lookup.
16
+ * Protects code blocks (``` and `) from resolution.
17
+ * Does NOT touch @here, @channel, @everyone (those are Slack special mentions).
18
+ * Unknown names are left as @Name.
19
+ */
20
+ export declare function resolveOutboundMentions(text: string, users: UserLookup): string;
21
+ //# sourceMappingURL=mentions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../src/slack-format/mentions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMrD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAU9E;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CA+D/E"}
@@ -0,0 +1,93 @@
1
+ /** Slack user-ID regex used by both extraction and resolution. */
2
+ const USER_ID_RE = /<@(U[A-Z0-9]+)>/g;
3
+ /**
4
+ * Extract unique Slack user IDs from a message body.
5
+ * Used to pre-warm a user cache before sync resolution.
6
+ */
7
+ export function extractUserIds(text) {
8
+ const ids = new Set();
9
+ for (const match of text.matchAll(USER_ID_RE)) {
10
+ ids.add(match[1]);
11
+ }
12
+ return [...ids];
13
+ }
14
+ /**
15
+ * Resolve inbound Slack <@userId> mentions to readable @DisplayName.
16
+ * Synchronous -- only resolves users already in the lookup.
17
+ * Unknown user IDs are left as <@UXXXX>.
18
+ */
19
+ export function resolveInboundMentions(text, users) {
20
+ const allUsers = users.getAllCached();
21
+ return text.replace(USER_ID_RE, (_match, userId) => {
22
+ const user = allUsers.get(userId);
23
+ if (user) {
24
+ return `@${user.displayName}`;
25
+ }
26
+ return `<@${userId}>`;
27
+ });
28
+ }
29
+ /**
30
+ * Resolve outbound @Name mentions to Slack <@userId> format.
31
+ * Synchronous -- only resolves names already in the lookup.
32
+ * Protects code blocks (``` and `) from resolution.
33
+ * Does NOT touch @here, @channel, @everyone (those are Slack special mentions).
34
+ * Unknown names are left as @Name.
35
+ */
36
+ export function resolveOutboundMentions(text, users) {
37
+ // Placeholders use \x00 (null) delimiters to avoid matching mention regex
38
+ const BLOCK_PREFIX = "\x00MB";
39
+ const SPAN_PREFIX = "\x00MS";
40
+ const SUFFIX = "\x00";
41
+ // 1. Extract code blocks to protect from resolution
42
+ const codeBlocks = [];
43
+ let result = text.replace(/```[\s\S]*?```/g, (match) => {
44
+ codeBlocks.push(match);
45
+ return `${BLOCK_PREFIX}${codeBlocks.length - 1}${SUFFIX}`;
46
+ });
47
+ // 2. Extract inline code spans to protect from resolution
48
+ const codeSpans = [];
49
+ result = result.replace(/`[^`]+`/g, (match) => {
50
+ codeSpans.push(match);
51
+ return `${SPAN_PREFIX}${codeSpans.length - 1}${SUFFIX}`;
52
+ });
53
+ // 3. Resolve @mentions to <@userId>
54
+ // Build a map of all known names -> userId (longest names first to avoid partial matches)
55
+ const allUsers = users.getAllCached();
56
+ const nameToUserId = new Map();
57
+ for (const [userId, user] of allUsers) {
58
+ if (user.displayName)
59
+ nameToUserId.set(user.displayName.toLowerCase(), userId);
60
+ if (user.realName)
61
+ nameToUserId.set(user.realName.toLowerCase(), userId);
62
+ // First name from realName
63
+ const firstName = user.realName.split(" ")[0];
64
+ if (firstName && !nameToUserId.has(firstName.toLowerCase())) {
65
+ nameToUserId.set(firstName.toLowerCase(), userId);
66
+ }
67
+ }
68
+ // Sort known names by length descending so "Jane D." matches before "Jane"
69
+ const sortedNames = [...nameToUserId.keys()].sort((a, b) => b.length - a.length);
70
+ // For each known name, replace @Name with <@userId>
71
+ for (const lowerName of sortedNames) {
72
+ const userId = nameToUserId.get(lowerName);
73
+ // Build regex that matches @Name at word boundary (case-insensitive)
74
+ // Escape regex special chars in the name
75
+ const escaped = lowerName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
76
+ const re = new RegExp(`@(${escaped})(?=[\\s,.:;!?)"'\\]]|$)`, "gi");
77
+ result = result.replace(re, (_match, _name) => {
78
+ return `<@${userId}>`;
79
+ });
80
+ }
81
+ // Leave unresolved @mentions as-is (they don't match any known name)
82
+ // @here, @channel, @everyone are never in the cache, so they pass through untouched
83
+ // 4. Restore inline code spans (reverse order to preserve indices)
84
+ for (let i = codeSpans.length - 1; i >= 0; i--) {
85
+ result = result.replace(`${SPAN_PREFIX}${i}${SUFFIX}`, codeSpans[i]);
86
+ }
87
+ // 5. Restore code blocks (reverse order to preserve indices)
88
+ for (let i = codeBlocks.length - 1; i >= 0; i--) {
89
+ result = result.replace(`${BLOCK_PREFIX}${i}${SUFFIX}`, codeBlocks[i]);
90
+ }
91
+ return result;
92
+ }
93
+ //# sourceMappingURL=mentions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../src/slack-format/mentions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Minimal user shape needed to build a peer label. The Slack adapter's
3
+ * richer `SlackUserInfo` (displayName + title + more) satisfies this
4
+ * structurally.
5
+ */
6
+ export interface PlatformUserInfo {
7
+ displayName: string;
8
+ title?: string;
9
+ }
10
+ /**
11
+ * Derive a COGENT peerId from a Slack display name.
12
+ * "Pavlo S." -> "pavlo-s"
13
+ * "John Doe" -> "john-doe"
14
+ */
15
+ export declare function derivePeerId(displayName: string): string;
16
+ /**
17
+ * Build a peer label from user info.
18
+ * Includes profile title when available: "Pavlo S. (PM)"
19
+ * Falls back to just display name: "Pavlo S."
20
+ */
21
+ export declare function buildPeerLabel(user: PlatformUserInfo): string;
22
+ //# sourceMappingURL=peer-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-helpers.d.ts","sourceRoot":"","sources":["../../src/slack-format/peer-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAK7D"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Derive a COGENT peerId from a Slack display name.
3
+ * "Pavlo S." -> "pavlo-s"
4
+ * "John Doe" -> "john-doe"
5
+ */
6
+ export function derivePeerId(displayName) {
7
+ return displayName
8
+ .toLowerCase()
9
+ .replace(/[^a-z0-9]+/g, "-")
10
+ .replace(/^-|-$/g, "");
11
+ }
12
+ /**
13
+ * Build a peer label from user info.
14
+ * Includes profile title when available: "Pavlo S. (PM)"
15
+ * Falls back to just display name: "Pavlo S."
16
+ */
17
+ export function buildPeerLabel(user) {
18
+ if (user.title) {
19
+ return `${user.displayName} (${user.title})`;
20
+ }
21
+ return user.displayName;
22
+ }
23
+ //# sourceMappingURL=peer-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-helpers.js","sourceRoot":"","sources":["../../src/slack-format/peer-helpers.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,WAAW;SACf,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAsB;IACnD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC,WAAW,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { UserLookup } from "./types.js";
2
+ /**
3
+ * Convert Slack mrkdwn to standard Markdown.
4
+ * Custom lightweight regex-based converter for inbound messages.
5
+ *
6
+ * Key difference: *text* is BOLD in mrkdwn but ITALIC in markdown.
7
+ * This converter handles the swap correctly:
8
+ * Slack *bold* -> Markdown **bold**
9
+ * Slack _italic_ -> Markdown *italic*
10
+ *
11
+ * Code blocks and inline code are extracted before transformation
12
+ * and restored after, preventing false matches inside code.
13
+ *
14
+ * When `users` is provided, <@U123ABC> mentions are resolved to @DisplayName.
15
+ * When omitted, user mentions are preserved as-is (backward compatible).
16
+ */
17
+ export declare function slackToMarkdown(text: string, users?: UserLookup): string;
18
+ //# sourceMappingURL=slack-to-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-to-md.d.ts","sourceRoot":"","sources":["../../src/slack-format/slack-to-md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CA6DxE"}
@@ -0,0 +1,66 @@
1
+ import { resolveInboundMentions } from "./mentions.js";
2
+ /**
3
+ * Convert Slack mrkdwn to standard Markdown.
4
+ * Custom lightweight regex-based converter for inbound messages.
5
+ *
6
+ * Key difference: *text* is BOLD in mrkdwn but ITALIC in markdown.
7
+ * This converter handles the swap correctly:
8
+ * Slack *bold* -> Markdown **bold**
9
+ * Slack _italic_ -> Markdown *italic*
10
+ *
11
+ * Code blocks and inline code are extracted before transformation
12
+ * and restored after, preventing false matches inside code.
13
+ *
14
+ * When `users` is provided, <@U123ABC> mentions are resolved to @DisplayName.
15
+ * When omitted, user mentions are preserved as-is (backward compatible).
16
+ */
17
+ export function slackToMarkdown(text, users) {
18
+ // Placeholders use \x00 (null) delimiters to avoid matching formatting regex
19
+ // (no underscores, asterisks, or tildes in placeholders)
20
+ const BLOCK_PREFIX = "\x00CB";
21
+ const SPAN_PREFIX = "\x00CS";
22
+ const SUFFIX = "\x00";
23
+ // 1. Extract code blocks to protect from transformation
24
+ const codeBlocks = [];
25
+ let result = text.replace(/```[\s\S]*?```/g, (match) => {
26
+ codeBlocks.push(match);
27
+ return `${BLOCK_PREFIX}${codeBlocks.length - 1}${SUFFIX}`;
28
+ });
29
+ // 2. Extract inline code spans to protect from transformation
30
+ const codeSpans = [];
31
+ result = result.replace(/`[^`]+`/g, (match) => {
32
+ codeSpans.push(match);
33
+ return `${SPAN_PREFIX}${codeSpans.length - 1}${SUFFIX}`;
34
+ });
35
+ // 3. Convert Slack bold *text* to Markdown **text**
36
+ // Negative lookbehind for backslash prevents escaped asterisks
37
+ result = result.replace(/(?<![\\])\*([^*\n]+)\*/g, "**$1**");
38
+ // 4. Convert Slack italic _text_ to Markdown *text*
39
+ result = result.replace(/(?<![\\])_([^_\n]+)_/g, "*$1*");
40
+ // 5. Convert Slack strikethrough ~text~ to Markdown ~~text~~
41
+ result = result.replace(/(?<![\\])~([^~\n]+)~/g, "~~$1~~");
42
+ // 6. Convert Slack links <url|text> to Markdown [text](url)
43
+ result = result.replace(/<(https?:\/\/[^|>]+)\|([^>]+)>/g, "[$2]($1)");
44
+ // 7. Convert bare Slack links <url> to Markdown [url](url)
45
+ result = result.replace(/<(https?:\/\/[^>]+)>/g, "[$1]($1)");
46
+ // 8. Convert channel references <#C123|name> to #name
47
+ result = result.replace(/<#C[A-Z0-9]+\|([^>]+)>/g, "#$1");
48
+ // 9. Convert special mentions
49
+ result = result.replace(/<!here>/g, "@here");
50
+ result = result.replace(/<!channel>/g, "@channel");
51
+ result = result.replace(/<!everyone>/g, "@everyone");
52
+ // 10. Resolve user mentions <@U04ABC> to @DisplayName (if lookup provided)
53
+ if (users) {
54
+ result = resolveInboundMentions(result, users);
55
+ }
56
+ // 11. Restore inline code spans (reverse order to preserve indices)
57
+ for (let i = codeSpans.length - 1; i >= 0; i--) {
58
+ result = result.replace(`${SPAN_PREFIX}${i}${SUFFIX}`, codeSpans[i]);
59
+ }
60
+ // 12. Restore code blocks (reverse order to preserve indices)
61
+ for (let i = codeBlocks.length - 1; i >= 0; i--) {
62
+ result = result.replace(`${BLOCK_PREFIX}${i}${SUFFIX}`, codeBlocks[i]);
63
+ }
64
+ return result;
65
+ }
66
+ //# sourceMappingURL=slack-to-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-to-md.js","sourceRoot":"","sources":["../../src/slack-format/slack-to-md.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAkB;IAC9D,6EAA6E;IAC7E,yDAAyD;IACzD,MAAM,YAAY,GAAG,QAAQ,CAAC;IAC9B,MAAM,WAAW,GAAG,QAAQ,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC;IAEtB,wDAAwD;IACxD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE;QACrD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,8DAA8D;IAC9D,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5C,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,kEAAkE;IAClE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;IAE7D,oDAAoD;IACpD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IAEzD,6DAA6D;IAC7D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;IAE3D,4DAA4D;IAC5D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iCAAiC,EAAE,UAAU,CAAC,CAAC;IAEvE,2DAA2D;IAC3D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;IAE7D,sDAAsD;IACtD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAE1D,8BAA8B;IAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAErD,2EAA2E;IAC3E,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,oEAAoE;IACpE,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,CAAC,GAAG,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,8DAA8D;IAC9D,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Read-only view over a Slack user cache, consumed by the pure mention
3
+ * resolvers in this module. This decouples core translation from the Slack
4
+ * adapter's Bolt-bound `UserCache` (which makes live API calls).
5
+ *
6
+ * `ReadonlyMap` is covariant in its value type, so a concrete
7
+ * `Map<string, SlackUserInfo>` (the adapter's cache shape, which has extra
8
+ * fields) satisfies `UserLookup` structurally with no adapter changes.
9
+ */
10
+ export interface CachedUser {
11
+ displayName: string;
12
+ realName: string;
13
+ }
14
+ export interface UserLookup {
15
+ getAllCached(): ReadonlyMap<string, CachedUser>;
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/slack-format/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/slack-format/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@essentialai/cogent",
3
- "version": "3.1.0",
3
+ "version": "3.4.0",
4
4
  "description": "Shared types, schemas, and contracts for Cogent Bridge",
5
5
  "type": "module",
6
6
  "exports": {
@@ -11,6 +11,14 @@
11
11
  "./file": {
12
12
  "types": "./dist/file/index.d.ts",
13
13
  "default": "./dist/file/index.js"
14
+ },
15
+ "./slack-format": {
16
+ "types": "./dist/slack-format/index.d.ts",
17
+ "default": "./dist/slack-format/index.js"
18
+ },
19
+ "./auth": {
20
+ "types": "./dist/auth/index.d.ts",
21
+ "default": "./dist/auth/index.js"
14
22
  }
15
23
  },
16
24
  "files": [
@@ -27,6 +35,10 @@
27
35
  "prepublishOnly": "npm run clean && npm run build && npm test",
28
36
  "check-exports": "attw --pack"
29
37
  },
38
+ "dependencies": {
39
+ "bcryptjs": "^3.0.3",
40
+ "slackify-markdown": "^5.0.0"
41
+ },
30
42
  "peerDependencies": {
31
43
  "zod": "^3.25.0 || ^4.0.0"
32
44
  },