@hasna/recordings 0.2.14 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/Dockerfile.package +4 -5
  2. package/README.md +113 -8
  3. package/bun.lock +2 -2
  4. package/dist/__tests__/helpers/installer-guard-execution.d.ts +22 -0
  5. package/dist/__tests__/helpers/installer-guard-execution.d.ts.map +1 -0
  6. package/dist/__tests__/helpers/installer-preflight.d.ts +22 -0
  7. package/dist/__tests__/helpers/installer-preflight.d.ts.map +1 -0
  8. package/dist/__tests__/helpers/native-fs-guard.d.ts.map +1 -1
  9. package/dist/__tests__/helpers/source-assertions.d.ts +169 -0
  10. package/dist/__tests__/helpers/source-assertions.d.ts.map +1 -0
  11. package/dist/__tests__/preload.d.ts +1 -4
  12. package/dist/__tests__/preload.d.ts.map +1 -1
  13. package/dist/cli/desktop-snapshot.d.ts +20 -0
  14. package/dist/cli/desktop-snapshot.d.ts.map +1 -0
  15. package/dist/cli/index.js +2094 -280
  16. package/dist/cli/macos-permissions.d.ts +72 -0
  17. package/dist/cli/macos-permissions.d.ts.map +1 -1
  18. package/dist/cli/macos-shortcut.d.ts +139 -0
  19. package/dist/cli/macos-shortcut.d.ts.map +1 -0
  20. package/dist/cli/trigger-probe.d.ts +172 -0
  21. package/dist/cli/trigger-probe.d.ts.map +1 -0
  22. package/dist/db/database.d.ts +9 -0
  23. package/dist/db/database.d.ts.map +1 -1
  24. package/dist/http/client.d.ts +19 -7
  25. package/dist/http/client.d.ts.map +1 -1
  26. package/dist/index.d.ts +3 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +635 -50
  29. package/dist/lib/capture-probe.d.ts +216 -0
  30. package/dist/lib/capture-probe.d.ts.map +1 -0
  31. package/dist/lib/config.d.ts.map +1 -1
  32. package/dist/lib/macos-bundle.d.ts +50 -0
  33. package/dist/lib/macos-bundle.d.ts.map +1 -0
  34. package/dist/lib/persistence-probe.d.ts +208 -0
  35. package/dist/lib/persistence-probe.d.ts.map +1 -0
  36. package/dist/lib/recorder.d.ts.map +1 -1
  37. package/dist/lib/retired-deployment-modes.d.ts +24 -0
  38. package/dist/lib/retired-deployment-modes.d.ts.map +1 -0
  39. package/dist/lib/transcriber.d.ts +60 -0
  40. package/dist/lib/transcriber.d.ts.map +1 -1
  41. package/dist/mcp/index.js +141 -57
  42. package/dist/server/cloud-config.d.ts +25 -3
  43. package/dist/server/cloud-config.d.ts.map +1 -1
  44. package/dist/server/cloud-readiness.d.ts.map +1 -1
  45. package/dist/server/cloud.d.ts +8 -7
  46. package/dist/server/cloud.d.ts.map +1 -1
  47. package/dist/server/index.js +188 -80
  48. package/dist/server/migrate-command.d.ts.map +1 -1
  49. package/dist/server/serve.d.ts.map +1 -1
  50. package/dist/storage.d.ts +2 -2
  51. package/dist/storage.d.ts.map +1 -1
  52. package/dist/storage.js +109 -50
  53. package/dist/store.d.ts +1 -1
  54. package/dist/store.d.ts.map +1 -1
  55. package/dist/version.d.ts +1 -1
  56. package/dist/version.d.ts.map +1 -1
  57. package/package.json +25 -6
  58. package/scripts/ci-linux-suite.ts +403 -0
  59. package/scripts/ci-native-build.ts +402 -0
  60. package/scripts/enforce_identity_migration.sh +110 -0
  61. package/scripts/generate-sdk.ts +1 -1
  62. package/scripts/install_macos_app.sh +192 -31
  63. package/scripts/macos_artifact.ts +323 -43
  64. package/scripts/native/realtime-settle-probe/README.md +39 -0
  65. package/scripts/native/realtime-settle-probe/main.swift +135 -0
  66. package/scripts/policy/local-only-approved-targets.txt +21 -0
  67. package/scripts/read_local_only_targets.sh +203 -0
  68. package/scripts/scan-artifact.ts +40 -0
  69. package/scripts/set-version.ts +145 -0
  70. package/scripts/smoke_macos_app.sh +62 -16
  71. package/scripts/vacuity-manifest-gen.ts +96 -0
  72. package/scripts/vacuity-manifests/enhancement-screen-mirror.tsv +44 -0
  73. package/scripts/vacuity-manifests/install-chain.tsv +13 -0
  74. package/scripts/vacuity-manifests/must-survive-controls.tsv +10 -0
  75. package/scripts/vacuity-manifests/reorder.tsv +4 -0
  76. package/scripts/vacuity-manifests/source-side.tsv +15 -0
  77. package/scripts/vacuity-manifests/variable-operands.tsv +16 -0
  78. package/scripts/vacuity-manifests/version-sites.tsv +61 -0
  79. package/scripts/vacuity-mutation-battery.ts +266 -0
  80. package/src/native/Recordings/App/MenuBarStatusView.swift +23 -11
  81. package/src/native/Recordings/App/RecordingsApp.swift +37 -1
  82. package/src/native/Recordings/App/RuntimeSmoke.swift +5 -1
  83. package/src/native/Recordings/App/SidebarView.swift +1 -1
  84. package/src/native/Recordings/Package.swift +24 -5
  85. package/src/native/Recordings/RecordingsLib/EnhancementScreen.swift +91 -0
  86. package/src/native/Recordings/RecordingsLib/FnKeyMonitor.swift +27 -4
  87. package/src/native/Recordings/RecordingsLib/Info.plist +2 -2
  88. package/src/native/Recordings/RecordingsLib/MenuBarPresentation.swift +56 -3
  89. package/src/native/Recordings/RecordingsLib/NativePCMRecorder.swift +13 -0
  90. package/src/native/Recordings/RecordingsLib/PasteDeliveryVerification.swift +460 -0
  91. package/src/native/Recordings/RecordingsLib/PermissionRequestLaunchPlan.swift +21 -1
  92. package/src/native/Recordings/RecordingsLib/RealtimeTranscriptionClient.swift +41 -7
  93. package/src/native/Recordings/RecordingsLib/RecordingAttemptAlert.swift +36 -0
  94. package/src/native/Recordings/RecordingsLib/RecordingEngine.swift +1071 -75
  95. package/src/native/Recordings/RecordingsLib/SettingsView.swift +47 -3
  96. package/src/native/Recordings/RecordingsLib/VoiceShortcuts.swift +11 -6
  97. package/src/native/Recordings/RecordingsTests/BarOnlyLaunchPlanTests.swift +99 -0
  98. package/src/native/Recordings/RecordingsTests/CLIRunnerTests.swift +3 -3
  99. package/src/native/Recordings/RecordingsTests/EnhancementScreenTests.swift +191 -0
  100. package/src/native/Recordings/RecordingsTests/MenuBarPresentationTests.swift +144 -4
  101. package/src/native/Recordings/RecordingsTests/PasteDeliveryVerificationTests.swift +463 -0
  102. package/src/native/Recordings/RecordingsTests/PasteTargetTests.swift +33 -20
  103. package/src/native/Recordings/RecordingsTests/ProjectStoreTests.swift +1 -1
  104. package/src/native/Recordings/RecordingsTests/RealtimeSettleBenchmark.swift +200 -0
  105. package/src/native/Recordings/RecordingsTests/RealtimeSettleBudgetTests.swift +80 -0
  106. package/src/native/Recordings/RecordingsTests/RealtimeTranscriptionTests.swift +22 -4
  107. package/src/native/Recordings/RecordingsTests/RecordingEngineDeliveryTests.swift +12 -6
  108. package/src/native/Recordings/RecordingsTests/RecordingEngineHomeIsolationTests.swift +67 -0
  109. package/src/native/Recordings/RecordingsTests/RecordingStartGateTests.swift +12 -3
  110. package/src/native/Recordings/RecordingsTests/RecordingStartTimingTests.swift +207 -11
  111. package/src/native/Recordings/RecordingsTests/SpeechIntentTests.swift +17 -6
  112. package/src/native/Recordings/RecordingsTests/TestHomeDirectory.swift +23 -0
  113. package/src/native/Recordings/Updater/Broker/ApplicationProcessQuiescence.swift +7 -1
  114. package/src/native/Recordings/Updater/Broker/AtomicActivation.swift +10 -10
  115. package/src/native/Recordings/Updater/Broker/BrokerMain.swift +5 -1
  116. package/src/native/Recordings/Updater/Broker/HostOSProductVersion.swift +1 -0
  117. package/src/native/Recordings/Updater/Broker/PeerIdentity.swift +59 -3
  118. package/src/native/Recordings/Updater/Protocol/UpdateProtocol.swift +21 -2
  119. package/src/native/Recordings/Updater/ProtocolTests/ExpectationIntegrityTests.swift +60 -0
  120. package/src/native/Recordings/Updater/ProtocolTests/UpdateXPCInterfaceTests.swift +113 -0
  121. package/src/native/Recordings/Updater/VerifierLauncher/RecordingsVerifierLauncher.c +106 -5
  122. package/src/native/Recordings/build.sh +226 -20
  123. package/scripts/native/prebuilds/darwin-universal/recordings_fs_guard.node +0 -0
