@hasna/recordings 0.3.13 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +279 -43
- package/bun.lock +37 -38
- package/contracts/v1/fixtures.json +1206 -0
- package/dist/cli/index.js +1909 -619
- package/dist/cli/macos-shortcut.d.ts +2 -2
- package/dist/contracts/hosted-v1.d.ts +105 -0
- package/dist/contracts/hosted-v1.d.ts.map +1 -0
- package/dist/contracts/hosted-v1.js +41 -0
- package/dist/contracts/stream-v1.d.ts +117 -0
- package/dist/contracts/stream-v1.d.ts.map +1 -0
- package/dist/contracts/stream-v1.js +35 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/pg-migrations.d.ts.map +1 -1
- package/dist/db/recordings.d.ts +6 -0
- package/dist/db/recordings.d.ts.map +1 -1
- package/dist/hosted/index.d.ts +58 -0
- package/dist/hosted/index.d.ts.map +1 -0
- package/dist/hosted/index.js +266 -0
- package/dist/hosted/transport.d.ts +36 -0
- package/dist/hosted/transport.d.ts.map +1 -0
- package/dist/hosted-v1-aavn7ktb.js +4114 -0
- package/dist/hosted-v1-gdr9extc.js +84 -0
- package/dist/http/client.d.ts +183 -22
- package/dist/http/client.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2879 -2288
- package/dist/lib/audio-artifact-storage.d.ts +98 -0
- package/dist/lib/audio-artifact-storage.d.ts.map +1 -0
- package/dist/lib/capture-probe.d.ts +3 -3
- package/dist/lib/capture-probe.d.ts.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/local-opt-in.d.ts +132 -0
- package/dist/lib/local-opt-in.d.ts.map +1 -0
- package/dist/lib/macos-bundle.d.ts +1 -1
- package/dist/lib/persistence-probe.d.ts +56 -17
- package/dist/lib/persistence-probe.d.ts.map +1 -1
- package/dist/lib/transcriber.d.ts.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1713 -459
- package/dist/sdk/index.d.ts +13 -5
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +904 -1
- package/dist/sdk/resolve.d.ts +53 -0
- package/dist/sdk/resolve.d.ts.map +1 -0
- package/dist/sdk/v1.generated.d.ts +6 -0
- package/dist/sdk/v1.generated.d.ts.map +1 -1
- package/dist/server/client-ip.d.ts +39 -0
- package/dist/server/client-ip.d.ts.map +1 -0
- package/dist/server/cloud-config.d.ts +12 -0
- package/dist/server/cloud-config.d.ts.map +1 -1
- package/dist/server/cloud-readiness.d.ts.map +1 -1
- package/dist/server/cloud.d.ts +20 -2
- package/dist/server/cloud.d.ts.map +1 -1
- package/dist/server/index.js +590 -287
- package/dist/server/migrate-command.d.ts +1 -1
- package/dist/server/migrate-command.d.ts.map +1 -1
- package/dist/server/openapi.d.ts +21 -0
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/repo.d.ts.map +1 -1
- package/dist/server/serve.d.ts.map +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1358 -874
- package/dist/store.d.ts +12 -3
- package/dist/store.d.ts.map +1 -1
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -1
- package/docs/hosted-sdk.md +71 -0
- package/docs/wire-contracts.md +24 -0
- package/package.json +33 -11
- package/packaging/macos/build_release_pkg.sh +3 -3
- package/packaging/macos/managed_bootstrap.sh +4 -4
- package/packaging/macos/scripts/postinstall +2 -2
- package/packaging/macos/scripts/preinstall +2 -2
- package/scripts/build_companion_cli.sh +7 -1
- package/scripts/ci-linux-suite.ts +23 -13
- package/scripts/install_macos_app.sh +27 -24
- package/scripts/macos_artifact.ts +60 -49
- package/scripts/migrate.ts +4 -20
- package/scripts/native/prebuilds/darwin-universal/recordings_fs_guard.node +0 -0
- package/scripts/native/recordings_fs_guard.c +36 -4
- package/scripts/native-core-receipt.py +171 -0
- package/scripts/native_fs_guard.ts +2 -0
- package/scripts/release-suite-gate.ts +227 -150
- package/scripts/resolve_tailscale_cli.sh +24 -3
- package/scripts/smoke_macos_app.sh +21 -21
- package/src/native/Recordings/App/ContentView.swift +53 -68
- package/src/native/Recordings/App/MenuBarStatusView.swift +171 -61
- package/src/native/Recordings/App/RecordWorkspaceView.swift +47 -449
- package/src/native/Recordings/App/RecorderSettingsView.swift +75 -0
- package/src/native/Recordings/App/RecordingDetailView.swift +3 -4
- package/src/native/Recordings/App/RecordingsApp.swift +185 -9
- package/src/native/Recordings/App/RecordingsListView.swift +60 -112
- package/src/native/Recordings/App/RecordingsStore.swift +124 -109
- package/src/native/Recordings/App/Theme.swift +73 -61
- package/src/native/Recordings/Package.swift +1 -0
- package/src/native/Recordings/RecordingsLib/BlockingOperation.swift +29 -0
- package/src/native/Recordings/RecordingsLib/CaptureMonitor.swift +65 -0
- package/src/native/Recordings/RecordingsLib/Info.plist +3 -3
- package/src/native/Recordings/RecordingsLib/OpenAIAPIKeyStore.swift +75 -21
- package/src/native/Recordings/RecordingsLib/ProjectStore.swift +4 -4
- package/src/native/Recordings/RecordingsLib/Recording.swift +14 -2
- package/src/native/Recordings/RecordingsLib/RecordingEngine.swift +539 -89
- package/src/native/Recordings/RecordingsLib/RecordingGlassBackground.swift +34 -0
- package/src/native/Recordings/RecordingsLib/RecordingPasteTarget.swift +114 -0
- package/src/native/Recordings/RecordingsLib/RecordingProvider.swift +112 -0
- package/src/native/Recordings/RecordingsLib/RecordingsCLI.swift +17 -10
- package/src/native/Recordings/RecordingsLib/ServiceAPIConfiguration.swift +107 -0
- package/src/native/Recordings/RecordingsLib/ServiceConnectionView.swift +76 -0
- package/src/native/Recordings/RecordingsLib/SettingsView.swift +45 -149
- package/src/native/Recordings/RecordingsLib/SettingsWindowController.swift +48 -0
- package/src/native/Recordings/RecordingsTests/BlockingOperationTests.swift +85 -0
- package/src/native/Recordings/RecordingsTests/CLIRunnerTests.swift +454 -76
- package/src/native/Recordings/RecordingsTests/OpenAIAPIKeyStoreTests.swift +43 -38
- package/src/native/Recordings/RecordingsTests/PipeClosureFixture.swift +215 -0
- package/src/native/Recordings/RecordingsTests/ProjectStoreTests.swift +10 -10
- package/src/native/Recordings/RecordingsTests/RecorderSurfaceTests.swift +60 -0
- package/src/native/Recordings/RecordingsTests/RecordingDateTests.swift +26 -0
- package/src/native/Recordings/RecordingsTests/RecordingEngineDeliveryTests.swift +1 -1
- package/src/native/Recordings/RecordingsTests/RecordingFrozenPasteTargetTests.swift +50 -0
- package/src/native/Recordings/RecordingsTests/RecordingPasteTargetTrackerTests.swift +48 -0
- package/src/native/Recordings/RecordingsTests/RecordingProviderTests.swift +308 -0
- package/src/native/Recordings/RecordingsTests/RecordingStartGateTests.swift +1 -1
- package/src/native/Recordings/RecordingsTests/RecordingStartTimingTests.swift +123 -21
- package/src/native/Recordings/RecordingsTests/ServiceAPIConfigurationTests.swift +75 -0
- package/src/native/Recordings/RecordingsTests/SettingsWindowControllerTests.swift +28 -0
- package/src/native/Recordings/RecordingsTests/TestHomeDirectory.swift +5 -1
- package/src/native/Recordings/Updater/BootstrapPreflight/BootstrapPreflightMain.swift +1 -1
- package/src/native/Recordings/Updater/Broker/ApplicationNamespace.swift +2 -2
- package/src/native/Recordings/Updater/Broker/BrokerMain.swift +1 -1
- package/src/native/Recordings/Updater/Broker/CanonicalTreeCopy.swift +1 -1
- package/src/native/Recordings/Updater/Broker/InstallJournal.swift +1 -1
- package/src/native/Recordings/Updater/BrokerTests/ActivationRecoveryPolicyTests.swift +2 -2
- package/src/native/Recordings/Updater/Protocol/UpdateProtocol.swift +1 -1
- package/src/native/Recordings/Updater/VerifierLauncher/RecordingsVerifierLauncher.c +2 -2
- package/src/native/Recordings/build.sh +8 -7
- package/dist/__tests__/helpers/installer-guard-execution.d.ts +0 -22
- package/dist/__tests__/helpers/installer-guard-execution.d.ts.map +0 -1
- package/dist/__tests__/helpers/installer-preflight.d.ts +0 -22
- package/dist/__tests__/helpers/installer-preflight.d.ts.map +0 -1
- package/dist/__tests__/helpers/native-fs-guard.d.ts +0 -2
- package/dist/__tests__/helpers/native-fs-guard.d.ts.map +0 -1
- package/dist/__tests__/helpers/source-assertions.d.ts +0 -171
- package/dist/__tests__/helpers/source-assertions.d.ts.map +0 -1
- package/dist/__tests__/preload.d.ts +0 -2
- package/dist/__tests__/preload.d.ts.map +0 -1
- package/src/native/Recordings/App/SidebarView.swift +0 -212
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { RecordingsV1Client, type RecordingsV1ClientOptions } from "./v1.generated.js";
|
|
2
|
+
import type { RecordsCredentialChainOptions } from "../http/client.js";
|
|
3
|
+
/** The unhosted `recordings-serve` a workstation runs. Never a hosted authority. */
|
|
4
|
+
export declare const RECORDINGS_LOCAL_SERVE_URL = "http://localhost:8874";
|
|
5
|
+
type Env = Record<string, string | undefined>;
|
|
6
|
+
export interface RecordingsSdkTransport {
|
|
7
|
+
/** `"http"` for a resolved hosted authority, `"local-serve"` for the unhosted default. */
|
|
8
|
+
mode: "http" | "local-serve";
|
|
9
|
+
/**
|
|
10
|
+
* Origin (plus any gateway path prefix) WITHOUT the `/v1` suffix, so a caller
|
|
11
|
+
* that composes `/v1/...` gets exactly one version segment.
|
|
12
|
+
*/
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
/** The credential, or null in local mode. */
|
|
15
|
+
apiKey: string | null;
|
|
16
|
+
/** WHERE the credential came from — an env key NAME, a Keychain reference, a path. Never a value. */
|
|
17
|
+
apiKeySource: string | null;
|
|
18
|
+
/** WHERE the authority came from, or `"local-serve"`. */
|
|
19
|
+
apiUrlSource: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ResolveRecordingsSdkTransportOptions {
|
|
22
|
+
/** Tier 1: an explicit authority. Used verbatim, minus a trailing slash. */
|
|
23
|
+
baseUrl?: string | undefined;
|
|
24
|
+
/** Tier 1: an explicit credential. */
|
|
25
|
+
apiKey?: string | undefined;
|
|
26
|
+
/** Tier 1 profile selection and the injectable `security` runner tests use. */
|
|
27
|
+
credentials?: RecordsCredentialChainOptions;
|
|
28
|
+
/** Defaults to `process.env`. */
|
|
29
|
+
env?: Env;
|
|
30
|
+
/** Where the one-line local-mode notice goes. Defaults to `process.stderr`. */
|
|
31
|
+
notice?: (line: string) => void;
|
|
32
|
+
}
|
|
33
|
+
/** Reset the once-per-process local-mode notice. Test seam only. */
|
|
34
|
+
export declare function __resetRecordingsSdkLocalNotice(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the SDK's authority and credential. Explicit arguments win; otherwise
|
|
37
|
+
* the @hasna/contracts chain decides, and only the deliberate unhosted opt-in
|
|
38
|
+
* lands on the local serve. Every refusal throws — there is no fallback.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveRecordingsSdkTransport(options?: ResolveRecordingsSdkTransportOptions): RecordingsSdkTransport;
|
|
41
|
+
/**
|
|
42
|
+
* Build the hosted `/v1` client with the fleet resolver behind it — the
|
|
43
|
+
* generated {@link RecordingsV1Client} takes an explicit `baseUrl` and has no
|
|
44
|
+
* environment surface of its own, which left every caller writing a private
|
|
45
|
+
* copy of the chain.
|
|
46
|
+
*
|
|
47
|
+
* Throws when no credential resolves and takes the unhosted opt-in: this client
|
|
48
|
+
* speaks only to the hosted authority, so there is no local mode to degrade
|
|
49
|
+
* to.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createRecordingsV1Client(options?: ResolveRecordingsSdkTransportOptions & Pick<RecordingsV1ClientOptions, "fetch" | "headers">): RecordingsV1Client;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/sdk/resolve.ts"],"names":[],"mappings":"AA+CA,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAKvF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvE,oFAAoF;AACpF,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,0FAA0F;IAC1F,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IAC7B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,qGAAqG;IACrG,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oCAAoC;IACnD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,6BAA6B,CAAC;IAC5C,iCAAiC;IACjC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,+EAA+E;IAC/E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAID,oEAAoE;AACpE,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD;AAiBD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,oCAAyC,GACjD,sBAAsB,CA+FxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,oCAAoC,GAAG,IAAI,CAAC,yBAAyB,EAAE,OAAO,GAAG,SAAS,CAAM,GACxG,kBAAkB,CAqDpB"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export interface Recording {
|
|
2
2
|
"id"?: string;
|
|
3
3
|
"audio_path"?: string | null;
|
|
4
|
+
"audio_object_key"?: string | null;
|
|
5
|
+
"audio_sha256"?: string | null;
|
|
6
|
+
"audio_bytes"?: number | null;
|
|
4
7
|
"raw_text"?: string;
|
|
5
8
|
"processed_text"?: string | null;
|
|
6
9
|
"processing_mode"?: "raw" | "enhanced";
|
|
@@ -40,6 +43,9 @@ export interface CreateRecordingInput {
|
|
|
40
43
|
"id"?: string;
|
|
41
44
|
"raw_text": string;
|
|
42
45
|
"audio_path"?: string;
|
|
46
|
+
"audio_object_key"?: string;
|
|
47
|
+
"audio_sha256"?: string;
|
|
48
|
+
"audio_bytes"?: number;
|
|
43
49
|
"processed_text"?: string;
|
|
44
50
|
"processing_mode"?: "raw" | "enhanced";
|
|
45
51
|
"model_used"?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v1.generated.d.ts","sourceRoot":"","sources":["../../src/sdk/v1.generated.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,iBAAiB,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;
|
|
1
|
+
{"version":3,"file":"v1.generated.d.ts","sourceRoot":"","sources":["../../src/sdk/v1.generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const TRUST_PROXY_ENV = "RECORDINGS_TRUST_PROXY";
|
|
2
|
+
export declare const TRUSTED_PROXIES_ENV = "RECORDINGS_TRUSTED_PROXIES";
|
|
3
|
+
/** Reject anything that is not a bare IP literal (optionally bracketed / ported). */
|
|
4
|
+
export declare function normalizeIpLiteral(raw: string | null | undefined): string | null;
|
|
5
|
+
/** Parse and validate `X-Forwarded-For` into bare IP literals, left -> right. */
|
|
6
|
+
export declare function parseForwardedFor(header: string | null | undefined): string[];
|
|
7
|
+
/** Parse the trusted-proxy allowlist: bare IPs and CIDR blocks (v4 + v6). */
|
|
8
|
+
export declare function parseTrustedProxies(raw: string | null | undefined): string[];
|
|
9
|
+
/** True when `ip` is one of the trusted proxies, exactly or inside a CIDR. */
|
|
10
|
+
export declare function isTrustedAddress(ip: string | null | undefined, trusted: readonly string[]): boolean;
|
|
11
|
+
export declare const TRUST_TRUE_VALUES: Set<string>;
|
|
12
|
+
/** Operator opt-in: true only when this service sits behind trusted proxies. */
|
|
13
|
+
export declare function resolveTrustProxy(env?: NodeJS.ProcessEnv): boolean;
|
|
14
|
+
/** Trusted proxy addresses/CIDRs configured by the operator (validated). */
|
|
15
|
+
export declare function trustedProxiesFromEnv(env?: NodeJS.ProcessEnv): string[];
|
|
16
|
+
export interface RequestClientIpInput {
|
|
17
|
+
headers: Headers;
|
|
18
|
+
/** Socket peer address, e.g. `server.requestIP(req)?.address`. */
|
|
19
|
+
socketAddress?: string | null;
|
|
20
|
+
trustProxy?: boolean;
|
|
21
|
+
/** Validated entries from `parseTrustedProxies`. */
|
|
22
|
+
trustedProxies?: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the address rate-limit buckets and audit rows are keyed on.
|
|
26
|
+
*
|
|
27
|
+
* Trust is OFF by default: forwarding headers are ignored entirely and the
|
|
28
|
+
* socket peer address is used, so local/dev behavior is unchanged and a
|
|
29
|
+
* spoofed `x-forwarded-for` can never mint fresh buckets.
|
|
30
|
+
*
|
|
31
|
+
* With trust ON the rule is: validated `x-real-ip` (the gateway overwrites it
|
|
32
|
+
* with the true client IP; direct spoofing is moot because the socket peer is
|
|
33
|
+
* itself a trusted proxy) -> first untrusted entry of `x-forwarded-for`
|
|
34
|
+
* counted from the RIGHT (skipping trusted proxies) -> socket peer. Any entry
|
|
35
|
+
* that is not a bare IP literal is dropped; a header that yields nothing falls
|
|
36
|
+
* back to the socket peer, which no header can forge.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveRequestClientIp(input: RequestClientIpInput): string | null;
|
|
39
|
+
//# sourceMappingURL=client-ip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-ip.d.ts","sourceRoot":"","sources":["../../src/server/client-ip.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,eAAe,2BAA2B,CAAC;AACxD,eAAO,MAAM,mBAAmB,+BAA+B,CAAC;AAEhE,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAyBhF;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAM7E;AA0ED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAY5E;AAWD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAYT;AAED,eAAO,MAAM,iBAAiB,aAAsC,CAAC;AAErE,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE/E;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAEpF;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAqBjF"}
|
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
export type DataBackend = "sqlite" | "postgresql";
|
|
3
3
|
/** Resolve the PostgreSQL DSN from the supported env vars (priority order). */
|
|
4
4
|
export declare function resolveDatabaseUrl(env?: NodeJS.ProcessEnv): string | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the PostgreSQL DSN used by the one-shot `migrate` operator verb.
|
|
7
|
+
*
|
|
8
|
+
* In the two-role deploy model the MIGRATION role owns the schema (it runs
|
|
9
|
+
* DDL) while the RUNTIME role (`resolveDatabaseUrl`, used by `/v1` and
|
|
10
|
+
* `/ready`) is DML-only, so the strict `assertCloudSchemaReady` posture
|
|
11
|
+
* contract can pass. A dedicated migration DSN is configured via
|
|
12
|
+
* `HASNA_RECORDINGS_MIGRATE_DATABASE_URL` (or `RECORDINGS_MIGRATE_DATABASE_URL`);
|
|
13
|
+
* when none is set the migrate falls back to the runtime DSN for
|
|
14
|
+
* single-role setups.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveMigrationDatabaseUrl(env?: NodeJS.ProcessEnv): string | undefined;
|
|
5
17
|
/**
|
|
6
18
|
* The backend this process will use: `postgresql` when a DSN is present,
|
|
7
19
|
* `sqlite` otherwise.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-config.d.ts","sourceRoot":"","sources":["../../src/server/cloud-config.ts"],"names":[],"mappings":"AASA,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;AAElD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAO3F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,WAAW,CAEpF;AAED,6DAA6D;AAC7D,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEtF;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAO7F;AAED,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAWjF"}
|
|
1
|
+
{"version":3,"file":"cloud-config.d.ts","sourceRoot":"","sources":["../../src/server/cloud-config.ts"],"names":[],"mappings":"AASA,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;AAElD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAO3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAMpG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,WAAW,CAEpF;AAED,6DAA6D;AAC7D,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEtF;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAO7F;AAED,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAWjF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-readiness.d.ts","sourceRoot":"","sources":["../../src/server/cloud-readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-readiness.d.ts","sourceRoot":"","sources":["../../src/server/cloud-readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAoL9D,sFAAsF;AACtF,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAqHf;AAED,kFAAkF;AAClF,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,KAAK,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CAsIf;AAED,gFAAgF;AAChF,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAI7F;AAED,qFAAqF;AACrF,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,KAAK,CAAC,GACtC,OAAO,CAAC,OAAO,CAAC,CAIlB"}
|
package/dist/server/cloud.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { type ApiKeyVerifier } from "@hasna/contracts/auth";
|
|
|
14
14
|
import { ApiKeyStore } from "@hasna/contracts/auth";
|
|
15
15
|
import { PgAdapterAsync } from "../db/remote-storage.js";
|
|
16
16
|
export declare const RECORDINGS_APP_SLUG = "recordings";
|
|
17
|
-
export { isPostgresBackendEnabled, resolveDataBackend, requireSigningSecret, resolveDatabaseUrl, resolveSigningSecret, } from "./cloud-config.js";
|
|
17
|
+
export { isPostgresBackendEnabled, resolveDataBackend, requireSigningSecret, resolveDatabaseUrl, resolveMigrationDatabaseUrl, resolveSigningSecret, } from "./cloud-config.js";
|
|
18
18
|
export type { DataBackend } from "./cloud-config.js";
|
|
19
19
|
/** The pure-remote Postgres adapter backing every `/v1` handler. */
|
|
20
20
|
export declare function getCloudPg(): PgAdapterAsync;
|
|
@@ -25,12 +25,30 @@ export declare function getApiKeyStore(): ApiKeyStore;
|
|
|
25
25
|
* `api_keys` table. Fails closed when no signing secret is configured.
|
|
26
26
|
*/
|
|
27
27
|
export declare function getCloudVerifier(): ApiKeyVerifier;
|
|
28
|
+
/**
|
|
29
|
+
* The one-shot migrate operator adapter: resolves the MIGRATION DSN
|
|
30
|
+
* (`HASNA_RECORDINGS_MIGRATE_DATABASE_URL` / `RECORDINGS_MIGRATE_DATABASE_URL`,
|
|
31
|
+
* falling back to the runtime DSN). In the two-role deploy model this role
|
|
32
|
+
* owns the schema (runs DDL); the runtime `DATABASE_URL` role is DML-only.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getMigrationPg(): PgAdapterAsync;
|
|
28
35
|
/**
|
|
29
36
|
* Apply the owner-managed relational and API-key schemas. This is intentionally
|
|
30
37
|
* separate from runtime readiness so it can bootstrap an empty database and
|
|
31
38
|
* upgrade a migration-17 database before the migration-18 contract is checked.
|
|
32
39
|
*/
|
|
33
|
-
export declare function migrateCloudSchema(): Promise<void>;
|
|
40
|
+
export declare function migrateCloudSchema(pg?: PgAdapterAsync): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* One-shot `recordings-serve migrate` orchestration shared by the compiled
|
|
43
|
+
* server entrypoint and the source `scripts/migrate.ts` runner.
|
|
44
|
+
*
|
|
45
|
+
* The schema is applied with the MIGRATION role; the shape contract is then
|
|
46
|
+
* validated. When a dedicated migration DSN is configured (two-role deploy
|
|
47
|
+
* model), the RUNTIME role's full DML-only posture is validated afterwards so
|
|
48
|
+
* a misconfigured runtime role fails here with the exact contract message
|
|
49
|
+
* instead of surfacing later as an opaque /ready or /v1 503.
|
|
50
|
+
*/
|
|
51
|
+
export declare function runRecordedMigration(): Promise<void>;
|
|
34
52
|
/** Request-path gate: validate the externally managed schema and DML-only role. */
|
|
35
53
|
export declare function ensureCloudSchema(): Promise<void>;
|
|
36
54
|
export declare function pingCloudConnectivity(pg?: Pick<PgAdapterAsync, "get">): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/server/cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAwB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/server/cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAwB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAczD,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD,oEAAoE;AACpE,wBAAgB,UAAU,IAAI,cAAc,CAU3C;AAqBD,wBAAgB,cAAc,IAAI,WAAW,CAI5C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAsBjD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,cAAc,CAQ/C;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,GAAE,cAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB1D;AAED,mFAAmF;AACnF,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOvD;AAED,wBAAsB,qBAAqB,CACzC,EAAE,GAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAgB,GAC7C,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,wEAAwE;AACxE,wBAAsB,SAAS,CAC7B,EAAE,GAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,KAAK,CAAgB,GACrD,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,4BAA4B;AAC5B,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD"}
|