@getstrata/core 0.5.64 → 0.5.65

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # @getstrata/core changelog
2
2
 
3
+ ## 0.5.65
4
+
5
+ - Identity helpers on `@getstrata/core/runtime/appKeyPrefix` (`smtpEhloHost`, `siemEventType`, `appUserAgent`, `otelServiceName`, `appDisplayName`, `webhookSignatureHeader`) so sibling apps are not stuck with WorkHub SMTP/SIEM/OTEL/OAuth names.
6
+ - SIEM `event_type` and CEF vendor follow `SIEM_EVENT_TYPE` / `APP_NAME` (defaults stay `workhub.audit` / `WorkHub`).
7
+
3
8
  ## 0.5.64
4
9
 
5
10
  - `APP_KEY_PREFIX` (default `workhub`) namespaces Redis cache, queue, and throttle keys so sibling apps do not share WorkHub’s keyspace.
package/README.md CHANGED
@@ -82,7 +82,7 @@ import type { Migration } from "@getstrata/core/database/migrations/types";
82
82
  Package name: **`@getstrata/core`** (npm org [`@getstrata`](https://www.npmjs.com/org/getstrata)).
83
83
 
84
84
  1. Add `NPM_TOKEN` to GitHub repository secrets.
85
- 2. Tag a release: `git tag v0.5.66 && git push origin v0.5.66`
85
+ 2. Tag a release: `git tag v0.5.67 && git push origin v0.5.67`
86
86
  3. [Release workflow](../../.github/workflows/release.yml) builds and runs `npm publish --access public`.
87
87
 
88
88
  Previously published as `@eyk-workhub/framework@0.1.0`, deprecated in favor of this package.
@@ -1,3 +1,9 @@
1
1
  declare function appKeyPrefix(): string;
2
2
  declare function namespacedRedisKey(kind: string): string;
3
- export { appKeyPrefix, namespacedRedisKey };
3
+ declare function smtpEhloHost(): string;
4
+ declare function siemEventType(): string;
5
+ declare function appUserAgent(): string;
6
+ declare function otelServiceName(): string;
7
+ declare function webhookSignatureHeader(): string;
8
+ declare function appDisplayName(): string;
9
+ export { appDisplayName, appKeyPrefix, appUserAgent, namespacedRedisKey, otelServiceName, siemEventType, smtpEhloHost, webhookSignatureHeader, };
@@ -153,11 +153,39 @@ async function runWithMigrationBypass(callback) {
153
153
  }
154
154
  }
155
155
 
156
+ // ../../src/core/runtime/appKeyPrefix.ts
157
+ function appKeyPrefix() {
158
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
159
+ }
160
+ function namespacedRedisKey(kind) {
161
+ return `${appKeyPrefix()}:${kind}`;
162
+ }
163
+ function smtpEhloHost() {
164
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
165
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
166
+ return safe || "strata.local";
167
+ }
168
+ function siemEventType() {
169
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
170
+ }
171
+ function appUserAgent() {
172
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
173
+ }
174
+ function otelServiceName() {
175
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
176
+ }
177
+ function webhookSignatureHeader() {
178
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
179
+ }
180
+ function appDisplayName() {
181
+ return process.env.APP_NAME?.trim() || "WorkHub";
182
+ }
183
+
156
184
  // ../../src/core/audit/siemFormatter.ts
157
185
  function formatSiemAuditEvent(input) {
158
186
  return {
159
187
  timestamp: input.created_at.toISOString(),
160
- event_type: "workhub.audit",
188
+ event_type: siemEventType(),
161
189
  actor_user_id: input.user_id,
162
190
  tenant_id: input.tenant_id ?? null,
163
191
  trace_id: input.trace_id ?? null,
@@ -183,7 +211,7 @@ function formatCefLine(event) {
183
211
  `src=${event.ip_address ?? ""}`,
184
212
  `request=${event.trace_id ?? ""}`
185
213
  ].join(" ");
186
- return `CEF:0|WorkHub|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
214
+ return `CEF:0|${appDisplayName()}|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
187
215
  }
188
216
 
189
217
  // ../../src/core/audit/exportAuditLogs.ts
@@ -1,9 +1,37 @@
1
1
  // @bun
2
+ // ../../src/core/runtime/appKeyPrefix.ts
3
+ function appKeyPrefix() {
4
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
5
+ }
6
+ function namespacedRedisKey(kind) {
7
+ return `${appKeyPrefix()}:${kind}`;
8
+ }
9
+ function smtpEhloHost() {
10
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
11
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
12
+ return safe || "strata.local";
13
+ }
14
+ function siemEventType() {
15
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
16
+ }
17
+ function appUserAgent() {
18
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
19
+ }
20
+ function otelServiceName() {
21
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
22
+ }
23
+ function webhookSignatureHeader() {
24
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
25
+ }
26
+ function appDisplayName() {
27
+ return process.env.APP_NAME?.trim() || "WorkHub";
28
+ }
29
+
2
30
  // ../../src/core/audit/siemFormatter.ts
3
31
  function formatSiemAuditEvent(input) {
4
32
  return {
5
33
  timestamp: input.created_at.toISOString(),
6
- event_type: "workhub.audit",
34
+ event_type: siemEventType(),
7
35
  actor_user_id: input.user_id,
8
36
  tenant_id: input.tenant_id ?? null,
9
37
  trace_id: input.trace_id ?? null,
@@ -29,7 +57,7 @@ function formatCefLine(event) {
29
57
  `src=${event.ip_address ?? ""}`,
30
58
  `request=${event.trace_id ?? ""}`
31
59
  ].join(" ");
32
- return `CEF:0|WorkHub|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
60
+ return `CEF:0|${appDisplayName()}|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
33
61
  }
34
62
  export {
35
63
  formatCefLine,
@@ -1,4 +1,32 @@
1
1
  // @bun
2
+ // ../../src/core/runtime/appKeyPrefix.ts
3
+ function appKeyPrefix() {
4
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
5
+ }
6
+ function namespacedRedisKey(kind) {
7
+ return `${appKeyPrefix()}:${kind}`;
8
+ }
9
+ function smtpEhloHost() {
10
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
11
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
12
+ return safe || "strata.local";
13
+ }
14
+ function siemEventType() {
15
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
16
+ }
17
+ function appUserAgent() {
18
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
19
+ }
20
+ function otelServiceName() {
21
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
22
+ }
23
+ function webhookSignatureHeader() {
24
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
25
+ }
26
+ function appDisplayName() {
27
+ return process.env.APP_NAME?.trim() || "WorkHub";
28
+ }
29
+
2
30
  // ../../src/core/auth/oauth/providers.ts
3
31
  class GitHubOAuthProvider {
4
32
  options;
@@ -37,7 +65,7 @@ class GitHubOAuthProvider {
37
65
  headers: {
38
66
  authorization: `Bearer ${tokenBody.access_token}`,
39
67
  accept: "application/json",
40
- "user-agent": "workhub"
68
+ "user-agent": appUserAgent()
41
69
  }
42
70
  });
43
71
  const profile = await profileResponse.json();
@@ -1,4 +1,32 @@
1
1
  // @bun
2
+ // ../../src/core/runtime/appKeyPrefix.ts
3
+ function appKeyPrefix() {
4
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
5
+ }
6
+ function namespacedRedisKey(kind) {
7
+ return `${appKeyPrefix()}:${kind}`;
8
+ }
9
+ function smtpEhloHost() {
10
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
11
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
12
+ return safe || "strata.local";
13
+ }
14
+ function siemEventType() {
15
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
16
+ }
17
+ function appUserAgent() {
18
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
19
+ }
20
+ function otelServiceName() {
21
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
22
+ }
23
+ function webhookSignatureHeader() {
24
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
25
+ }
26
+ function appDisplayName() {
27
+ return process.env.APP_NAME?.trim() || "WorkHub";
28
+ }
29
+
2
30
  // ../../src/core/auth/oauth/samlProvider.ts
3
31
  class SamlProvider {
4
32
  loginUrl;
@@ -15,8 +43,8 @@ class SamlProvider {
15
43
  }
16
44
  const [, email, name] = code.split(":");
17
45
  return {
18
- providerUserId: email ?? "saml-user",
19
- email: email ?? "saml-user@workhub.test",
46
+ providerUserId: email || "saml-user",
47
+ email: email || `saml-user@${appKeyPrefix()}.test`,
20
48
  name: name ?? "SAML User"
21
49
  };
22
50
  }
@@ -9,6 +9,26 @@ function appKeyPrefix() {
9
9
  function namespacedRedisKey(kind) {
10
10
  return `${appKeyPrefix()}:${kind}`;
11
11
  }
12
+ function smtpEhloHost() {
13
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
14
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
15
+ return safe || "strata.local";
16
+ }
17
+ function siemEventType() {
18
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
19
+ }
20
+ function appUserAgent() {
21
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
22
+ }
23
+ function otelServiceName() {
24
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
25
+ }
26
+ function webhookSignatureHeader() {
27
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
28
+ }
29
+ function appDisplayName() {
30
+ return process.env.APP_NAME?.trim() || "WorkHub";
31
+ }
12
32
 
13
33
  // ../../src/core/cache/redisCacheStore.ts
14
34
  function cacheKeyPrefix() {
@@ -11,6 +11,34 @@ import {
11
11
  resolveApplicationQueue
12
12
  } from "@getstrata/core/runtime/applicationRegistry";
13
13
 
14
+ // ../../src/core/runtime/appKeyPrefix.ts
15
+ function appKeyPrefix() {
16
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
17
+ }
18
+ function namespacedRedisKey(kind) {
19
+ return `${appKeyPrefix()}:${kind}`;
20
+ }
21
+ function smtpEhloHost() {
22
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
23
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
24
+ return safe || "strata.local";
25
+ }
26
+ function siemEventType() {
27
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
28
+ }
29
+ function appUserAgent() {
30
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
31
+ }
32
+ function otelServiceName() {
33
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
34
+ }
35
+ function webhookSignatureHeader() {
36
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
37
+ }
38
+ function appDisplayName() {
39
+ return process.env.APP_NAME?.trim() || "WorkHub";
40
+ }
41
+
14
42
  // ../../src/core/mail/mailer.ts
15
43
  function resolveSmtpConfig() {
16
44
  const host = process.env.MAIL_HOST?.trim();
@@ -101,7 +129,7 @@ async function defaultSmtpTransport(config, message) {
101
129
  const { socket, readResponse } = await openSmtpConnection(config);
102
130
  try {
103
131
  await waitForSmtpResponse(readResponse, ["220"]);
104
- await socket.write(`EHLO workhub.local\r
132
+ await socket.write(`EHLO ${smtpEhloHost()}\r
105
133
  `);
106
134
  await waitForSmtpResponse(readResponse, ["250"]);
107
135
  if (config.username && config.password) {
@@ -9,6 +9,26 @@ function appKeyPrefix() {
9
9
  function namespacedRedisKey(kind) {
10
10
  return `${appKeyPrefix()}:${kind}`;
11
11
  }
12
+ function smtpEhloHost() {
13
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
14
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
15
+ return safe || "strata.local";
16
+ }
17
+ function siemEventType() {
18
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
19
+ }
20
+ function appUserAgent() {
21
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
22
+ }
23
+ function otelServiceName() {
24
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
25
+ }
26
+ function webhookSignatureHeader() {
27
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
28
+ }
29
+ function appDisplayName() {
30
+ return process.env.APP_NAME?.trim() || "WorkHub";
31
+ }
12
32
 
13
33
  // ../../src/core/http/clientIp.ts
14
34
  function trustForwardedFor(env = process.env) {
@@ -6,6 +6,26 @@ function appKeyPrefix() {
6
6
  function namespacedRedisKey(kind) {
7
7
  return `${appKeyPrefix()}:${kind}`;
8
8
  }
9
+ function smtpEhloHost() {
10
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
11
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
12
+ return safe || "strata.local";
13
+ }
14
+ function siemEventType() {
15
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
16
+ }
17
+ function appUserAgent() {
18
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
19
+ }
20
+ function otelServiceName() {
21
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
22
+ }
23
+ function webhookSignatureHeader() {
24
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
25
+ }
26
+ function appDisplayName() {
27
+ return process.env.APP_NAME?.trim() || "WorkHub";
28
+ }
9
29
 
10
30
  // ../../src/core/http/clientIp.ts
11
31
  function trustForwardedFor(env = process.env) {
@@ -9,6 +9,26 @@ function appKeyPrefix() {
9
9
  function namespacedRedisKey(kind) {
10
10
  return `${appKeyPrefix()}:${kind}`;
11
11
  }
12
+ function smtpEhloHost() {
13
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
14
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
15
+ return safe || "strata.local";
16
+ }
17
+ function siemEventType() {
18
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
19
+ }
20
+ function appUserAgent() {
21
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
22
+ }
23
+ function otelServiceName() {
24
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
25
+ }
26
+ function webhookSignatureHeader() {
27
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
28
+ }
29
+ function appDisplayName() {
30
+ return process.env.APP_NAME?.trim() || "WorkHub";
31
+ }
12
32
 
13
33
  // ../../src/core/http/clientIp.ts
14
34
  function trustForwardedFor(env = process.env) {
@@ -11,6 +11,26 @@ function appKeyPrefix() {
11
11
  function namespacedRedisKey(kind) {
12
12
  return `${appKeyPrefix()}:${kind}`;
13
13
  }
14
+ function smtpEhloHost() {
15
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
16
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
17
+ return safe || "strata.local";
18
+ }
19
+ function siemEventType() {
20
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
21
+ }
22
+ function appUserAgent() {
23
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
24
+ }
25
+ function otelServiceName() {
26
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
27
+ }
28
+ function webhookSignatureHeader() {
29
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
30
+ }
31
+ function appDisplayName() {
32
+ return process.env.APP_NAME?.trim() || "WorkHub";
33
+ }
14
34
 
15
35
  // ../../src/core/http/clientIp.ts
16
36
  function trustForwardedFor(env = process.env) {
@@ -3,6 +3,7 @@
3
3
  import { createHmac } from "crypto";
4
4
  import { repositoryConnection as db } from "@getstrata/core/database/repositoryConnection";
5
5
  import { Job } from "@getstrata/core/queue";
6
+ import { webhookSignatureHeader } from "@getstrata/core/runtime/appKeyPrefix";
6
7
  import { safeFetch } from "@getstrata/core/security/safeFetch";
7
8
  import { assertSafeOutboundUrl } from "@getstrata/core/security/safeUrl";
8
9
  import { resolveTenant } from "@getstrata/core/tenant/resolveTenant";
@@ -37,7 +38,7 @@ class DispatchWebhookJob extends Job {
37
38
  const body = JSON.stringify({ event: payload.event, payload: payload.payload });
38
39
  const signature = createHmac("sha256", webhook.secret).update(body).digest("hex");
39
40
  const allowHttp = (process.env.APP_ENV ?? "local") !== "production";
40
- const signatureHeader = process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || "x-workhub-signature";
41
+ const signatureHeader = webhookSignatureHeader();
41
42
  assertSafeOutboundUrl(webhook.url, { allowHttp });
42
43
  let responseStatus = null;
43
44
  let errorMessage = null;
@@ -153,11 +153,39 @@ async function runWithMigrationBypass(callback) {
153
153
  }
154
154
  }
155
155
 
156
+ // ../../src/core/runtime/appKeyPrefix.ts
157
+ function appKeyPrefix() {
158
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
159
+ }
160
+ function namespacedRedisKey(kind) {
161
+ return `${appKeyPrefix()}:${kind}`;
162
+ }
163
+ function smtpEhloHost() {
164
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
165
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
166
+ return safe || "strata.local";
167
+ }
168
+ function siemEventType() {
169
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
170
+ }
171
+ function appUserAgent() {
172
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
173
+ }
174
+ function otelServiceName() {
175
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
176
+ }
177
+ function webhookSignatureHeader() {
178
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
179
+ }
180
+ function appDisplayName() {
181
+ return process.env.APP_NAME?.trim() || "WorkHub";
182
+ }
183
+
156
184
  // ../../src/core/audit/siemFormatter.ts
157
185
  function formatSiemAuditEvent(input) {
158
186
  return {
159
187
  timestamp: input.created_at.toISOString(),
160
- event_type: "workhub.audit",
188
+ event_type: siemEventType(),
161
189
  actor_user_id: input.user_id,
162
190
  tenant_id: input.tenant_id ?? null,
163
191
  trace_id: input.trace_id ?? null,
@@ -183,7 +211,7 @@ function formatCefLine(event) {
183
211
  `src=${event.ip_address ?? ""}`,
184
212
  `request=${event.trace_id ?? ""}`
185
213
  ].join(" ");
186
- return `CEF:0|WorkHub|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
214
+ return `CEF:0|${appDisplayName()}|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
187
215
  }
188
216
 
189
217
  // ../../src/core/audit/exportAuditLogs.ts
@@ -1,4 +1,32 @@
1
1
  // @bun
2
+ // ../../src/core/runtime/appKeyPrefix.ts
3
+ function appKeyPrefix() {
4
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
5
+ }
6
+ function namespacedRedisKey(kind) {
7
+ return `${appKeyPrefix()}:${kind}`;
8
+ }
9
+ function smtpEhloHost() {
10
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
11
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
12
+ return safe || "strata.local";
13
+ }
14
+ function siemEventType() {
15
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
16
+ }
17
+ function appUserAgent() {
18
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
19
+ }
20
+ function otelServiceName() {
21
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
22
+ }
23
+ function webhookSignatureHeader() {
24
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
25
+ }
26
+ function appDisplayName() {
27
+ return process.env.APP_NAME?.trim() || "WorkHub";
28
+ }
29
+
2
30
  // ../../src/core/mail/mailer.ts
3
31
  function resolveSmtpConfig() {
4
32
  const host = process.env.MAIL_HOST?.trim();
@@ -89,7 +117,7 @@ async function defaultSmtpTransport(config, message) {
89
117
  const { socket, readResponse } = await openSmtpConnection(config);
90
118
  try {
91
119
  await waitForSmtpResponse(readResponse, ["220"]);
92
- await socket.write(`EHLO workhub.local\r
120
+ await socket.write(`EHLO ${smtpEhloHost()}\r
93
121
  `);
94
122
  await waitForSmtpResponse(readResponse, ["250"]);
95
123
  if (config.username && config.password) {
@@ -161,6 +161,26 @@ function appKeyPrefix() {
161
161
  function namespacedRedisKey(kind) {
162
162
  return `${appKeyPrefix()}:${kind}`;
163
163
  }
164
+ function smtpEhloHost() {
165
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
166
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
167
+ return safe || "strata.local";
168
+ }
169
+ function siemEventType() {
170
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
171
+ }
172
+ function appUserAgent() {
173
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
174
+ }
175
+ function otelServiceName() {
176
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
177
+ }
178
+ function webhookSignatureHeader() {
179
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
180
+ }
181
+ function appDisplayName() {
182
+ return process.env.APP_NAME?.trim() || "WorkHub";
183
+ }
164
184
 
165
185
  // ../../src/core/queue/redisQueue.ts
166
186
  function queueListKey() {
@@ -161,6 +161,26 @@ function appKeyPrefix() {
161
161
  function namespacedRedisKey(kind) {
162
162
  return `${appKeyPrefix()}:${kind}`;
163
163
  }
164
+ function smtpEhloHost() {
165
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
166
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
167
+ return safe || "strata.local";
168
+ }
169
+ function siemEventType() {
170
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
171
+ }
172
+ function appUserAgent() {
173
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
174
+ }
175
+ function otelServiceName() {
176
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
177
+ }
178
+ function webhookSignatureHeader() {
179
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
180
+ }
181
+ function appDisplayName() {
182
+ return process.env.APP_NAME?.trim() || "WorkHub";
183
+ }
164
184
 
165
185
  // ../../src/core/queue/redisQueue.ts
166
186
  function queueListKey() {
@@ -164,6 +164,26 @@ function appKeyPrefix() {
164
164
  function namespacedRedisKey(kind) {
165
165
  return `${appKeyPrefix()}:${kind}`;
166
166
  }
167
+ function smtpEhloHost() {
168
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
169
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
170
+ return safe || "strata.local";
171
+ }
172
+ function siemEventType() {
173
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
174
+ }
175
+ function appUserAgent() {
176
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
177
+ }
178
+ function otelServiceName() {
179
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
180
+ }
181
+ function webhookSignatureHeader() {
182
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
183
+ }
184
+ function appDisplayName() {
185
+ return process.env.APP_NAME?.trim() || "WorkHub";
186
+ }
167
187
 
168
188
  // ../../src/core/queue/redisQueue.ts
169
189
  function queueListKey() {
@@ -9,6 +9,26 @@ function appKeyPrefix() {
9
9
  function namespacedRedisKey(kind) {
10
10
  return `${appKeyPrefix()}:${kind}`;
11
11
  }
12
+ function smtpEhloHost() {
13
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
14
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
15
+ return safe || "strata.local";
16
+ }
17
+ function siemEventType() {
18
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
19
+ }
20
+ function appUserAgent() {
21
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
22
+ }
23
+ function otelServiceName() {
24
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
25
+ }
26
+ function webhookSignatureHeader() {
27
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
28
+ }
29
+ function appDisplayName() {
30
+ return process.env.APP_NAME?.trim() || "WorkHub";
31
+ }
12
32
 
13
33
  // ../../src/core/queue/jobRegistry.ts
14
34
  class JobRegistry {
@@ -0,0 +1,38 @@
1
+ // @bun
2
+ // ../../src/core/runtime/appKeyPrefix.ts
3
+ function appKeyPrefix() {
4
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
5
+ }
6
+ function namespacedRedisKey(kind) {
7
+ return `${appKeyPrefix()}:${kind}`;
8
+ }
9
+ function smtpEhloHost() {
10
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
11
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
12
+ return safe || "strata.local";
13
+ }
14
+ function siemEventType() {
15
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
16
+ }
17
+ function appUserAgent() {
18
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
19
+ }
20
+ function otelServiceName() {
21
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
22
+ }
23
+ function webhookSignatureHeader() {
24
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
25
+ }
26
+ function appDisplayName() {
27
+ return process.env.APP_NAME?.trim() || "WorkHub";
28
+ }
29
+ export {
30
+ appDisplayName,
31
+ appKeyPrefix,
32
+ appUserAgent,
33
+ namespacedRedisKey,
34
+ otelServiceName,
35
+ siemEventType,
36
+ smtpEhloHost,
37
+ webhookSignatureHeader
38
+ };
@@ -1,6 +1,36 @@
1
1
  // @bun
2
2
  // ../../src/core/tracing/otel.ts
3
3
  import { randomBytes } from "crypto";
4
+
5
+ // ../../src/core/runtime/appKeyPrefix.ts
6
+ function appKeyPrefix() {
7
+ return process.env.APP_KEY_PREFIX?.trim() || "workhub";
8
+ }
9
+ function namespacedRedisKey(kind) {
10
+ return `${appKeyPrefix()}:${kind}`;
11
+ }
12
+ function smtpEhloHost() {
13
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
14
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
15
+ return safe || "strata.local";
16
+ }
17
+ function siemEventType() {
18
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
19
+ }
20
+ function appUserAgent() {
21
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
22
+ }
23
+ function otelServiceName() {
24
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
25
+ }
26
+ function webhookSignatureHeader() {
27
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
28
+ }
29
+ function appDisplayName() {
30
+ return process.env.APP_NAME?.trim() || "WorkHub";
31
+ }
32
+
33
+ // ../../src/core/tracing/otel.ts
4
34
  function randomHex(bytes) {
5
35
  return randomBytes(bytes).toString("hex");
6
36
  }
@@ -24,7 +54,7 @@ async function exportOtelSpan(span) {
24
54
  if (!endpoint) {
25
55
  return;
26
56
  }
27
- const serviceName = process.env.OTEL_SERVICE_NAME?.trim() ?? "workhub-api";
57
+ const serviceName = otelServiceName();
28
58
  const url = endpoint.endsWith("/v1/traces") ? endpoint : `${endpoint.replace(/\/$/, "")}/v1/traces`;
29
59
  await fetch(url, {
30
60
  method: "POST",
package/dist/index.js CHANGED
@@ -974,6 +974,14 @@ function appKeyPrefix() {
974
974
  function namespacedRedisKey(kind) {
975
975
  return `${appKeyPrefix()}:${kind}`;
976
976
  }
977
+ function smtpEhloHost() {
978
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
979
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
980
+ return safe || "strata.local";
981
+ }
982
+ function otelServiceName() {
983
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
984
+ }
977
985
 
978
986
  // ../../src/core/cache/redisCacheStore.ts
979
987
  function cacheKeyPrefix() {
@@ -3894,7 +3902,7 @@ async function defaultSmtpTransport(config, message) {
3894
3902
  const { socket, readResponse } = await openSmtpConnection(config);
3895
3903
  try {
3896
3904
  await waitForSmtpResponse(readResponse, ["220"]);
3897
- await socket.write(`EHLO workhub.local\r
3905
+ await socket.write(`EHLO ${smtpEhloHost()}\r
3898
3906
  `);
3899
3907
  await waitForSmtpResponse(readResponse, ["250"]);
3900
3908
  if (config.username && config.password) {
@@ -6693,7 +6701,7 @@ async function exportOtelSpan(span) {
6693
6701
  if (!endpoint) {
6694
6702
  return;
6695
6703
  }
6696
- const serviceName = process.env.OTEL_SERVICE_NAME?.trim() ?? "workhub-api";
6704
+ const serviceName = otelServiceName();
6697
6705
  const url = endpoint.endsWith("/v1/traces") ? endpoint : `${endpoint.replace(/\/$/, "")}/v1/traces`;
6698
6706
  await fetch(url, {
6699
6707
  method: "POST",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "0.5.64",
3
+ "version": "0.5.65",
4
4
  "description": "Strata — Laravel-inspired Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -665,6 +665,11 @@
665
665
  "import": "./dist/entries/queue/types.js",
666
666
  "default": "./dist/entries/queue/types.js"
667
667
  },
668
+ "./runtime/appKeyPrefix": {
669
+ "types": "./dist/core/runtime/appKeyPrefix.d.ts",
670
+ "import": "./dist/entries/runtime/appKeyPrefix.js",
671
+ "default": "./dist/entries/runtime/appKeyPrefix.js"
672
+ },
668
673
  "./runtime/applicationRegistry": {
669
674
  "types": "./dist/core/runtime/applicationRegistry.d.ts",
670
675
  "import": "./dist/entries/runtime/applicationRegistry.js",
@@ -803,7 +808,7 @@
803
808
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
804
809
  "build:types": "tsc -p tsconfig.types.json",
805
810
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
806
- "build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/membershipMiddleware.ts entries/auth/membershipScope.ts entries/auth/membershipService.ts entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/policy.ts entries/auth/scimAuthMiddleware.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/audit/siemFormatter.ts entries/admin/formatValue.ts entries/admin/registry.ts entries/admin/types.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/errors.ts entries/database/factory.ts entries/database/migrations.ts entries/database/migrations/types.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/repositoryQuery.ts entries/database/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/table.ts entries/database/types.ts entries/database/whereBuilder.ts entries/facades.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/clientIp.ts entries/http/cookies.ts entries/http/contentNegotiation.ts entries/http/conditionalResponse.ts entries/http/corsMiddleware.ts entries/http/csrfMiddleware.ts entries/http/csrfProtection.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/flashMiddleware.ts entries/http/formRequest.ts entries/http/metricsMiddleware.ts entries/http/loginThrottleMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/validation.ts entries/jobs/dispatchWebhookJob.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
811
+ "build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/membershipMiddleware.ts entries/auth/membershipScope.ts entries/auth/membershipService.ts entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/policy.ts entries/auth/scimAuthMiddleware.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/audit/siemFormatter.ts entries/admin/formatValue.ts entries/admin/registry.ts entries/admin/types.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/errors.ts entries/database/factory.ts entries/database/migrations.ts entries/database/migrations/types.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/repositoryQuery.ts entries/database/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/table.ts entries/database/types.ts entries/database/whereBuilder.ts entries/facades.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/clientIp.ts entries/http/cookies.ts entries/http/contentNegotiation.ts entries/http/conditionalResponse.ts entries/http/corsMiddleware.ts entries/http/csrfMiddleware.ts entries/http/csrfProtection.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/flashMiddleware.ts entries/http/formRequest.ts entries/http/metricsMiddleware.ts entries/http/loginThrottleMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/validation.ts entries/jobs/dispatchWebhookJob.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/appKeyPrefix.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
807
812
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
808
813
  },
809
814
  "publishConfig": {