@@ -18,7 +18,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
18
18
  var __require = import.meta.require;
19
19
 
20
20
  // src/version.ts
21
- var VERSION = "0.2.14";
21
+ var VERSION = "0.3.2";
22
22
 
23
23
  // src/db/remote-storage.ts
24
24
  import pg from "pg";
@@ -82,29 +82,84 @@ class PgAdapterAsync {
82
82
  }
83
83
  var init_remote_storage = () => {};
84
84
 
85
+ // src/lib/retired-deployment-modes.ts
86
+ function normalizeModeToken(value) {
87
+ return value.trim().toLowerCase().replace(/-/g, "_");
88
+ }
89
+ function asRetiredDeploymentMode(value) {
90
+ const token = normalizeModeToken(value);
91
+ return RETIRED_DEPLOYMENT_MODES.includes(token) ? token : null;
92
+ }
93
+ function retiredDeploymentModeError(rawValue, sourceEnvKey, replacement) {
94
+ const mode = asRetiredDeploymentMode(rawValue);
95
+ const value = mode === "local" ? replacement.onBox : replacement.offBox;
96
+ return new Error(`${sourceEnvKey}=${rawValue} names a deployment mode, and deployment modes are removed: ` + `${RETIRED_DEPLOYMENT_MODES.join(" | ")} no longer select anything. ` + `Set ${replacement.envKey}=${value} instead ` + `(${replacement.envKey} takes ${replacement.onBox} or ${replacement.offBox}).`);
97
+ }
98
+ var RETIRED_DEPLOYMENT_MODES;
99
+ var init_retired_deployment_modes = __esm(() => {
100
+ RETIRED_DEPLOYMENT_MODES = [
101
+ "local",
102
+ "self_hosted",
103
+ "cloud",
104
+ "remote",
105
+ "hybrid"
106
+ ];
107
+ });
108
+
85
109
  // src/server/cloud-config.ts
