@raybase/core 0.0.2 → 0.3.3
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/LICENSE +21 -0
- package/dist/.admin-build/AdminApp.css +2 -0
- package/dist/.admin-build/AdminApp.js +77 -0
- package/dist/.admin-docs-build/AdminDocsApp.css +2 -0
- package/dist/.admin-docs-build/AdminDocsApp.js +45 -0
- package/dist/actions.d.ts +347 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +661 -0
- package/dist/actions.js.map +1 -0
- package/dist/admin-assets/admin.7738f50720a8ed7b.css +2 -0
- package/dist/admin-assets/admin.8678cb61db34dc81.js +77 -0
- package/dist/admin-boot.d.ts +94 -0
- package/dist/admin-boot.d.ts.map +1 -0
- package/dist/admin-boot.js +139 -0
- package/dist/admin-boot.js.map +1 -0
- package/dist/admin-docs-content.d.ts +95 -0
- package/dist/admin-docs-content.d.ts.map +1 -0
- package/dist/admin-docs-content.js +463 -0
- package/dist/admin-docs-content.js.map +1 -0
- package/dist/admin-docs-ui.d.ts +11 -0
- package/dist/admin-docs-ui.d.ts.map +1 -0
- package/dist/admin-docs-ui.js +23 -0
- package/dist/admin-docs-ui.js.map +1 -0
- package/dist/admin-kit.d.ts +29 -0
- package/dist/admin-kit.js +1557 -0
- package/dist/admin-role.d.ts +8 -0
- package/dist/admin-role.d.ts.map +1 -0
- package/dist/admin-role.js +22 -0
- package/dist/admin-role.js.map +1 -0
- package/dist/admin-ui.d.ts +3 -0
- package/dist/admin-ui.d.ts.map +1 -0
- package/dist/admin-ui.js +16 -0
- package/dist/admin-ui.js.map +1 -0
- package/dist/agent-ai-chat.d.ts +127 -0
- package/dist/agent-ai-chat.d.ts.map +1 -0
- package/dist/agent-ai-chat.js +5975 -0
- package/dist/agent-ai-chat.js.map +1 -0
- package/dist/agent-chapter-archive.d.ts +214 -0
- package/dist/agent-chapter-archive.d.ts.map +1 -0
- package/dist/agent-chapter-archive.js +696 -0
- package/dist/agent-chapter-archive.js.map +1 -0
- package/dist/agent-chapter-search.d.ts +116 -0
- package/dist/agent-chapter-search.d.ts.map +1 -0
- package/dist/agent-chapter-search.js +605 -0
- package/dist/agent-chapter-search.js.map +1 -0
- package/dist/agent-chapter-tools.d.ts +45 -0
- package/dist/agent-chapter-tools.d.ts.map +1 -0
- package/dist/agent-chapter-tools.js +344 -0
- package/dist/agent-chapter-tools.js.map +1 -0
- package/dist/agent-chapters.d.ts +228 -0
- package/dist/agent-chapters.d.ts.map +1 -0
- package/dist/agent-chapters.js +737 -0
- package/dist/agent-chapters.js.map +1 -0
- package/dist/agent-data-parts.d.ts +167 -0
- package/dist/agent-data-parts.d.ts.map +1 -0
- package/dist/agent-data-parts.js +68 -0
- package/dist/agent-data-parts.js.map +1 -0
- package/dist/agent-errors.d.ts +41 -0
- package/dist/agent-errors.d.ts.map +1 -0
- package/dist/agent-errors.js +191 -0
- package/dist/agent-errors.js.map +1 -0
- package/dist/agent-follow-up-store.d.ts +273 -0
- package/dist/agent-follow-up-store.d.ts.map +1 -0
- package/dist/agent-follow-up-store.js +703 -0
- package/dist/agent-follow-up-store.js.map +1 -0
- package/dist/agent-follow-ups.d.ts +314 -0
- package/dist/agent-follow-ups.d.ts.map +1 -0
- package/dist/agent-follow-ups.js +840 -0
- package/dist/agent-follow-ups.js.map +1 -0
- package/dist/agent-memory.d.ts +323 -0
- package/dist/agent-memory.d.ts.map +1 -0
- package/dist/agent-memory.js +1270 -0
- package/dist/agent-memory.js.map +1 -0
- package/dist/agent-message-parts.d.ts +58 -0
- package/dist/agent-message-parts.d.ts.map +1 -0
- package/dist/agent-message-parts.js +163 -0
- package/dist/agent-message-parts.js.map +1 -0
- package/dist/agent-remote-mcp-credentials.d.ts +154 -0
- package/dist/agent-remote-mcp-credentials.d.ts.map +1 -0
- package/dist/agent-remote-mcp-credentials.js +287 -0
- package/dist/agent-remote-mcp-credentials.js.map +1 -0
- package/dist/agent-remote-mcp-crypto.d.ts +32 -0
- package/dist/agent-remote-mcp-crypto.d.ts.map +1 -0
- package/dist/agent-remote-mcp-crypto.js +101 -0
- package/dist/agent-remote-mcp-crypto.js.map +1 -0
- package/dist/agent-remote-mcp-install.d.ts +299 -0
- package/dist/agent-remote-mcp-install.d.ts.map +1 -0
- package/dist/agent-remote-mcp-install.js +785 -0
- package/dist/agent-remote-mcp-install.js.map +1 -0
- package/dist/agent-remote-mcp-oauth.d.ts +73 -0
- package/dist/agent-remote-mcp-oauth.d.ts.map +1 -0
- package/dist/agent-remote-mcp-oauth.js +344 -0
- package/dist/agent-remote-mcp-oauth.js.map +1 -0
- package/dist/agent-remote-mcp-transport.d.ts +46 -0
- package/dist/agent-remote-mcp-transport.d.ts.map +1 -0
- package/dist/agent-remote-mcp-transport.js +225 -0
- package/dist/agent-remote-mcp-transport.js.map +1 -0
- package/dist/agent-remote-mcp.d.ts +147 -0
- package/dist/agent-remote-mcp.d.ts.map +1 -0
- package/dist/agent-remote-mcp.js +681 -0
- package/dist/agent-remote-mcp.js.map +1 -0
- package/dist/agent-room-redaction.d.ts +66 -0
- package/dist/agent-room-redaction.d.ts.map +1 -0
- package/dist/agent-room-redaction.js +264 -0
- package/dist/agent-room-redaction.js.map +1 -0
- package/dist/agent-rooms.d.ts +209 -0
- package/dist/agent-rooms.d.ts.map +1 -0
- package/dist/agent-rooms.js +244 -0
- package/dist/agent-rooms.js.map +1 -0
- package/dist/agent-runtime.d.ts +541 -0
- package/dist/agent-runtime.d.ts.map +1 -0
- package/dist/agent-runtime.js +4260 -0
- package/dist/agent-runtime.js.map +1 -0
- package/dist/agent-skill-archive.d.ts +20 -0
- package/dist/agent-skill-archive.d.ts.map +1 -0
- package/dist/agent-skill-archive.js +316 -0
- package/dist/agent-skill-archive.js.map +1 -0
- package/dist/agent-skill-discovery.d.ts +96 -0
- package/dist/agent-skill-discovery.d.ts.map +1 -0
- package/dist/agent-skill-discovery.js +464 -0
- package/dist/agent-skill-discovery.js.map +1 -0
- package/dist/agent-skill-format.d.ts +57 -0
- package/dist/agent-skill-format.d.ts.map +1 -0
- package/dist/agent-skill-format.js +238 -0
- package/dist/agent-skill-format.js.map +1 -0
- package/dist/agent-skill-import.d.ts +64 -0
- package/dist/agent-skill-import.d.ts.map +1 -0
- package/dist/agent-skill-import.js +295 -0
- package/dist/agent-skill-import.js.map +1 -0
- package/dist/agent-skill-publish.d.ts +51 -0
- package/dist/agent-skill-publish.d.ts.map +1 -0
- package/dist/agent-skill-publish.js +136 -0
- package/dist/agent-skill-publish.js.map +1 -0
- package/dist/agent-skill-store.d.ts +252 -0
- package/dist/agent-skill-store.d.ts.map +1 -0
- package/dist/agent-skill-store.js +514 -0
- package/dist/agent-skill-store.js.map +1 -0
- package/dist/agent-skills.d.ts +85 -0
- package/dist/agent-skills.d.ts.map +1 -0
- package/dist/agent-skills.js +291 -0
- package/dist/agent-skills.js.map +1 -0
- package/dist/agent-transcript-pager.d.ts +77 -0
- package/dist/agent-transcript-pager.d.ts.map +1 -0
- package/dist/agent-transcript-pager.js +210 -0
- package/dist/agent-transcript-pager.js.map +1 -0
- package/dist/agent-user-data-parts.d.ts +20 -0
- package/dist/agent-user-data-parts.d.ts.map +1 -0
- package/dist/agent-user-data-parts.js +161 -0
- package/dist/agent-user-data-parts.js.map +1 -0
- package/dist/agent-user-transcript.d.ts +46 -0
- package/dist/agent-user-transcript.d.ts.map +1 -0
- package/dist/agent-user-transcript.js +106 -0
- package/dist/agent-user-transcript.js.map +1 -0
- package/dist/agent-voice-notes.d.ts +15 -0
- package/dist/agent-voice-notes.d.ts.map +1 -0
- package/dist/agent-voice-notes.js +17 -0
- package/dist/agent-voice-notes.js.map +1 -0
- package/dist/agent-wakes.d.ts +213 -0
- package/dist/agent-wakes.d.ts.map +1 -0
- package/dist/agent-wakes.js +534 -0
- package/dist/agent-wakes.js.map +1 -0
- package/dist/agent.d.ts +1780 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +3123 -0
- package/dist/agent.js.map +1 -0
- package/dist/ai.d.ts +583 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +1858 -0
- package/dist/ai.js.map +1 -0
- package/dist/app-manifest.d.ts +255 -0
- package/dist/app-manifest.d.ts.map +1 -0
- package/dist/app-manifest.js +372 -0
- package/dist/app-manifest.js.map +1 -0
- package/dist/app-users.d.ts +30 -0
- package/dist/app-users.d.ts.map +1 -0
- package/dist/app-users.js +91 -0
- package/dist/app-users.js.map +1 -0
- package/dist/audit-archive.d.ts +85 -0
- package/dist/audit-archive.d.ts.map +1 -0
- package/dist/audit-archive.js +178 -0
- package/dist/audit-archive.js.map +1 -0
- package/dist/audit.d.ts +54 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +95 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth-logger.d.ts +28 -0
- package/dist/auth-logger.d.ts.map +1 -0
- package/dist/auth-logger.js +53 -0
- package/dist/auth-logger.js.map +1 -0
- package/dist/auth-password-secret.d.ts +59 -0
- package/dist/auth-password-secret.d.ts.map +1 -0
- package/dist/auth-password-secret.js +409 -0
- package/dist/auth-password-secret.js.map +1 -0
- package/dist/auth-schema.d.ts +120 -0
- package/dist/auth-schema.d.ts.map +1 -0
- package/dist/auth-schema.js +285 -0
- package/dist/auth-schema.js.map +1 -0
- package/dist/auth.d.ts +321 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +1562 -0
- package/dist/auth.js.map +1 -0
- package/dist/backup-archive.d.ts +257 -0
- package/dist/backup-archive.d.ts.map +1 -0
- package/dist/backup-archive.js +2068 -0
- package/dist/backup-archive.js.map +1 -0
- package/dist/backup-crypto.d.ts +313 -0
- package/dist/backup-crypto.d.ts.map +1 -0
- package/dist/backup-crypto.js +693 -0
- package/dist/backup-crypto.js.map +1 -0
- package/dist/backup-format.d.ts +200 -0
- package/dist/backup-format.d.ts.map +1 -0
- package/dist/backup-format.js +1247 -0
- package/dist/backup-format.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -0
- package/dist/clock.d.ts +35 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +83 -0
- package/dist/clock.js.map +1 -0
- package/dist/data-client.d.ts +187 -0
- package/dist/data-client.d.ts.map +1 -0
- package/dist/data-client.js +590 -0
- package/dist/data-client.js.map +1 -0
- package/dist/data-secrets.d.ts +164 -0
- package/dist/data-secrets.d.ts.map +1 -0
- package/dist/data-secrets.js +383 -0
- package/dist/data-secrets.js.map +1 -0
- package/dist/db.d.ts +453 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +324 -0
- package/dist/db.js.map +1 -0
- package/dist/dev-activity.d.ts +48 -0
- package/dist/dev-activity.d.ts.map +1 -0
- package/dist/dev-activity.js +50 -0
- package/dist/dev-activity.js.map +1 -0
- package/dist/do.d.ts +429 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +4526 -0
- package/dist/do.js.map +1 -0
- package/dist/email.d.ts +137 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +527 -0
- package/dist/email.js.map +1 -0
- package/dist/generated/admin-assets.d.ts +16 -0
- package/dist/generated/admin-assets.d.ts.map +1 -0
- package/dist/generated/admin-assets.js +16 -0
- package/dist/generated/admin-assets.js.map +1 -0
- package/dist/generated/admin-docs-assets.d.ts +3 -0
- package/dist/generated/admin-docs-assets.d.ts.map +1 -0
- package/dist/generated/admin-docs-assets.js +3 -0
- package/dist/generated/admin-docs-assets.js.map +1 -0
- package/dist/handoff-consumer.d.ts +79 -0
- package/dist/handoff-consumer.d.ts.map +1 -0
- package/dist/handoff-consumer.js +300 -0
- package/dist/handoff-consumer.js.map +1 -0
- package/dist/handoff.d.ts +70 -0
- package/dist/handoff.d.ts.map +1 -0
- package/dist/handoff.js +228 -0
- package/dist/handoff.js.map +1 -0
- package/dist/host-auth.d.ts +47 -0
- package/dist/host-auth.d.ts.map +1 -0
- package/dist/host-auth.js +59 -0
- package/dist/host-auth.js.map +1 -0
- package/dist/host-user.d.ts +15 -0
- package/dist/host-user.d.ts.map +1 -0
- package/dist/host-user.js +23 -0
- package/dist/host-user.js.map +1 -0
- package/dist/html.d.ts +35 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +634 -0
- package/dist/html.js.map +1 -0
- package/dist/http-error.d.ts +13 -0
- package/dist/http-error.d.ts.map +1 -0
- package/dist/http-error.js +15 -0
- package/dist/http-error.js.map +1 -0
- package/dist/imports.d.ts +219 -0
- package/dist/imports.d.ts.map +1 -0
- package/dist/imports.js +571 -0
- package/dist/imports.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/inference-tape.d.ts +64 -0
- package/dist/inference-tape.d.ts.map +1 -0
- package/dist/inference-tape.js +278 -0
- package/dist/inference-tape.js.map +1 -0
- package/dist/internal.d.ts +15 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +48 -0
- package/dist/internal.js.map +1 -0
- package/dist/jobs.d.ts +796 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +538 -0
- package/dist/jobs.js.map +1 -0
- package/dist/json-schema.d.ts +91 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +884 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/knowledge.d.ts +33 -0
- package/dist/knowledge.d.ts.map +1 -0
- package/dist/knowledge.js +348 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/local-dev-chrome.d.ts +29 -0
- package/dist/local-dev-chrome.d.ts.map +1 -0
- package/dist/local-dev-chrome.js +514 -0
- package/dist/local-dev-chrome.js.map +1 -0
- package/dist/local-dev-personas.d.ts +15 -0
- package/dist/local-dev-personas.d.ts.map +1 -0
- package/dist/local-dev-personas.js +46 -0
- package/dist/local-dev-personas.js.map +1 -0
- package/dist/mcp.d.ts +567 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +2480 -0
- package/dist/mcp.js.map +1 -0
- package/dist/modules.d.ts +145 -0
- package/dist/modules.d.ts.map +1 -0
- package/dist/modules.js +164 -0
- package/dist/modules.js.map +1 -0
- package/dist/notification-client.d.ts +94 -0
- package/dist/notification-client.d.ts.map +1 -0
- package/dist/notification-client.js +127 -0
- package/dist/notification-client.js.map +1 -0
- package/dist/notifications.d.ts +447 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +1625 -0
- package/dist/notifications.js.map +1 -0
- package/dist/operator-data-query.d.ts +117 -0
- package/dist/operator-data-query.d.ts.map +1 -0
- package/dist/operator-data-query.js +431 -0
- package/dist/operator-data-query.js.map +1 -0
- package/dist/operator-mcp.d.ts +63 -0
- package/dist/operator-mcp.d.ts.map +1 -0
- package/dist/operator-mcp.js +2828 -0
- package/dist/operator-mcp.js.map +1 -0
- package/dist/outbound-https.d.ts +24 -0
- package/dist/outbound-https.d.ts.map +1 -0
- package/dist/outbound-https.js +172 -0
- package/dist/outbound-https.js.map +1 -0
- package/dist/pitr.d.ts +60 -0
- package/dist/pitr.d.ts.map +1 -0
- package/dist/pitr.js +94 -0
- package/dist/pitr.js.map +1 -0
- package/dist/platform.d.ts +199 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +196 -0
- package/dist/platform.js.map +1 -0
- package/dist/policies.d.ts +115 -0
- package/dist/policies.d.ts.map +1 -0
- package/dist/policies.js +158 -0
- package/dist/policies.js.map +1 -0
- package/dist/principal.d.ts +143 -0
- package/dist/principal.d.ts.map +1 -0
- package/dist/principal.js +174 -0
- package/dist/principal.js.map +1 -0
- package/dist/realtime.d.ts +280 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +578 -0
- package/dist/realtime.js.map +1 -0
- package/dist/retrieval.d.ts +263 -0
- package/dist/retrieval.d.ts.map +1 -0
- package/dist/retrieval.js +602 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/runtime-error-client.d.ts +10 -0
- package/dist/runtime-error-client.d.ts.map +1 -0
- package/dist/runtime-error-client.js +70 -0
- package/dist/runtime-error-client.js.map +1 -0
- package/dist/runtime-errors.d.ts +180 -0
- package/dist/runtime-errors.d.ts.map +1 -0
- package/dist/runtime-errors.js +572 -0
- package/dist/runtime-errors.js.map +1 -0
- package/dist/schema.d.ts +434 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +232 -0
- package/dist/schema.js.map +1 -0
- package/dist/search.d.ts +216 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +785 -0
- package/dist/search.js.map +1 -0
- package/dist/settings.d.ts +191 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +478 -0
- package/dist/settings.js.map +1 -0
- package/dist/sql.d.ts +7 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +30 -0
- package/dist/sql.js.map +1 -0
- package/dist/storage-client.d.ts +69 -0
- package/dist/storage-client.d.ts.map +1 -0
- package/dist/storage-client.js +469 -0
- package/dist/storage-client.js.map +1 -0
- package/dist/storage.d.ts +21 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +82 -0
- package/dist/storage.js.map +1 -0
- package/dist/subject-domains.d.ts +15 -0
- package/dist/subject-domains.d.ts.map +1 -0
- package/dist/subject-domains.js +38 -0
- package/dist/subject-domains.js.map +1 -0
- package/dist/support.d.ts +132 -0
- package/dist/support.d.ts.map +1 -0
- package/dist/support.js +483 -0
- package/dist/support.js.map +1 -0
- package/dist/system-tables.d.ts +12 -0
- package/dist/system-tables.d.ts.map +1 -0
- package/dist/system-tables.js +225 -0
- package/dist/system-tables.js.map +1 -0
- package/dist/test.d.ts +57 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +454 -0
- package/dist/test.js.map +1 -0
- package/dist/vite.d.ts +82 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +82 -0
- package/dist/vite.js.map +1 -0
- package/dist/webpush-crypto.d.ts +39 -0
- package/dist/webpush-crypto.d.ts.map +1 -0
- package/dist/webpush-crypto.js +213 -0
- package/dist/webpush-crypto.js.map +1 -0
- package/dist/webpush-private.d.ts +11 -0
- package/dist/webpush-private.d.ts.map +1 -0
- package/dist/webpush-private.js +11 -0
- package/dist/webpush-private.js.map +1 -0
- package/dist/webpush.d.ts +86 -0
- package/dist/webpush.d.ts.map +1 -0
- package/dist/webpush.js +375 -0
- package/dist/webpush.js.map +1 -0
- package/dist/worker.d.ts +185 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +13021 -0
- package/dist/worker.js.map +1 -0
- package/package.json +161 -8
- package/README.md +0 -3
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { dataStub } from "./db.js";
|
|
2
|
+
export { sha256Hex } from "./internal.js";
|
|
3
|
+
const dayMs = 24 * 60 * 60 * 1000;
|
|
4
|
+
const defaultLimitBytes = 8 * 1024 * 1024;
|
|
5
|
+
export const auditArchiveContentType = "application/x-ndjson; charset=utf-8";
|
|
6
|
+
function metadataValue(metadata) {
|
|
7
|
+
if (metadata === null)
|
|
8
|
+
return null;
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(metadata);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return metadata;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function assertIsoDate(value, name) {
|
|
17
|
+
if (!/^\d{4}-\d{2}-\d{2}T00:00:00\.000Z$/.test(value)) {
|
|
18
|
+
throw new Error(`${name} must be a UTC day boundary ISO timestamp`);
|
|
19
|
+
}
|
|
20
|
+
const date = new Date(value);
|
|
21
|
+
if (Number.isNaN(date.getTime()) || date.toISOString() !== value) {
|
|
22
|
+
throw new Error(`${name} must be a valid UTC timestamp`);
|
|
23
|
+
}
|
|
24
|
+
return date;
|
|
25
|
+
}
|
|
26
|
+
function sqliteTimestampToDate(value) {
|
|
27
|
+
const match = value.match(/^(\d{4})-(\d{2})-(\d{2}) \d{2}:\d{2}:\d{2}$/);
|
|
28
|
+
if (!match)
|
|
29
|
+
throw new Error(`Audit createdAt is not a SQLite UTC timestamp: ${value}`);
|
|
30
|
+
return new Date(`${match[1]}-${match[2]}-${match[3]}T00:00:00.000Z`);
|
|
31
|
+
}
|
|
32
|
+
function startOfUtcDay(date) {
|
|
33
|
+
return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
|
|
34
|
+
}
|
|
35
|
+
function isoDay(date) {
|
|
36
|
+
return startOfUtcDay(date).toISOString();
|
|
37
|
+
}
|
|
38
|
+
export function validateAuditArchiveWindow(input, now = new Date()) {
|
|
39
|
+
const start = assertIsoDate(input.windowStart, "windowStart");
|
|
40
|
+
const end = assertIsoDate(input.windowEnd, "windowEnd");
|
|
41
|
+
if (end.getTime() - start.getTime() !== dayMs) {
|
|
42
|
+
throw new Error("Audit archive windows must be exactly one complete UTC day");
|
|
43
|
+
}
|
|
44
|
+
if (end.getTime() > now.getTime() - dayMs) {
|
|
45
|
+
throw new Error("Audit archive windowEnd must be at least 24 hours old");
|
|
46
|
+
}
|
|
47
|
+
return { windowStart: input.windowStart, windowEnd: input.windowEnd };
|
|
48
|
+
}
|
|
49
|
+
export function auditArchiveObjectKey(windowStart) {
|
|
50
|
+
const start = assertIsoDate(windowStart, "windowStart");
|
|
51
|
+
const year = String(start.getUTCFullYear()).padStart(4, "0");
|
|
52
|
+
const month = String(start.getUTCMonth() + 1).padStart(2, "0");
|
|
53
|
+
const day = String(start.getUTCDate()).padStart(2, "0");
|
|
54
|
+
return `audit/v1/year=${year}/month=${month}/day=${day}/raybase-audit-${year}-${month}-${day}.ndjson`;
|
|
55
|
+
}
|
|
56
|
+
export function isoToSqliteTimestamp(value) {
|
|
57
|
+
const date = new Date(value);
|
|
58
|
+
if (Number.isNaN(date.getTime()))
|
|
59
|
+
throw new Error(`Invalid timestamp: ${value}`);
|
|
60
|
+
return date.toISOString().slice(0, 19).replace("T", " ");
|
|
61
|
+
}
|
|
62
|
+
export function serializeAuditArchiveRows(rows) {
|
|
63
|
+
if (!rows.length)
|
|
64
|
+
return "";
|
|
65
|
+
return `${rows
|
|
66
|
+
.map((row) => JSON.stringify({
|
|
67
|
+
id: row.id,
|
|
68
|
+
actorId: row.actorId,
|
|
69
|
+
action: row.action,
|
|
70
|
+
targetType: row.targetType,
|
|
71
|
+
targetId: row.targetId,
|
|
72
|
+
metadata: metadataValue(row.metadata),
|
|
73
|
+
createdAt: row.createdAt
|
|
74
|
+
}))
|
|
75
|
+
.join("\n")}\n`;
|
|
76
|
+
}
|
|
77
|
+
export function auditArchiveEnabled(value) {
|
|
78
|
+
if (!value)
|
|
79
|
+
return false;
|
|
80
|
+
return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
|
|
81
|
+
}
|
|
82
|
+
export function parseAuditHotDays(value) {
|
|
83
|
+
if (value === undefined || value.trim() === "")
|
|
84
|
+
return 1;
|
|
85
|
+
const days = Number(value);
|
|
86
|
+
if (!Number.isInteger(days) || days < 1) {
|
|
87
|
+
throw new Error("RAYBASE_AUDIT_HOT_DAYS must be a positive integer");
|
|
88
|
+
}
|
|
89
|
+
return days;
|
|
90
|
+
}
|
|
91
|
+
export async function nextAuditArchiveWindow(stub, now = new Date(), hotDays = 1) {
|
|
92
|
+
const cutoff = new Date(now.getTime() - hotDays * dayMs);
|
|
93
|
+
const row = await stub.first(`SELECT MIN("createdAt") as "createdAt" FROM "_audit" WHERE "createdAt" < ?`, [isoToSqliteTimestamp(cutoff.toISOString())]);
|
|
94
|
+
if (!row?.createdAt)
|
|
95
|
+
return null;
|
|
96
|
+
const start = sqliteTimestampToDate(row.createdAt);
|
|
97
|
+
const end = new Date(start.getTime() + dayMs);
|
|
98
|
+
if (end.getTime() > cutoff.getTime())
|
|
99
|
+
return null;
|
|
100
|
+
return { windowStart: isoDay(start), windowEnd: isoDay(end) };
|
|
101
|
+
}
|
|
102
|
+
function verifyR2Metadata(prepared, object, expectedSize) {
|
|
103
|
+
if (!object)
|
|
104
|
+
throw new Error(`Audit archive R2 object was not found after upload: ${prepared.objectKey}`);
|
|
105
|
+
const metadata = object.customMetadata ?? {};
|
|
106
|
+
const expected = {
|
|
107
|
+
"raybase-window-start": prepared.windowStart,
|
|
108
|
+
"raybase-window-end": prepared.windowEnd,
|
|
109
|
+
"raybase-row-count": String(prepared.rowCount),
|
|
110
|
+
"raybase-sha256": prepared.sha256
|
|
111
|
+
};
|
|
112
|
+
for (const [key, value] of Object.entries(expected)) {
|
|
113
|
+
if (metadata[key] !== value) {
|
|
114
|
+
throw new Error(`Audit archive R2 object metadata mismatch for ${key}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (expectedSize !== null && object.size !== expectedSize) {
|
|
118
|
+
throw new Error(`Audit archive R2 object size mismatch for ${prepared.objectKey}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export async function archiveAuditToR2(env) {
|
|
122
|
+
if (!auditArchiveEnabled(env.RAYBASE_AUDIT_ARCHIVE_ENABLED)) {
|
|
123
|
+
return { ok: true, skipped: true, reason: "disabled", archived: false, pruned: false };
|
|
124
|
+
}
|
|
125
|
+
if (!env.RAYBASE_AUDIT_ARCHIVE) {
|
|
126
|
+
return { ok: true, skipped: true, reason: "missing-r2-binding", archived: false, pruned: false };
|
|
127
|
+
}
|
|
128
|
+
const stub = dataStub(env);
|
|
129
|
+
const hotDays = parseAuditHotDays(env.RAYBASE_AUDIT_HOT_DAYS);
|
|
130
|
+
const window = await nextAuditArchiveWindow(stub, new Date(), hotDays);
|
|
131
|
+
if (!window) {
|
|
132
|
+
return { ok: true, skipped: true, reason: "no-eligible-window", archived: false, pruned: false };
|
|
133
|
+
}
|
|
134
|
+
const prepared = await stub.prepareAuditArchive({ ...window, limitBytes: defaultLimitBytes });
|
|
135
|
+
if (prepared.empty) {
|
|
136
|
+
return { ok: true, skipped: true, reason: "empty-window", archived: false, pruned: false };
|
|
137
|
+
}
|
|
138
|
+
const bodySize = prepared.body === undefined ? null : new TextEncoder().encode(prepared.body).byteLength;
|
|
139
|
+
if (prepared.body !== undefined) {
|
|
140
|
+
await env.RAYBASE_AUDIT_ARCHIVE.put(prepared.objectKey, prepared.body, {
|
|
141
|
+
httpMetadata: { contentType: auditArchiveContentType },
|
|
142
|
+
customMetadata: {
|
|
143
|
+
"raybase-window-start": prepared.windowStart,
|
|
144
|
+
"raybase-window-end": prepared.windowEnd,
|
|
145
|
+
"raybase-row-count": String(prepared.rowCount),
|
|
146
|
+
"raybase-sha256": prepared.sha256
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
verifyR2Metadata(prepared, await env.RAYBASE_AUDIT_ARCHIVE.head(prepared.objectKey), bodySize);
|
|
151
|
+
await stub.confirmAuditArchive(prepared);
|
|
152
|
+
await stub.pruneAuditArchive({
|
|
153
|
+
windowStart: prepared.windowStart,
|
|
154
|
+
windowEnd: prepared.windowEnd,
|
|
155
|
+
objectKey: prepared.objectKey,
|
|
156
|
+
sha256: prepared.sha256
|
|
157
|
+
});
|
|
158
|
+
console.info("Raybase audit archive complete", {
|
|
159
|
+
windowStart: prepared.windowStart,
|
|
160
|
+
windowEnd: prepared.windowEnd,
|
|
161
|
+
objectKey: prepared.objectKey,
|
|
162
|
+
rowCount: prepared.rowCount
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
ok: true,
|
|
166
|
+
skipped: false,
|
|
167
|
+
archived: true,
|
|
168
|
+
pruned: true,
|
|
169
|
+
windowStart: prepared.windowStart,
|
|
170
|
+
windowEnd: prepared.windowEnd,
|
|
171
|
+
objectKey: prepared.objectKey,
|
|
172
|
+
rowCount: prepared.rowCount,
|
|
173
|
+
firstCreatedAt: prepared.firstCreatedAt,
|
|
174
|
+
lastCreatedAt: prepared.lastCreatedAt,
|
|
175
|
+
sha256: prepared.sha256
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=audit-archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-archive.js","sourceRoot":"","sources":["../src/audit-archive.ts"],"names":[],"mappings":"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"}
|
package/dist/audit.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { SqlExecutor } from "./db.js";
|
|
2
|
+
import type { RaybasePrincipal } from "./principal.js";
|
|
3
|
+
export type RaybaseAuditPrincipalRef = {
|
|
4
|
+
kind: "user" | "public" | "operator" | "service" | "agent";
|
|
5
|
+
id: string | null;
|
|
6
|
+
userId?: string | null;
|
|
7
|
+
membershipId?: string | null;
|
|
8
|
+
organizationId?: string | null;
|
|
9
|
+
appId?: string | null;
|
|
10
|
+
service?: string | null;
|
|
11
|
+
};
|
|
12
|
+
export type RaybaseAuditTarget = {
|
|
13
|
+
type: string;
|
|
14
|
+
id?: string | null;
|
|
15
|
+
};
|
|
16
|
+
export type RaybaseAuditSource = {
|
|
17
|
+
surface?: string;
|
|
18
|
+
route?: string;
|
|
19
|
+
requestId?: string;
|
|
20
|
+
moduleId?: string;
|
|
21
|
+
toolName?: string;
|
|
22
|
+
grantId?: string;
|
|
23
|
+
organizationId?: string | null;
|
|
24
|
+
appId?: string | null;
|
|
25
|
+
scope?: "platform" | "organization" | "app" | string;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
};
|
|
28
|
+
export type RaybaseAuditEvent = {
|
|
29
|
+
actor: RaybaseAuditPrincipalRef | RaybasePrincipal | null;
|
|
30
|
+
runAs?: RaybaseAuditPrincipalRef | RaybasePrincipal | null;
|
|
31
|
+
action: string;
|
|
32
|
+
target: RaybaseAuditTarget;
|
|
33
|
+
metadata?: unknown;
|
|
34
|
+
source?: RaybaseAuditSource;
|
|
35
|
+
};
|
|
36
|
+
export type RaybaseAuditContextEvent = Omit<RaybaseAuditEvent, "actor" | "runAs"> & {
|
|
37
|
+
actor?: RaybaseAuditEvent["actor"];
|
|
38
|
+
runAs?: RaybaseAuditEvent["runAs"];
|
|
39
|
+
};
|
|
40
|
+
export declare function recordAudit(db: SqlExecutor, event: RaybaseAuditEvent): Promise<void>;
|
|
41
|
+
/** The `_audit` column values `recordAudit` writes for `event`, for callers that insert inside their own transaction. */
|
|
42
|
+
export declare function auditRowValues(event: RaybaseAuditEvent): {
|
|
43
|
+
actorKind: string | null;
|
|
44
|
+
actorId: string | null;
|
|
45
|
+
runAsKind: string | null;
|
|
46
|
+
runAsId: string | null;
|
|
47
|
+
action: string;
|
|
48
|
+
targetType: string;
|
|
49
|
+
targetId: string | null;
|
|
50
|
+
metadata: string | null;
|
|
51
|
+
};
|
|
52
|
+
export declare function auditPrincipalRef(input: RaybaseAuditPrincipalRef | RaybasePrincipal | null | undefined): RaybaseAuditPrincipalRef | null;
|
|
53
|
+
export declare function actorAuditRef(id: string | null, kind?: RaybaseAuditPrincipalRef["kind"]): RaybaseAuditPrincipalRef | null;
|
|
54
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/audit.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { randomId } from "./sql.js";
|
|
2
|
+
export async function recordAudit(db, event) {
|
|
3
|
+
const row = auditRowValues(event);
|
|
4
|
+
await db.run(`INSERT INTO "_audit" ("id", "actorKind", "actorId", "runAsKind", "runAsId", "action", "targetType", "targetId", "metadata")
|
|
5
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [randomId("audit"), row.actorKind, row.actorId, row.runAsKind, row.runAsId, row.action, row.targetType, row.targetId, row.metadata]);
|
|
6
|
+
}
|
|
7
|
+
/** The `_audit` column values `recordAudit` writes for `event`, for callers that insert inside their own transaction. */
|
|
8
|
+
export function auditRowValues(event) {
|
|
9
|
+
const actor = auditPrincipalRef(event.actor);
|
|
10
|
+
const runAs = event.runAs === undefined ? null : auditPrincipalRef(event.runAs);
|
|
11
|
+
return {
|
|
12
|
+
actorKind: actor?.kind ?? null,
|
|
13
|
+
actorId: actorStorageId(actor),
|
|
14
|
+
runAsKind: runAs?.kind ?? null,
|
|
15
|
+
runAsId: runAs?.id ?? null,
|
|
16
|
+
action: event.action,
|
|
17
|
+
targetType: event.target.type,
|
|
18
|
+
targetId: event.target.id ?? null,
|
|
19
|
+
metadata: event.metadata === undefined ? null : JSON.stringify(event.metadata)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function auditPrincipalRef(input) {
|
|
23
|
+
if (!input)
|
|
24
|
+
return null;
|
|
25
|
+
if ("user" in input && input.kind === "user") {
|
|
26
|
+
const userId = input.userId ?? input.user.id;
|
|
27
|
+
return {
|
|
28
|
+
kind: "user",
|
|
29
|
+
id: input.membershipId ?? userId,
|
|
30
|
+
userId,
|
|
31
|
+
membershipId: input.membershipId,
|
|
32
|
+
organizationId: input.organizationId,
|
|
33
|
+
appId: input.appId
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if ("user" in input && input.kind === "operator") {
|
|
37
|
+
const userId = input.userId ?? input.user.id;
|
|
38
|
+
return {
|
|
39
|
+
kind: "operator",
|
|
40
|
+
id: userId,
|
|
41
|
+
userId,
|
|
42
|
+
membershipId: input.membershipId,
|
|
43
|
+
organizationId: input.organizationId,
|
|
44
|
+
appId: input.appId
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (input.kind === "public") {
|
|
48
|
+
return {
|
|
49
|
+
kind: "public",
|
|
50
|
+
id: input.id,
|
|
51
|
+
organizationId: input.organizationId,
|
|
52
|
+
appId: input.appId
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (input.kind === "service") {
|
|
56
|
+
return {
|
|
57
|
+
kind: "service",
|
|
58
|
+
id: input.id ?? input.service ?? null,
|
|
59
|
+
service: input.service,
|
|
60
|
+
organizationId: input.organizationId,
|
|
61
|
+
appId: input.appId
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (input.kind === "agent" && "onBehalfOf" in input) {
|
|
65
|
+
// The agent is the actor; the person it ran for is kept on the ref so a
|
|
66
|
+
// ledger can show both without a join.
|
|
67
|
+
const user = input.onBehalfOf.kind === "user" ? input.onBehalfOf.user : null;
|
|
68
|
+
return {
|
|
69
|
+
kind: "agent",
|
|
70
|
+
id: input.agent,
|
|
71
|
+
userId: user ? input.userId ?? user.identityId ?? user.id : null,
|
|
72
|
+
membershipId: input.membershipId ?? null,
|
|
73
|
+
organizationId: input.organizationId,
|
|
74
|
+
appId: input.appId,
|
|
75
|
+
service: input.onBehalfOf.kind === "service" ? input.onBehalfOf.service : null
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return input;
|
|
79
|
+
}
|
|
80
|
+
export function actorAuditRef(id, kind = "user") {
|
|
81
|
+
return id === null ? null : { kind, id };
|
|
82
|
+
}
|
|
83
|
+
function actorStorageId(ref) {
|
|
84
|
+
if (!ref)
|
|
85
|
+
return null;
|
|
86
|
+
if (ref.kind === "service" || ref.kind === "public")
|
|
87
|
+
return null;
|
|
88
|
+
// actorId references a user row. An agent row keeps the person it ran for
|
|
89
|
+
// there (null for service runs); the agent name travels in the ref id and
|
|
90
|
+
// in action audit metadata.
|
|
91
|
+
if (ref.kind === "agent")
|
|
92
|
+
return ref.userId ?? null;
|
|
93
|
+
return ref.userId ?? ref.id;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { BetterAuthOptions } from "better-auth";
|
|
2
|
+
/**
|
|
3
|
+
* Better Auth's startup diagnostics, deduped per isolate.
|
|
4
|
+
*
|
|
5
|
+
* In the Workers runtime the environment arrives with the request, so
|
|
6
|
+
* `createRaybaseAuth` builds a fresh Better Auth instance on *every* request.
|
|
7
|
+
* A few of Better Auth's startup warnings are derived only from env and config,
|
|
8
|
+
* never from the request, so each rebuild re-emits the identical line. With the
|
|
9
|
+
* local fallback secret (`raybase-local-dev-secret`, 24 characters and ~89 bits
|
|
10
|
+
* of estimated entropy) that is two secret warnings on every request, plus the
|
|
11
|
+
* base-URL warning when no `BETTER_AUTH_URL` is set — enough to drown `raybase
|
|
12
|
+
* dev` logs while an idle app polls.
|
|
13
|
+
*
|
|
14
|
+
* This logger forwards everything Better Auth logs, unchanged, and drops only
|
|
15
|
+
* *exact repeats* of those boot-constant lines. The first emission in an isolate
|
|
16
|
+
* always prints, in every environment: a genuinely weak production secret still
|
|
17
|
+
* warns loudly, it just says so once per boot instead of once per request.
|
|
18
|
+
*/
|
|
19
|
+
/** Levels Better Auth hands to a custom `log` handler (`success` arrives as `info`). */
|
|
20
|
+
export type RaybaseBetterAuthLogLevel = "debug" | "info" | "warn" | "error";
|
|
21
|
+
export type RaybaseBetterAuthLogSink = (level: RaybaseBetterAuthLogLevel, message: string, args: unknown[]) => void;
|
|
22
|
+
export declare function isRaybaseBetterAuthBootWarning(message: string): boolean;
|
|
23
|
+
/** Test seam: forget what this isolate has already emitted. */
|
|
24
|
+
export declare function resetRaybaseBetterAuthBootWarnings(): void;
|
|
25
|
+
export declare function createRaybaseBetterAuthLogger(sink?: RaybaseBetterAuthLogSink): NonNullable<BetterAuthOptions["logger"]>;
|
|
26
|
+
/** One shared instance; the dedupe state is module-level and isolate-wide anyway. */
|
|
27
|
+
export declare const raybaseBetterAuthLogger: import("better-auth").Logger;
|
|
28
|
+
//# sourceMappingURL=auth-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-logger.d.ts","sourceRoot":"","sources":["../src/auth-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AAEH,wFAAwF;AACxF,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5E,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAkBpH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,+DAA+D;AAC/D,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD;AAkBD,wBAAgB,6BAA6B,CAAC,IAAI,GAAE,wBAAsC,GAAG,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAUpI;AAED,qFAAqF;AACrF,eAAO,MAAM,uBAAuB,8BAAkC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message prefixes for warnings that can only ever say the same thing for the
|
|
3
|
+
* life of an isolate, because they are computed from env and config at
|
|
4
|
+
* construction time. Repeats carry no new information.
|
|
5
|
+
*/
|
|
6
|
+
const bootConstantWarningPrefixes = [
|
|
7
|
+
// secret length + entropy checks, single-secret form
|
|
8
|
+
"[better-auth] Warning: your BETTER_AUTH_SECRET",
|
|
9
|
+
// the same two checks, `secrets` array form
|
|
10
|
+
"[better-auth] Warning: the current secret",
|
|
11
|
+
// baseURL resolved from options/env only
|
|
12
|
+
"[better-auth] Base URL is not set."
|
|
13
|
+
];
|
|
14
|
+
const emittedBootWarnings = new Set();
|
|
15
|
+
export function isRaybaseBetterAuthBootWarning(message) {
|
|
16
|
+
return bootConstantWarningPrefixes.some((prefix) => message.startsWith(prefix));
|
|
17
|
+
}
|
|
18
|
+
/** Test seam: forget what this isolate has already emitted. */
|
|
19
|
+
export function resetRaybaseBetterAuthBootWarnings() {
|
|
20
|
+
emittedBootWarnings.clear();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Mirrors Better Auth's own plain-text log format. The Workers runtime reports
|
|
24
|
+
* no color support, so this is byte-for-byte what its default logger prints
|
|
25
|
+
* there today.
|
|
26
|
+
*/
|
|
27
|
+
function formatMessage(level, message) {
|
|
28
|
+
return `${new Date().toISOString()} ${level.toUpperCase()} [Better Auth]: ${message}`;
|
|
29
|
+
}
|
|
30
|
+
const consoleSink = (level, message, args) => {
|
|
31
|
+
const formatted = formatMessage(level, message);
|
|
32
|
+
if (level === "error")
|
|
33
|
+
console.error(formatted, ...args);
|
|
34
|
+
else if (level === "warn")
|
|
35
|
+
console.warn(formatted, ...args);
|
|
36
|
+
else
|
|
37
|
+
console.log(formatted, ...args);
|
|
38
|
+
};
|
|
39
|
+
export function createRaybaseBetterAuthLogger(sink = consoleSink) {
|
|
40
|
+
return {
|
|
41
|
+
log: (level, message, ...args) => {
|
|
42
|
+
if (isRaybaseBetterAuthBootWarning(message)) {
|
|
43
|
+
if (emittedBootWarnings.has(message))
|
|
44
|
+
return;
|
|
45
|
+
emittedBootWarnings.add(message);
|
|
46
|
+
}
|
|
47
|
+
sink(level, message, args);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** One shared instance; the dedupe state is module-level and isolate-wide anyway. */
|
|
52
|
+
export const raybaseBetterAuthLogger = createRaybaseBetterAuthLogger();
|
|
53
|
+
//# sourceMappingURL=auth-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-logger.js","sourceRoot":"","sources":["../src/auth-logger.ts"],"names":[],"mappings":"AAyBA;;;;GAIG;AACH,MAAM,2BAA2B,GAAG;IAClC,qDAAqD;IACrD,gDAAgD;IAChD,4CAA4C;IAC5C,2CAA2C;IAC3C,yCAAyC;IACzC,oCAAoC;CAC5B,CAAC;AAEX,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE9C,MAAM,UAAU,8BAA8B,CAAC,OAAe;IAC5D,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,kCAAkC;IAChD,mBAAmB,CAAC,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAgC,EAAE,OAAe;IACtE,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,mBAAmB,OAAO,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,WAAW,GAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACrE,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;SACpD,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;;QACvD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,OAAiC,WAAW;IACxF,OAAO;QACL,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE;YAC/B,IAAI,8BAA8B,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;oBAAE,OAAO;gBAC7C,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,MAAM,uBAAuB,GAAG,6BAA6B,EAAE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type BackupKdfDescriptor, type BackupPasswordSecretEventType, type BackupWrapParticipant, type RaybaseBackupPasswordSecretLifecycle } from "./backup-crypto.js";
|
|
2
|
+
import type { SqlExecutor } from "./db.js";
|
|
3
|
+
export declare const raybaseAuthPasswordSecretStateTableName = "_auth_password_secret_state";
|
|
4
|
+
export declare const raybaseAuthPasswordProviderStateTableName = "_auth_password_provider_state";
|
|
5
|
+
export declare const raybasePasswordSecretPurpose = "backup-key-provider";
|
|
6
|
+
export declare const raybasePasswordSecretKdfProfile: {
|
|
7
|
+
readonly algorithm: "PBKDF2-SHA-256";
|
|
8
|
+
readonly version: 1;
|
|
9
|
+
readonly iterations: 600000;
|
|
10
|
+
readonly outputBytes: 32;
|
|
11
|
+
readonly saltBytes: 16;
|
|
12
|
+
};
|
|
13
|
+
export type RaybasePasswordSecretLifecycleRegistration = {
|
|
14
|
+
providerId: string;
|
|
15
|
+
lifecycle: RaybaseBackupPasswordSecretLifecycle;
|
|
16
|
+
};
|
|
17
|
+
export type RaybasePasswordSecretReadinessStatus = "ready" | "needs-login" | "change-destructive" | "reset-destructive" | "no-password-lifecycle";
|
|
18
|
+
export type RaybasePasswordSecretReadiness = {
|
|
19
|
+
userId: string;
|
|
20
|
+
providerId: string;
|
|
21
|
+
providerVersion: string;
|
|
22
|
+
status: RaybasePasswordSecretReadinessStatus;
|
|
23
|
+
readyForNewBackups: boolean;
|
|
24
|
+
passwordVersion: number;
|
|
25
|
+
lastSuccessEvent: BackupPasswordSecretEventType | null;
|
|
26
|
+
lastSuccessAt: string | null;
|
|
27
|
+
lastFailureCode: string | null;
|
|
28
|
+
lastFailureAt: string | null;
|
|
29
|
+
destructiveResetAt: string | null;
|
|
30
|
+
};
|
|
31
|
+
export declare function deriveRaybasePasswordSecret(password: string, descriptor: Extract<BackupKdfDescriptor, {
|
|
32
|
+
algorithm: "PBKDF2-SHA-256";
|
|
33
|
+
}>): Promise<Uint8Array>;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve selected ready subjects into fresh wrap-time KDF/state views. The
|
|
36
|
+
* caller must release the result immediately after `wrapDek` settles.
|
|
37
|
+
*/
|
|
38
|
+
export declare function createRaybasePasswordWrapParticipants(db: SqlExecutor, registration: RaybasePasswordSecretLifecycleRegistration, userIds: readonly string[]): Promise<{
|
|
39
|
+
participants: readonly BackupWrapParticipant[];
|
|
40
|
+
release(): void;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Runs only after Core has observed a successful password lifecycle operation.
|
|
44
|
+
* Every failure is reduced to an audit-safe code and swallowed so auth success
|
|
45
|
+
* is never rewritten as an HTTP failure.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runRaybasePasswordSecretLifecycle(input: {
|
|
48
|
+
db: SqlExecutor;
|
|
49
|
+
registration?: RaybasePasswordSecretLifecycleRegistration;
|
|
50
|
+
event: BackupPasswordSecretEventType;
|
|
51
|
+
userId: string;
|
|
52
|
+
password: string;
|
|
53
|
+
previousPassword?: string;
|
|
54
|
+
environment?: string;
|
|
55
|
+
signal?: AbortSignal;
|
|
56
|
+
}): Promise<"not-configured" | "succeeded" | "failed">;
|
|
57
|
+
export declare function listRaybasePasswordSecretReadiness(db: SqlExecutor, registration: RaybasePasswordSecretLifecycleRegistration, userIds?: readonly string[]): Promise<RaybasePasswordSecretReadiness[]>;
|
|
58
|
+
export declare function assertRaybasePasswordSecretParticipantsReady(db: SqlExecutor, registration: RaybasePasswordSecretLifecycleRegistration, requiredUserIds: readonly string[]): Promise<RaybasePasswordSecretReadiness[]>;
|
|
59
|
+
//# sourceMappingURL=auth-password-secret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-password-secret.d.ts","sourceRoot":"","sources":["../src/auth-password-secret.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EAGlC,KAAK,qBAAqB,EAC1B,KAAK,oCAAoC,EAC1C,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,eAAO,MAAM,uCAAuC,gCAAgC,CAAC;AACrF,eAAO,MAAM,yCAAyC,kCAAkC,CAAC;AACzF,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAElE,eAAO,MAAM,+BAA+B;;;;;;CAMlC,CAAC;AAEX,MAAM,MAAM,0CAA0C,GAAG;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,oCAAoC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAC5C,OAAO,GACP,aAAa,GACb,oBAAoB,GACpB,mBAAmB,GACnB,uBAAuB,CAAC;AAE5B,MAAM,MAAM,8BAA8B,GAAG;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,oCAAoC,CAAC;IAC7C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,6BAA6B,GAAG,IAAI,CAAC;IACvD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,CAAC;AAyGF,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO,CAAC,mBAAmB,EAAE;IAAE,SAAS,EAAE,gBAAgB,CAAA;CAAE,CAAC,GACxE,OAAO,CAAC,UAAU,CAAC,CA0CrB;AAqHD;;;GAGG;AACH,wBAAsB,qCAAqC,CACzD,EAAE,EAAE,WAAW,EACf,YAAY,EAAE,0CAA0C,EACxD,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAAC;IACT,YAAY,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC,CAkDD;AAuBD;;;;GAIG;AACH,wBAAsB,iCAAiC,CAAC,KAAK,EAAE;IAC7D,EAAE,EAAE,WAAW,CAAC;IAChB,YAAY,CAAC,EAAE,0CAA0C,CAAC;IAC1D,KAAK,EAAE,6BAA6B,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,gBAAgB,GAAG,WAAW,GAAG,QAAQ,CAAC,CA0FrD;AA8CD,wBAAsB,kCAAkC,CACtD,EAAE,EAAE,WAAW,EACf,YAAY,EAAE,0CAA0C,EACxD,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAC1B,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAsB3C;AAED,wBAAsB,4CAA4C,CAChE,EAAE,EAAE,WAAW,EACf,YAAY,EAAE,0CAA0C,EACxD,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAY3C"}
|