110
+ function backendReplacement() {
111
+ return { envKey: DATA_BACKEND_ENV_KEYS[0], onBox: "sqlite", offBox: "postgresql" };
112
+ }
86
113
  function resolveCloudDatabaseUrl(env = process.env) {
87
114
  return env.HASNA_RECORDINGS_DATABASE_URL || env.RECORDINGS_DATABASE_URL || env.DATABASE_URL || undefined;
88
115
  }
116
+ function configuredDataBackend(env = process.env) {
117
+ for (const key of DATA_BACKEND_ENV_KEYS) {
118
+ const raw = env[key]?.trim();
119
+ if (!raw)
120
+ continue;
121
+ const token = normalizeModeToken(raw);
122
+ if (token === "sqlite")
123
+ return { backend: "sqlite", source: key };
124
+ if (token === "postgresql" || token === "postgres")
125
+ return { backend: "postgresql", source: key };
126
+ if (asRetiredDeploymentMode(raw)) {
127
+ throw retiredDeploymentModeError(raw, key, backendReplacement());
128
+ }
129
+ throw new Error(`${key}=${raw} is not a data backend. Use ${DATA_BACKEND_ENV_KEYS[0]}=sqlite or ` + `${DATA_BACKEND_ENV_KEYS[0]}=postgresql.`);
130
+ }
131
+ return null;
132
+ }
133
+ function resolveDataBackend(env = process.env) {
134
+ const configured = configuredDataBackend(env);
135
+ if (configured)
136
+ return configured.backend;
137
+ return resolveCloudDatabaseUrl(env) ? "postgresql" : "sqlite";
138
+ }
139
+ function isPostgresBackendEnabled(env = process.env) {
140
+ return resolveDataBackend(env) === "postgresql";
141
+ }
89
142
  function resolveSigningSecret(env = process.env) {
90
143
  return env.HASNA_RECORDINGS_API_SIGNING_KEY || env.HASNA_API_SIGNING_KEY || env.API_KEY_SIGNING_SECRET || undefined;
91
144
  }
92
145
  function requireSigningSecret(env = process.env) {
93
146
  const signingSecret = resolveSigningSecret(env);
94
147
  if (!signingSecret) {
95
- throw new Error("Cloud /v1 auth requires a signing secret (HASNA_RECORDINGS_API_SIGNING_KEY / HASNA_API_SIGNING_KEY / API_KEY_SIGNING_SECRET).");
148
+ throw new Error("The /v1 API requires a signing secret (HASNA_RECORDINGS_API_SIGNING_KEY / HASNA_API_SIGNING_KEY / API_KEY_SIGNING_SECRET).");
96
149
  }
97
150
  if (Buffer.byteLength(signingSecret, "utf8") < 16) {
98
- throw new Error("Cloud /v1 auth signing secret must be at least 16 bytes.");
151
+ throw new Error("The /v1 API signing secret must be at least 16 bytes.");
99
152
  }
100
153
  return signingSecret;
101
154
  }
102
- function isCloudModeEnabled(env = process.env) {
103
- const mode = (env.HASNA_RECORDINGS_STORAGE_MODE || env.RECORDINGS_STORAGE_MODE || "").toLowerCase();
104
- if (mode === "remote" || mode === "hybrid")
105
- return true;
106
- return Boolean(resolveCloudDatabaseUrl(env));
107
- }
155
+ var DATA_BACKEND_ENV_KEYS;
156
+ var init_cloud_config = __esm(() => {
157
+ init_retired_deployment_modes();
158
+ DATA_BACKEND_ENV_KEYS = [
159
+ "HASNA_RECORDINGS_STORAGE_MODE",
160
+ "RECORDINGS_STORAGE_MODE"
161
+ ];
162
+ });
108
163
 
109
164
  // src/server/cloud-readiness.ts
110
165
  var exports_cloud_readiness = {};
@@ -145,7 +200,11 @@ async function assertCloudSchemaContract(pg2) {
145
200
  }
146
201
  }
147
202
  const idempotencyColumns = columns.filter((column) => column.table_name === "recording_idempotency");
148
- const expectedIdempotencyColumns = Object.keys(REQUIRED_COLUMNS.recording_idempotency);
203
+ const expectedIdempotencySpec = REQUIRED_COLUMNS.recording_idempotency;
204
+ if (expectedIdempotencySpec === undefined) {
205
+ throw new Error("cloud schema contract is missing recording_idempotency");
206
+ }
207
+ const expectedIdempotencyColumns = Object.keys(expectedIdempotencySpec);
149
208
  const unexpectedIdempotencyColumn = idempotencyColumns.find((column) => !expectedIdempotencyColumns.includes(column.column_name));
150
209
  if (unexpectedIdempotencyColumn) {
151
210
  throw new Error(`cloud schema has unexpected column: recording_idempotency.${unexpectedIdempotencyColumn.column_name}`);
@@ -590,7 +649,11 @@ async function applyRecordedCloudMigrations(pg2, ensureApiKeySchema) {
590
649
  for (let version = 0;version < PG_MIGRATIONS.length; version++) {
591
650
  if (appliedSet.has(version))
592
651
  continue;
593
- await pg2.exec(PG_MIGRATIONS[version]);
652
+ const migration = PG_MIGRATIONS[version];
653
+ if (migration === undefined) {
654
+ throw new Error(`Missing PostgreSQL migration at version ${version}`);
655
+ }
656
+ await pg2.exec(migration);
594
657
  await pg2.run("INSERT INTO _pg_migrations (version) VALUES (?) ON CONFLICT DO NOTHING", version);
595
658
  }
596
659
  await ensureApiKeySchema();
@@ -608,16 +671,18 @@ var init_migrate_command = __esm(() => {
608
671
  var exports_cloud = {};
609
672
  __export(exports_cloud, {
610
673
  resolveSigningSecret: () => resolveSigningSecret,
674
+ resolveDataBackend: () => resolveDataBackend,
611
675
  resolveCloudDatabaseUrl: () => resolveCloudDatabaseUrl,
612
676
  requireSigningSecret: () => requireSigningSecret,
613
677
  pingCloudConnectivity: () => pingCloudConnectivity2,
614
678
  pingCloud: () => pingCloud,
615
679
  migrateCloudSchema: () => migrateCloudSchema,
616
- isCloudModeEnabled: () => isCloudModeEnabled,
680
+ isPostgresBackendEnabled: () => isPostgresBackendEnabled,
617
681
  getCloudVerifier: () => getCloudVerifier,
618
682
  getCloudPg: () => getCloudPg,
619
683
  getApiKeyStore: () => getApiKeyStore,
620
684
  ensureCloudSchema: () => ensureCloudSchema,
685
+ configuredDataBackend: () => configuredDataBackend,
621
686
  closeCloud: () => closeCloud,
622
687
  RECORDINGS_APP_SLUG: () => RECORDINGS_APP_SLUG
623
688
  });
@@ -628,7 +693,7 @@ function getCloudPg() {
628
693
  return cachedPg;
629
694
  const url = resolveCloudDatabaseUrl();
630
695
  if (!url) {
631
- throw new Error("Cloud /v1 requires a remote database URL (HASNA_RECORDINGS_DATABASE_URL / RECORDINGS_DATABASE_URL / DATABASE_URL).");
696
+ throw new Error("The /v1 API requires a PostgreSQL database URL (HASNA_RECORDINGS_DATABASE_URL / RECORDINGS_DATABASE_URL / DATABASE_URL).");
632
697
  }
633
698
  cachedPg = new PgAdapterAsync(url);
634
699
  return cachedPg;
@@ -694,8 +759,10 @@ async function closeCloud() {
694
759
  var RECORDINGS_APP_SLUG = "recordings", cachedPg = null, cachedStore = null, cachedVerifier = null, schemaEnsured = null;
695
760
  var init_cloud = __esm(() => {
696
761
  init_remote_storage();
762
+ init_cloud_config();
697
763
  init_cloud_readiness();
698
764
  init_migrate_command();
765
+ init_cloud_config();
699
766
  });
700
767
 
701
768
  // src/db/errors.ts
@@ -1712,7 +1779,7 @@ function startMcpHttpServer(options) {
1712
1779
  var DEFAULT_MCP_HTTP_PORT = 8873, MCP_HTTP_HOST = "127.0.0.1";
1713
1780
  var init_http = () => {};
1714
1781
 
1715
- // node_modules/zod/v3/helpers/util.js
1782
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/util.js
1716
1783
  var util, objectUtil, ZodParsedType, getParsedType = (data) => {
1717
1784
  const t = typeof data;
1718
1785
  switch (t) {
@@ -1843,7 +1910,7 @@ var init_util = __esm(() => {
1843
1910
  ]);
1844
1911
  });
1845
1912
 
1846
- // node_modules/zod/v3/ZodError.js
1913
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/ZodError.js
1847
1914
  var ZodIssueCode, quotelessJson = (obj) => {
1848
1915
  const json2 = JSON.stringify(obj, null, 2);
1849
1916
  return json2.replace(/"([^"]+)":/g, "$1:");
@@ -1964,7 +2031,7 @@ var init_ZodError = __esm(() => {
1964
2031
  };
1965
2032
  });
1966
2033
 
1967
- // node_modules/zod/v3/locales/en.js
2034
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/locales/en.js
1968
2035
  var errorMap = (issue, _ctx) => {
1969
2036
  let message;
1970
2037
  switch (issue.code) {
@@ -2071,7 +2138,7 @@ var init_en = __esm(() => {
2071
2138
  en_default = errorMap;
2072
2139
  });
2073
2140
 
2074
- // node_modules/zod/v3/errors.js
2141
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/errors.js
2075
2142
  function setErrorMap(map) {
2076
2143
  overrideErrorMap = map;
2077
2144
  }
@@ -2084,7 +2151,7 @@ var init_errors2 = __esm(() => {
2084
2151
  overrideErrorMap = en_default;
2085
2152
  });
2086
2153
 
2087
- // node_modules/zod/v3/helpers/parseUtil.js
2154
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js
2088
2155
  function addIssueToContext(ctx, issueData) {
2089
2156
  const overrideMap = getErrorMap();
2090
2157
  const issue = makeIssue({
@@ -2189,10 +2256,10 @@ var init_parseUtil = __esm(() => {
2189
2256
  });
2190
2257
  });
2191
2258
 
2192
- // node_modules/zod/v3/helpers/typeAliases.js
2259
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/typeAliases.js
2193
2260
  var init_typeAliases = () => {};
2194
2261
 
2195
- // node_modules/zod/v3/helpers/errorUtil.js
2262
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js
2196
2263
  var errorUtil;
2197
2264
  var init_errorUtil = __esm(() => {
2198
2265
  (function(errorUtil2) {
@@ -2201,7 +2268,7 @@ var init_errorUtil = __esm(() => {
2201
2268
  })(errorUtil || (errorUtil = {}));
2202
2269
  });
2203
2270
 
2204
- // node_modules/zod/v3/types.js
2271
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/types.js
2205
2272
  class ParseInputLazyPath {
2206
2273
  constructor(parent, value, path, key) {
2207
2274
  this._cachedPath = [];
@@ -5552,7 +5619,7 @@ var init_types = __esm(() => {
5552
5619
  NEVER = INVALID;
5553
5620
  });
5554
5621
 
5555
- // node_modules/zod/v3/external.js
5622
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/external.js
5556
5623
  var exports_external = {};
5557
5624
  __export(exports_external, {
5558
5625
  void: () => voidType,
@@ -5672,7 +5739,7 @@ var init_external = __esm(() => {
5672
5739
  init_ZodError();
5673
5740
  });
5674
5741
 
5675
- // node_modules/zod/index.js
5742
+ // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/index.js
5676
5743
  var init_zod = __esm(() => {
5677
5744
  init_external();
5678
5745
  init_external();
@@ -6059,7 +6126,8 @@ function findProjectRecordingsPath(entry) {
6059
6126
  function findRepositoryRoot(start) {
6060
6127
  let dir = start;
6061
6128
  while (true) {
6062
- if (existsSync(join2(dir, ".git")))
6129
+ const gitPath = join2(dir, ".git");
6130
+ if (isRepositoryMarker(gitPath))
6063
6131
  return dir;
6064
6132
  const parent = dirname2(dir);
6065
6133
  if (parent === dir)
@@ -6067,6 +6135,15 @@ function findRepositoryRoot(start) {
6067
6135
  dir = parent;
6068
6136
  }
6069
6137
  }
6138
+ function isRepositoryMarker(gitPath) {
6139
+ try {
6140
+ if (statSync(gitPath).isFile())
6141
+ return true;
6142
+ return existsSync(join2(gitPath, "HEAD"));
6143
+ } catch {
6144
+ return false;
6145
+ }
6146
+ }
6070
6147
  function canonicalExistingPath(path) {
6071
6148
  try {
6072
6149
  return realpathSync2(path);
@@ -6095,14 +6172,17 @@ function loadSecretKey(keyName) {
6095
6172
  try {
6096
6173
  const content = readFileSync(candidate, "utf-8");
6097
6174
  const match = content.match(new RegExp(`export\\s+${keyName}\\s*=\\s*"([^"]+)"`));
6098
- if (match)
6099
- return match[1];
6175
+ const doubleQuotedValue = match?.[1];
6176
+ if (doubleQuotedValue !== undefined)
6177
+ return doubleQuotedValue;
6100
6178
  const match2 = content.match(new RegExp(`export\\s+${keyName}\\s*=\\s*'([^']+)'`));
6101
- if (match2)
6102
- return match2[1];
6179
+ const singleQuotedValue = match2?.[1];
6180
+ if (singleQuotedValue !== undefined)
6181
+ return singleQuotedValue;
6103
6182
  const match3 = content.match(new RegExp(`${keyName}\\s*=\\s*(.+)`));
6104
- if (match3)
6105
- return match3[1].trim().replace(/^["']|["']$/g, "");
6183
+ const unquotedValue = match3?.[1];
6184
+ if (unquotedValue !== undefined)
6185
+ return unquotedValue.trim().replace(/^["']|["']$/g, "");
6106
6186
  } catch {}
6107
6187
  }
6108
6188
  return "";
@@ -6247,7 +6327,11 @@ function runMigrations(db) {
6247
6327
  const currentLevel = result?.max_id ?? -1;
6248
6328
  for (let i = currentLevel + 1;i < MIGRATIONS.length; i++) {
6249
6329
  try {
6250
- db.run(MIGRATIONS[i]);
6330
+ const migration = MIGRATIONS[i];
6331
+ if (migration === undefined) {
6332
+ throw new Error(`Missing SQLite migration at version ${i}`);
6333
+ }
6334
+ db.run(migration);
6251
6335
  db.query("INSERT INTO _migrations (id) VALUES (?)").run(i);
6252
6336
  } catch (e) {
6253
6337
  if (isBenignMigrationError(e)) {
@@ -6284,7 +6368,7 @@ function ensureColumn(db, table, column, definition) {
6284
6368
  function shortUuid2() {
6285
6369
  return crypto.randomUUID().slice(0, 8);
6286
6370
  }
6287
- var _db = null, _adapter = null, MIGRATIONS;
6371
+ var _db = null, _adapter = null, MIGRATIONS, CURRENT_MIGRATION_LEVEL;
6288
6372
  var init_database = __esm(() => {
6289
6373
  init_sqlite_adapter();
6290
6374
  init_config();
@@ -6367,6 +6451,7 @@ var init_database = __esm(() => {
6367
6451
  ALTER TABLE agents ADD COLUMN active_project_id TEXT REFERENCES projects(id) ON DELETE SET NULL;
6368
6452
  `
6369
6453
  ];
6454
+ CURRENT_MIGRATION_LEVEL = MIGRATIONS.length - 1;
6370
6455
  });
6371
6456
 
6372
6457
  // src/db/recordings.ts
@@ -6648,24 +6733,28 @@ var init_feedback = __esm(() => {
6648
6733
  function envToken(name) {
6649
6734
  return name.toUpperCase().replace(/-/g, "_");
6650
6735
  }
6651
- function normalizeMode(value) {
6652
- const normalized = value.trim().toLowerCase().replace(/-/g, "_");
6653
- if (normalized === "local")
6654
- return { mode: "local", deprecatedAlias: null };
6655
- if (normalized === "cloud")
6656
- return { mode: "cloud", deprecatedAlias: null };
6657
- if (DEPRECATED_MODE_ALIASES.includes(normalized)) {
6658
- return { mode: "cloud", deprecatedAlias: normalized };
6736
+ function clientStoreReplacement(envKey) {
6737
+ return { envKey, onBox: "sqlite", offBox: "http" };
6738
+ }
6739
+ function normalizeClientStore(value, sourceEnvKey, replacementEnvKey) {
6740
+ const normalized = normalizeModeToken(value);
6741
+ if (normalized === "sqlite")
6742
+ return "sqlite";
6743
+ if (normalized === "http" || normalized === "https")
6744
+ return "http";
6745
+ if (asRetiredDeploymentMode(value)) {
6746
+ throw retiredDeploymentModeError(value, sourceEnvKey, clientStoreReplacement(replacementEnvKey));
6659
6747
  }
6660
- throw new Error(`Unknown storage mode: ${value}. Use local or cloud.`);
6748
+ throw new Error(`Unknown client store: ${value}. Use sqlite or http.`);
6661
6749
  }
6662
- function defaultCloudBaseUrl(name) {
6663
- return `https://${name}.hasna.xyz`;
6750
+ function defaultApiBaseUrl(name) {
6751
+ return `http://localhost:8874`;
6664
6752
  }
6665
6753
  function envKeys(name) {
6666
6754
  const token = envToken(name);
6667
6755
  return {
6668
- modeKeys: [`HASNA_${token}_STORAGE_MODE`, `HASNA_${token}_MODE`, `${token}_STORAGE_MODE`, `${token}_MODE`],
6756
+ storeKeys: [`HASNA_${token}_CLIENT_STORE`, `${token}_CLIENT_STORE`],
6757
+ retiredModeKeys: [`HASNA_${token}_STORAGE_MODE`, `HASNA_${token}_MODE`, `${token}_STORAGE_MODE`, `${token}_MODE`],
6669
6758
  apiUrlKeys: [`HASNA_${token}_API_URL`, `${token}_API_URL`],
6670
6759
  apiKeyKeys: [`HASNA_${token}_API_KEY`, `${token}_API_KEY`]
6671
6760
  };
@@ -6678,6 +6767,20 @@ function firstEnv(env, keys) {
6678
6767
  }
6679
6768
  return null;
6680
6769
  }
6770
+ function assertNoRetiredMode(env, keys) {
6771
+ for (const key of keys.retiredModeKeys) {
6772
+ const value = env[key]?.trim();
6773
+ if (!value)
6774
+ continue;
6775
+ const normalized = normalizeModeToken(value);
6776
+ if (SERVER_BACKEND_VALUES.includes(normalized))
6777
+ continue;
6778
+ if (asRetiredDeploymentMode(value)) {
6779
+ throw retiredDeploymentModeError(value, key, clientStoreReplacement(keys.storeKeys[0]));
6780
+ }
6781
+ throw new Error(`${key}=${value} is not a client store. ${key} no longer selects one; ` + `set ${keys.storeKeys[0]}=sqlite or ${keys.storeKeys[0]}=http instead.`);
6782
+ }
6783
+ }
6681
6784
  function toV1BaseUrl(apiUrl) {
6682
6785
  const url = new URL(apiUrl);
6683
6786
  if (url.protocol !== "http:" && url.protocol !== "https:") {
@@ -6693,45 +6796,42 @@ function toV1BaseUrl(apiUrl) {
6693
6796
  }
6694
6797
  function resolveTransport(name, env = process.env) {
6695
6798
  const keys = envKeys(name);
6696
- const modeHit = firstEnv(env, keys.modeKeys);
6799
+ assertNoRetiredMode(env, keys);
6800
+ const storeHit = firstEnv(env, keys.storeKeys);
6697
6801
  const urlHit = firstEnv(env, keys.apiUrlKeys);
6698
6802
  const keyHit = firstEnv(env, keys.apiKeyKeys);
6699
- let mode = "local";
6700
- let deprecatedAlias = null;
6803
+ let requested = "sqlite";
6701
6804
  let modeSource = "default";
6702
- if (modeHit) {
6703
- const normalized = normalizeMode(modeHit.value);
6704
- mode = normalized.mode;
6705
- deprecatedAlias = normalized.deprecatedAlias;
6706
- modeSource = modeHit.key;
6805
+ if (storeHit) {
6806
+ requested = normalizeClientStore(storeHit.value, storeHit.key, keys.storeKeys[0]);
6807
+ modeSource = storeHit.key;
6707
6808
  } else if (urlHit && keyHit) {
6708
- mode = "cloud";
6809
+ requested = "http";
6709
6810
  modeSource = "auto:api-url+api-key";
6710
6811
  }
6711
- if (mode === "local") {
6712
- return { transport: "local", mode, deprecatedAlias, modeSource, baseUrl: null, apiKeyPresent: Boolean(keyHit), misconfigured: false, warning: null };
6812
+ if (requested === "sqlite") {
6813
+ return { transport: "sqlite", requested, modeSource, baseUrl: null, apiKeyPresent: Boolean(keyHit), misconfigured: false, warning: null };
6713
6814
  }
6714
6815
  if (!keyHit) {
6715
6816
  return {
6716
- transport: "local",
6717
- mode,
6718
- deprecatedAlias,
6817
+ transport: "sqlite",
6818
+ requested,
6719
6819
  modeSource,
6720
6820
  baseUrl: null,
6721
6821
  apiKeyPresent: false,
6722
6822
  misconfigured: true,
6723
- warning: `${modeSource}=cloud but no API key is set (${keys.apiKeyKeys[0]}). Refusing to route to cloud.`
6823
+ warning: `${modeSource}=http but no API key is set (${keys.apiKeyKeys[0]}). Refusing to route to the API.`
6724
6824
  };
6725
6825
  }
6726
- const rawUrl = urlHit?.value ?? defaultCloudBaseUrl(name);
6826
+ const rawUrl = urlHit?.value ?? defaultApiBaseUrl(name);
6727
6827
  let baseUrl;
6728
6828
  try {
6729
6829
  baseUrl = toV1BaseUrl(rawUrl);
6730
6830
  } catch (error2) {
6731
6831
  const message = error2 instanceof Error ? error2.message : String(error2);
6732
- return { transport: "local", mode, deprecatedAlias, modeSource, baseUrl: null, apiKeyPresent: true, misconfigured: true, warning: `Invalid API URL: ${message}.` };
6832
+ return { transport: "sqlite", requested, modeSource, baseUrl: null, apiKeyPresent: true, misconfigured: true, warning: `Invalid API URL: ${message}.` };
6733
6833
  }
6734
- return { transport: "cloud-http", mode, deprecatedAlias, modeSource, baseUrl, apiKeyPresent: true, misconfigured: false, warning: null };
6834
+ return { transport: "http", requested, modeSource, baseUrl, apiKeyPresent: true, misconfigured: false, warning: null };
6735
6835
  }
6736
6836
  function appendQuery(path, query) {
6737
6837
  if (!query)
@@ -6825,6 +6925,8 @@ function createHttpTransport(options) {
6825
6925
  const jitter = Math.floor(Math.random() * (backoff / 2 + 1));
6826
6926
  await sleep(backoff + jitter);
6827
6927
  }
6928
+ if (last === null)
6929
+ throw new Error(`Request to ${rel} completed without a result`);
6828
6930
  throw last.error;
6829
6931
  }
6830
6932
  return {
@@ -6896,21 +6998,22 @@ function createStorageClient(name, transport) {
6896
6998
  function resolveStorageClient(name, env = process.env, fetchImpl) {
6897
6999
  const resolution = resolveTransport(name, env);
6898
7000
  if (resolution.misconfigured) {
6899
- throw new Error(resolution.warning ?? `Client for '${name}' is misconfigured for cloud mode.`);
7001
+ throw new Error(resolution.warning ?? `Client for '${name}' is misconfigured for the /v1 API.`);
6900
7002
  }
6901
- if (resolution.transport === "local" || !resolution.baseUrl) {
6902
- return { transport: "local", client: null, resolution };
7003
+ if (resolution.transport === "sqlite" || !resolution.baseUrl) {
7004
+ return { transport: "sqlite", client: null, resolution };
6903
7005
  }
6904
7006
  const keys = envKeys(name);
6905
7007
  const apiKey = firstEnv(env, keys.apiKeyKeys)?.value;
6906
7008
  if (!apiKey)
6907
- throw new Error(`Client for '${name}' resolved to cloud-http without an API key.`);
7009
+ throw new Error(`Client for '${name}' resolved to the /v1 API without an API key.`);
6908
7010
  const transport = createHttpTransport({ name, baseUrl: resolution.baseUrl, apiKey, ...fetchImpl ? { fetchImpl } : {} });
6909
- return { transport: "cloud-http", client: createStorageClient(name, transport), resolution };
7011
+ return { transport: "http", client: createStorageClient(name, transport), resolution };
6910
7012
  }
6911
- var DEPRECATED_MODE_ALIASES, HasnaHttpError, RETRY_STATUSES, IDEMPOTENT, defaultSleep = (ms) => new Promise((r) => setTimeout(r, ms));
7013
+ var SERVER_BACKEND_VALUES, HasnaHttpError, RETRY_STATUSES, IDEMPOTENT, defaultSleep = (ms) => new Promise((r) => setTimeout(r, ms));
6912
7014
  var init_client = __esm(() => {
6913
- DEPRECATED_MODE_ALIASES = ["self_hosted", "remote", "hybrid"];
7015
+ init_retired_deployment_modes();
7016
+ SERVER_BACKEND_VALUES = ["sqlite", "postgresql", "postgres"];
6914
7017
  HasnaHttpError = class HasnaHttpError extends Error {
6915
7018
  status;
6916
7019
  method;
@@ -6949,13 +7052,16 @@ function listQuery(filter) {
6949
7052
  }
6950
7053
  function unwrap(res, key) {
6951
7054
  if (res && typeof res === "object" && key in res) {
6952
- return res[key];
7055
+ const value = res[key];
7056
+ if (value === undefined)
7057
+ throw new Error(`Response field ${key} is undefined`);
7058
+ return value;
6953
7059
  }
6954
7060
  return res;
6955
7061
  }
6956
7062
  function apiStore(client) {
6957
7063
  return {
6958
- mode: "cloud-http",
7064
+ mode: "http",
6959
7065
  baseUrl: client.baseUrl,
6960
7066
  async createRecording(input, idempotencyKey) {
6961
7067
  const keyCandidate = idempotencyKey === undefined && (input.id === undefined || input.id === null) ? randomUUID2() : idempotencyKey;
@@ -7122,7 +7228,7 @@ function getStore(env = process.env) {
7122
7228
  if (env === process.env && cached)
7123
7229
  return cached;
7124
7230
  const resolved = resolveStorageClient(APP, env);
7125
- const store = resolved.transport === "cloud-http" ? apiStore(resolved.client) : localStore;
7231
+ const store = resolved.transport === "http" ? apiStore(resolved.client) : localStore;
7126
7232
  if (env === process.env)
7127
7233
  cached = store;
7128
7234
  return store;
@@ -7137,7 +7243,7 @@ var init_store = __esm(() => {
7137
7243
  init_recording_create_identity();
7138
7244
  init_install_maintenance();
7139
7245
  localStore = {
7140
- mode: "local",
7246
+ mode: "sqlite",
7141
7247
  baseUrl: null,
7142
7248
  async createRecording(input, idempotencyKey) {
7143
7249
  return withLocalStoreReaderLease(() => createRecording2(input, undefined, idempotencyKey));
@@ -8195,13 +8301,13 @@ function buildFetch(options = {}) {
8195
8301
  "Retry-After": String(rl.retryAfter ?? 60)
8196
8302
  });
8197
8303
  }
8198
- const mode = isCloudModeEnabled() ? "remote" : "local";
8304
+ const mode = resolveDataBackend();
8199
8305
  if ((path === "/health" || path === "/ready" || path === "/version") && method === "GET") {
8200
8306
  if (path === "/version") {
8201
8307
  return jsonResponse({ status: "ok", version: VERSION, mode, name: "recordings" });
8202
8308
  }
8203
8309
  if (path === "/ready") {
8204
- if (mode === "remote") {
8310
+ if (mode === "postgresql") {
8205
8311
  try {
8206
8312
  await checkCloudAuth();
8207
8313
  await checkCloud();
@@ -8259,12 +8365,13 @@ async function startServer(port, options) {
8259
8365
  };
8260
8366
  process.on("SIGINT", shutdown);
8261
8367
  process.on("SIGTERM", shutdown);
8262
- const mode = isCloudModeEnabled() ? "remote (A1 pure-remote)" : "local";
8368
+ const mode = resolveDataBackend();
8263
8369
  console.log(`recordings-serve listening on http://${hostname2}:${port} (mode: ${mode})`);
8264
8370
  return server;
8265
8371
  }
8266
8372
  var SECURITY_HEADERS, rateLimitMap, RATE_LIMIT_WINDOW_MS = 60000, RATE_LIMIT_MAX;
8267
8373
  var init_serve = __esm(() => {
8374
+ init_cloud_config();
8268
8375
  init_v1();
8269
8376
  init_openapi();
8270
8377
  SECURITY_HEADERS = {
@@ -8283,9 +8390,9 @@ function parsePort() {
8283
8390
  const arg = process.argv.find((a) => a === "--port" || a.startsWith("--port="));
8284
8391
  if (arg) {
8285
8392
  if (arg.includes("="))
8286
- return parseInt(arg.split("=")[1], 10) || DEFAULT_PORT;
8393
+ return parseInt(arg.split("=", 2)[1] ?? "", 10) || DEFAULT_PORT;
8287
8394
  const idx = process.argv.indexOf(arg);
8288
- return parseInt(process.argv[idx + 1], 10) || DEFAULT_PORT;
8395
+ return parseInt(process.argv[idx + 1] ?? "", 10) || DEFAULT_PORT;
8289
8396
  }
8290
8397
  const envPort = process.env.PORT ? parseInt(process.env.PORT, 10) : undefined;
8291
8398
  return envPort || DEFAULT_PORT;
@@ -8311,10 +8418,11 @@ Options:
8311
8418
  -h, --help display help for command
8312
8419
 
8313
8420
  Commands:
8314
- migrate Apply the cloud schema, then exit. Idempotent.
8421
+ migrate Apply the PostgreSQL schema, then exit. Idempotent.
8315
8422
 
8316
8423
  Environment:
8317
- HASNA_RECORDINGS_DATABASE_URL Remote Postgres DSN (enables cloud /v1)
8424
+ HASNA_RECORDINGS_STORAGE_MODE Data backend: sqlite | postgresql
8425
+ HASNA_RECORDINGS_DATABASE_URL PostgreSQL DSN (implies postgresql)
8318
8426
  HASNA_RECORDINGS_API_SIGNING_KEY HMAC signing secret for API-key auth`);
8319
8427
  }
8320
8428
  async function runMigrate() {
@@ -1 +1 @@
1
- {"version":3,"file":"migrate-command.d.ts","sourceRoot":"","sources":["../../src/server/migrate-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAED,oFAAoF;AACpF,wBAAsB,4BAA4B,CAChD,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,EAChD,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GACzC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,6FAA6F;AAC7F,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF"}
1
+ {"version":3,"file":"migrate-command.d.ts","sourceRoot":"","sources":["../../src/server/migrate-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAED,oFAAoF;AACpF,wBAAsB,4BAA4B,CAChD,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,EAChD,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GACzC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,6FAA6F;AAC7F,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF"}
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/server/serve.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKnD,CAAC;AAyCF,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,IAWtD,KAAK,OAAO,EACZ,QAAQ;IAAE,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,KAC9D,OAAO,CAAC,QAAQ,CAAC,CAqFrB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAqBnH"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/server/serve.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKnD,CAAC;AAyCF,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,IAWtD,KAAK,OAAO,EACZ,QAAQ;IAAE,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,KAC9D,OAAO,CAAC,QAAQ,CAAC,CAqFrB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAqBnH"}
package/dist/storage.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { getStore, __resetStore, APP } from "./store.js";
2
2
  export type { Store, RecordingStats, FeedbackInput } from "./store.js";
3
- export { resolveStorageClient, resolveTransport, createHttpTransport, createStorageClient, toV1BaseUrl, defaultCloudBaseUrl, HasnaHttpError, } from "./http/client.js";
4
- export type { StorageClient, StorageMode, TransportKind, TransportResolution, HttpTransport, } from "./http/client.js";
3
+ export { resolveStorageClient, resolveTransport, createHttpTransport, createStorageClient, toV1BaseUrl, defaultApiBaseUrl, HasnaHttpError, } from "./http/client.js";
4
+ export type { StorageClient, ClientStore, TransportKind, TransportResolution, HttpTransport, } from "./http/client.js";
5
5
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,aAAa,GACd,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,aAAa,GACd,MAAM,kBAAkB,CAAC"}