@hasna/recordings 0.3.1 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"installer-guard-execution.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/installer-guard-execution.ts"],"names":[],"mappings":"AA+DA,eAAO,MAAM,wBAAwB,QAAiB,CAAC;AACvD,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AACxD,eAAO,MAAM,eAAe,QAAiB,CAAC;AAsB9C,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,SAAS,CAAC;AAuFtD,MAAM,MAAM,qBAAqB,GAE7B,oCAAoC,GAGpC,oCAAoC,GAEpC,MAAM,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG;IAKlC,iBAAiB,EAAE,OAAO,CAAC;IAG3B,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAK9C,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IAKf,kBAAkB,EAAE,OAAO,CAAC;IAG5B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAG9B,cAAc,EAAE,MAAM,EAAE,CAAC;IAMzB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,qBAAqB,GAC7B,oBAAoB,CAwStB"}
1
+ {"version":3,"file":"installer-guard-execution.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/installer-guard-execution.ts"],"names":[],"mappings":"AA+DA,eAAO,MAAM,wBAAwB,QAAiB,CAAC;AACvD,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AACxD,eAAO,MAAM,eAAe,QAAiB,CAAC;AAsB9C,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,SAAS,CAAC;AAuFtD,MAAM,MAAM,qBAAqB,GAE7B,oCAAoC,GAGpC,oCAAoC,GAEpC,MAAM,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG;IAKlC,iBAAiB,EAAE,OAAO,CAAC;IAG3B,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAK9C,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IAKf,kBAAkB,EAAE,OAAO,CAAC;IAG5B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAG9B,cAAc,EAAE,MAAM,EAAE,CAAC;IAMzB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,qBAAqB,GAC7B,oBAAoB,CA2StB"}
package/dist/cli/index.js CHANGED
@@ -1927,7 +1927,7 @@ function setAgentFocus(idOrName, projectId, db) {
1927
1927
  }
1928
1928
 
1929
1929
  // src/version.ts
1930
- var VERSION = "0.3.1";
1930
+ var VERSION = "0.3.2";
1931
1931
 
1932
1932
  // src/db/feedback.ts
1933
1933
  function saveFeedback(input) {
@@ -1976,7 +1976,7 @@ function normalizeClientStore(value, sourceEnvKey, replacementEnvKey) {
1976
1976
  throw new Error(`Unknown client store: ${value}. Use sqlite or http.`);
1977
1977
  }
1978
1978
  function defaultApiBaseUrl(name) {
1979
- return `https://${name}.hasna.xyz`;
1979
+ return `http://localhost:8874`;
1980
1980
  }
1981
1981
  function envKeys(name) {
1982
1982
  const token = envToken(name);
@@ -5179,12 +5179,20 @@ program.command("init").description("Initialize .recordings/ in current director
5179
5179
  console.log(chalk.dim(" db: .recordings/recordings.db"));
5180
5180
  });
5181
5181
  var appCommand = program.command("app").description("Manage the macOS app installed from this package");
5182
- appCommand.command("install").description("Install a release or explicitly approved local-only Recordings.app artifact").requiredOption("--artifact <path>", "Finalized Recordings.app ZIP artifact").requiredOption("--manifest <path>", "Artifact provenance manifest").option("--envelope <path>", "Signed release envelope (required for release artifacts)").option("--expected-team-id <team>", "Required Developer ID TeamIdentifier for release artifacts").requiredOption("--manifest-sha256 <sha256>", "Authenticated release-manifest SHA-256").requiredOption("--expected-source-sha <sha>", "Exact approved 40-character source commit").requiredOption("--expected-version <version>", "Exact approved release version").option("--expected-hostname <hostname>", "Exact deployment hostname to verify before any install mutation").option("--artifact-policy <policy>", "Artifact policy: release or local-only", "release").option("--approved-target <station>", "Exact approved target; fleet for release artifacts", "fleet").option("--approved-target-identity-kind <kind>", "Target identity kind: hardware_uuid_sha256 or tailscale_node_id_sha256").option("--approved-target-identity-sha256 <sha256>", "Authenticated SHA-256 of the approved target identity; none for release artifacts", "none").option("--acknowledge-local-signing-and-permissions", "Acknowledge local-only ad-hoc identity and possible permission reauthorization").option("--expected-old-identity-sha256 <sha256>", "Exact installed identity approved for migration").option("--expected-new-identity-sha256 <sha256>", "Exact candidate identity approved for migration").option("--allow-signing-identity-migration", "Allow one reviewed signer change that requires new macOS permission approval").option("--allow-adhoc-identity-migration", "Accept that replacing an ad-hoc signed local-only app voids its Microphone and Accessibility grants").option("--launch", "Launch and verify the canonical app after installation").option("--launch-timeout <seconds>", "Canonical process launch timeout").action((opts) => {
5182
+ appCommand.command("install").description("Install a release or explicitly approved local-only Recordings.app artifact").requiredOption("--artifact <path>", "Finalized Recordings.app ZIP artifact").requiredOption("--manifest <path>", "Artifact provenance manifest").option("--envelope <path>", "Signed release envelope (required for release artifacts)").option("--expected-team-id <team>", "Required Developer ID TeamIdentifier for release artifacts").requiredOption("--manifest-sha256 <sha256>", "Authenticated release-manifest SHA-256").requiredOption("--expected-source-sha <sha>", "Exact approved 40-character source commit").requiredOption("--expected-version <version>", "Exact approved release version").option("--expected-hostname <hostname>", "Exact deployment hostname to verify before any install mutation").option("--artifact-policy <policy>", "Artifact policy: release or local-only", "release").option("--approved-target <station>", "Exact approved target; fleet for release artifacts", "fleet").option("--variant <variant>", "Artifact variant the operator intends to install: full or bar (default: full)", "full").option("--approved-target-identity-kind <kind>", "Target identity kind: hardware_uuid_sha256 or tailscale_node_id_sha256").option("--approved-target-identity-sha256 <sha256>", "Authenticated SHA-256 of the approved target identity; none for release artifacts", "none").option("--acknowledge-local-signing-and-permissions", "Acknowledge local-only ad-hoc identity and possible permission reauthorization").option("--expected-old-identity-sha256 <sha256>", "Exact installed identity approved for migration").option("--expected-new-identity-sha256 <sha256>", "Exact candidate identity approved for migration").option("--allow-signing-identity-migration", "Allow one reviewed signer change that requires new macOS permission approval").option("--allow-adhoc-identity-migration", "Accept that replacing an ad-hoc signed local-only app voids its Microphone and Accessibility grants").option("--launch", "Launch and verify the canonical app after installation").option("--launch-timeout <seconds>", "Canonical process launch timeout").action((opts) => {
5183
5183
  if (process.platform !== "darwin") {
5184
5184
  console.error(chalk.red("Recordings.app installation is only supported on macOS"));
5185
5185
  process.exit(1);
5186
5186
  }
5187
+ if (opts.variant !== "full" && opts.variant !== "bar") {
5188
+ console.error(chalk.red("Artifact variant must be full or bar."));
5189
+ process.exit(1);
5190
+ }
5187
5191
  if (opts.artifactPolicy === "release") {
5192
+ if (opts.variant !== "full") {
5193
+ console.error(chalk.red("Release installs are always full-app artifacts. The bar variant installs " + "through the local-only path (--artifact-policy local-only --variant bar)."));
5194
+ process.exit(1);
5195
+ }
5188
5196
  if (!opts.envelope) {
5189
5197
  console.error(chalk.red("Release installation requires --envelope."));
5190
5198
  process.exit(1);
@@ -5302,6 +5310,7 @@ appCommand.command("install").description("Install a release or explicitly appro
5302
5310
  if (opts.expectedHostname) {
5303
5311
  installerArgs.push("--expected-hostname", opts.expectedHostname);
5304
5312
  }
5313
+ installerArgs.push("--variant", opts.variant);
5305
5314
  if (opts.approvedTargetIdentityKind) {
5306
5315
  installerArgs.push("--approved-target-identity-kind", opts.approvedTargetIdentityKind);
5307
5316
  }
@@ -6538,7 +6547,9 @@ function buildPermissionWarnings(status) {
6538
6547
  function resolveInstalledAppPath(home, canonicalPath, legacyPaths) {
6539
6548
  const preference = [
6540
6549
  canonicalPath,
6550
+ pathJoin("/", "Applications", "HasnaRecordings.app"),
6541
6551
  pathJoin("/", "Applications", "Recordings.app"),
6552
+ pathJoin(home, ".hasna", "recordings", "HasnaRecordings.app"),
6542
6553
  pathJoin(home, ".hasna", "recordings", "Recordings.app")
6543
6554
  ];
6544
6555
  for (const candidate of preference) {
@@ -6550,12 +6561,14 @@ function resolveInstalledAppPath(home, canonicalPath, legacyPaths) {
6550
6561
  function findLegacyMacOSAppPaths(home, canonicalPath) {
6551
6562
  const candidates = [
6552
6563
  pathJoin(home, ".hasna", "recordings", "Recordings.app"),
6553
- pathJoin("/", "Applications", "Recordings.app")
6564
+ pathJoin(home, ".hasna", "recordings", "HasnaRecordings.app"),
6565
+ pathJoin("/", "Applications", "Recordings.app"),
6566
+ pathJoin("/", "Applications", "HasnaRecordings.app")
6554
6567
  ];
6555
6568
  const userApplications = pathJoin(home, "Applications");
6556
6569
  if (existsSync8(userApplications)) {
6557
6570
  for (const entry of readdirSync2(userApplications, { withFileTypes: true })) {
6558
- if (entry.isDirectory() && entry.name.startsWith("Recordings.app.")) {
6571
+ if (entry.isDirectory() && (entry.name.startsWith("Recordings.app.") || entry.name.startsWith("HasnaRecordings.app."))) {
6559
6572
  candidates.push(pathJoin(userApplications, entry.name));
6560
6573
  }
6561
6574
  }
@@ -1,6 +1,15 @@
1
1
  export type Env = Record<string, string | undefined>;
2
2
  /** Where a client reads and writes. Two arms, no third. */
3
3
  export type ClientStore = "sqlite" | "http";
4
+ /**
5
+ * Fallback API base URL when the client store resolves to `http` and no
6
+ * `HASNA_<APP>_API_URL` is set. It points at the app's own server on the same
7
+ * machine (`recordings-serve`'s default port — see DEFAULT_PORT in
8
+ * src/server/index.ts). This default deliberately contains no internal-infra
9
+ * hostname: a remote deployment sets `HASNA_<APP>_API_URL` explicitly. The
10
+ * `name` argument is retained for signature compatibility with the public
11
+ * `@hasna/recordings/storage` surface; it no longer derives a hostname.
12
+ */
4
13
  export declare function defaultApiBaseUrl(name: string): string;
5
14
  export declare function toV1BaseUrl(apiUrl: string): string;
6
15
  export type TransportKind = ClientStore;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1186,7 +1186,7 @@ function setAgentFocus(idOrName, projectId, db) {
1186
1186
  }
1187
1187
 
1188
1188
  // src/version.ts
1189
- var VERSION = "0.3.1";
1189
+ var VERSION = "0.3.2";
1190
1190
 
1191
1191
  // src/db/feedback.ts
1192
1192
  function saveFeedback(input) {
@@ -1235,7 +1235,7 @@ function normalizeClientStore(value, sourceEnvKey, replacementEnvKey) {
1235
1235
  throw new Error(`Unknown client store: ${value}. Use sqlite or http.`);
1236
1236
  }
1237
1237
  function defaultApiBaseUrl(name) {
1238
- return `https://${name}.hasna.xyz`;
1238
+ return `http://localhost:8874`;
1239
1239
  }
1240
1240
  function envKeys(name) {
1241
1241
  const token = envToken(name);
package/dist/mcp/index.js CHANGED
@@ -5056,7 +5056,7 @@ function setAgentFocus(idOrName, projectId, db) {
5056
5056
  }
5057
5057
 
5058
5058
  // src/version.ts
5059
- var VERSION = "0.3.1";
5059
+ var VERSION = "0.3.2";
5060
5060
 
5061
5061
  // src/db/feedback.ts
5062
5062
  function saveFeedback(input) {
@@ -5105,7 +5105,7 @@ function normalizeClientStore(value, sourceEnvKey, replacementEnvKey) {
5105
5105
  throw new Error(`Unknown client store: ${value}. Use sqlite or http.`);
5106
5106
  }
5107
5107
  function defaultApiBaseUrl(name) {
5108
- return `https://${name}.hasna.xyz`;
5108
+ return `http://localhost:8874`;
5109
5109
  }
5110
5110
  function envKeys(name) {
5111
5111
  const token = envToken(name);
@@ -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.3.1";
21
+ var VERSION = "0.3.2";
22
22
 
23
23
  // src/db/remote-storage.ts
24
24
  import pg from "pg";
@@ -6748,7 +6748,7 @@ function normalizeClientStore(value, sourceEnvKey, replacementEnvKey) {
6748
6748
  throw new Error(`Unknown client store: ${value}. Use sqlite or http.`);
6749
6749
  }
6750
6750
  function defaultApiBaseUrl(name) {
6751
- return `https://${name}.hasna.xyz`;
6751
+ return `http://localhost:8874`;
6752
6752
  }
6753
6753
  function envKeys(name) {
6754
6754
  const token = envToken(name);
package/dist/storage.js CHANGED
@@ -1021,7 +1021,7 @@ function setAgentFocus(idOrName, projectId, db) {
1021
1021
  }
1022
1022
 
1023
1023
  // src/version.ts
1024
- var VERSION = "0.3.1";
1024
+ var VERSION = "0.3.2";
1025
1025
 
1026
1026
  // src/db/feedback.ts
1027
1027
  function saveFeedback(input) {
@@ -1070,7 +1070,7 @@ function normalizeClientStore(value, sourceEnvKey, replacementEnvKey) {
1070
1070
  throw new Error(`Unknown client store: ${value}. Use sqlite or http.`);
1071
1071
  }
1072
1072
  function defaultApiBaseUrl(name) {
1073
- return `https://${name}.hasna.xyz`;
1073
+ return `http://localhost:8874`;
1074
1074
  }
1075
1075
  function envKeys(name) {
1076
1076
  const token = envToken(name);
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.3.1";
1
+ export declare const VERSION = "0.3.2";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/recordings",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "description": "Speech-to-text recording tool with MCP and CLI — records, transcribes, and optionally enhances text using AI",
6
6
  "repository": {
@@ -168,6 +168,9 @@ Artifact and version:
168
168
 
169
169
  Target selection:
170
170
  --expected-hostname <name> Require this live short hostname before mutating
171
+ --variant <full|bar> Artifact variant the operator intends to install;
172
+ the manifest variant is verified against this at
173
+ install time (default: full)
171
174
  --artifact-policy <release|local-only>
172
175
  Trust policy to evaluate the artifact under
173
176
  --approved-target <name> Approved target for a local-only artifact
@@ -214,6 +217,7 @@ EXPECTED_NEW_IDENTITY_SHA256=""
214
217
  EXPECTED_HOSTNAME=""
215
218
  EXPECTED_HOSTNAME_SET=0
216
219
  ARTIFACT_POLICY="release"
220
+ INSTALL_VARIANT="full"
217
221
  APPROVED_TARGET="fleet"
218
222
  APPROVED_TARGET_IDENTITY_KIND=""
219
223
  APPROVED_TARGET_IDENTITY_SHA256="none"
@@ -254,6 +258,16 @@ while [ "$#" -gt 0 ]; do
254
258
  EXPECTED_HOSTNAME_SET=1
255
259
  shift 2
256
260
  ;;
261
+ --variant)
262
+ case "${2:-}" in
263
+ full|bar) INSTALL_VARIANT="${2}" ;;
264
+ *)
265
+ echo "Install variant must be full or bar." >&2
266
+ exit 2
267
+ ;;
268
+ esac
269
+ shift 2
270
+ ;;
257
271
  --artifact-policy)
258
272
  case "${2:-}" in
259
273
  release) ARTIFACT_POLICY="release" ;;
@@ -532,7 +546,8 @@ fi
532
546
  "$BUN_EXECUTABLE" "$ARTIFACT_TOOL" native-fs-guard-check
533
547
  DATA_DIR="${HOME}/.hasna/recordings"
534
548
  DATA_PARENT="$("$DIRNAME_EXECUTABLE" "$DATA_DIR")"
535
- APP_DEST="${HOME}/Applications/Recordings.app"
549
+ MANIFEST_BUNDLE_NAME="Recordings.app"
550
+ APP_DEST="${HOME}/Applications/${MANIFEST_BUNDLE_NAME}"
536
551
  APP_PARENT="$("$DIRNAME_EXECUTABLE" "$APP_DEST")"
537
552
  ROLLBACK_DIR="${DATA_DIR}/rollbacks"
538
553
  JOURNAL_PATH="${APP_PARENT}/.Recordings-install-transaction.json"
@@ -1323,6 +1338,7 @@ MANIFEST_SNAPSHOT="${WORK_DIR}/$("$BASENAME_EXECUTABLE" "$MANIFEST_PATH")"
1323
1338
  --source-sha "$EXPECTED_SOURCE_SHA" \
1324
1339
  --version "$EXPECTED_VERSION" \
1325
1340
  --artifact-policy "$ARTIFACT_POLICY" \
1341
+ --variant "$INSTALL_VARIANT" \
1326
1342
  --approved-target "$APPROVED_TARGET" \
1327
1343
  --approved-target-identity-kind "$APPROVED_TARGET_IDENTITY_KIND" \
1328
1344
  --approved-target-identity-sha256 "$APPROVED_TARGET_IDENTITY_SHA256"
@@ -1330,6 +1346,22 @@ MANIFEST_BUILDER_IDENTITY_KIND="$("$BUN_EXECUTABLE" "$ARTIFACT_TOOL" manifest-ge
1330
1346
  --manifest "$MANIFEST_SNAPSHOT" \
1331
1347
  --manifest-sha256 "$EXPECTED_MANIFEST_SHA256" \
1332
1348
  --field builder_identity_kind)"
1349
+ AUTHENTICATED_BUNDLE_NAME="$("$BUN_EXECUTABLE" "$ARTIFACT_TOOL" manifest-get \
1350
+ --manifest "$MANIFEST_SNAPSHOT" \
1351
+ --manifest-sha256 "$EXPECTED_MANIFEST_SHA256" \
1352
+ --field bundle_name)"
1353
+ case "$AUTHENTICATED_BUNDLE_NAME" in
1354
+ *.app) ;;
1355
+ *)
1356
+ echo "Authenticated artifact manifest carries an invalid bundle name: ${AUTHENTICATED_BUNDLE_NAME}." >&2
1357
+ exit 1
1358
+ ;;
1359
+ esac
1360
+ if [ "$AUTHENTICATED_BUNDLE_NAME" != "$MANIFEST_BUNDLE_NAME" ]; then
1361
+ MANIFEST_BUNDLE_NAME="$AUTHENTICATED_BUNDLE_NAME"
1362
+ APP_DEST="${HOME}/Applications/${MANIFEST_BUNDLE_NAME}"
1363
+ APP_PARENT="$("$DIRNAME_EXECUTABLE" "$APP_DEST")"
1364
+ fi
1333
1365
 
1334
1366
  CURRENT_MACOS="$("$SW_VERS_EXECUTABLE" -productVersion)"
1335
1367
  MINIMUM_MACOS="$("$BUN_EXECUTABLE" "$ARTIFACT_TOOL" manifest-get \
@@ -1361,7 +1393,7 @@ verify_secure_parent "$APP_PARENT"
1361
1393
  verify_existing_state_root
1362
1394
 
1363
1395
  STAGING_DIR="$("$MKTEMP_EXECUTABLE" -d "${APP_PARENT}/.Recordings-install.XXXXXX")"
1364
- STAGED_APP="${STAGING_DIR}/Recordings.app"
1396
+ STAGED_APP="${STAGING_DIR}/${MANIFEST_BUNDLE_NAME}"
1365
1397
  "$BUN_EXECUTABLE" "$ARTIFACT_TOOL" verify-archive \
1366
1398
  --archive "$ARTIFACT_SNAPSHOT" \
1367
1399
  --manifest "$MANIFEST_SNAPSHOT" \
@@ -1370,6 +1402,7 @@ STAGED_APP="${STAGING_DIR}/Recordings.app"
1370
1402
  --source-sha "$EXPECTED_SOURCE_SHA" \
1371
1403
  --version "$EXPECTED_VERSION" \
1372
1404
  --artifact-policy "$ARTIFACT_POLICY" \
1405
+ --variant "$INSTALL_VARIANT" \
1373
1406
  --approved-target "$APPROVED_TARGET" \
1374
1407
  --approved-target-identity-kind "$APPROVED_TARGET_IDENTITY_KIND" \
1375
1408
  --approved-target-identity-sha256 "$APPROVED_TARGET_IDENTITY_SHA256"
@@ -1647,10 +1680,11 @@ write_journal() {
1647
1680
  --source-sha "$EXPECTED_SOURCE_SHA" \
1648
1681
  --version "$EXPECTED_VERSION" \
1649
1682
  --artifact-policy "$ARTIFACT_POLICY" \
1683
+ --variant "$INSTALL_VARIANT" \
1650
1684
  --approved-target "$APPROVED_TARGET" \
1651
1685
  --approved-target-identity-kind "$APPROVED_TARGET_IDENTITY_KIND" \
1652
1686
  --approved-target-identity-sha256 "$APPROVED_TARGET_IDENTITY_SHA256"
1653
- CANDIDATE_APP="$UNPACK_DIR/Recordings.app"
1687
+ CANDIDATE_APP="$UNPACK_DIR/${MANIFEST_BUNDLE_NAME}"
1654
1688
 
1655
1689
  "$BUN_EXECUTABLE" "$ARTIFACT_TOOL" verify-app \
1656
1690
  --app "$CANDIDATE_APP" \
@@ -1658,6 +1692,7 @@ CANDIDATE_APP="$UNPACK_DIR/Recordings.app"
1658
1692
  --manifest-sha256 "$EXPECTED_MANIFEST_SHA256" \
1659
1693
  --team-id "$EXPECTED_TEAM_ID" \
1660
1694
  --artifact-policy "$ARTIFACT_POLICY" \
1695
+ --variant "$INSTALL_VARIANT" \
1661
1696
  --approved-target "$APPROVED_TARGET" \
1662
1697
  --approved-target-identity-kind "$APPROVED_TARGET_IDENTITY_KIND" \
1663
1698
  --approved-target-identity-sha256 "$APPROVED_TARGET_IDENTITY_SHA256"
@@ -1671,10 +1706,12 @@ fi
1671
1706
  DISCOVERED_APPS=()
1672
1707
  add_unique_app "$APP_DEST"
1673
1708
  add_unique_app "${DATA_DIR}/Recordings.app"
1674
- for candidate in "${HOME}"/Applications/Recordings.app.*; do
1709
+ add_unique_app "${DATA_DIR}/HasnaRecordings.app"
1710
+ for candidate in "${HOME}"/Applications/Recordings.app.* "${HOME}"/Applications/HasnaRecordings.app.*; do
1675
1711
  add_unique_app "$candidate"
1676
1712
  done
1677
1713
  add_unique_app "/Applications/Recordings.app"
1714
+ add_unique_app "/Applications/HasnaRecordings.app"
1678
1715
  if [ -x "$MDFIND_EXECUTABLE" ]; then
1679
1716
  while IFS= read -r candidate; do
1680
1717
  [ -n "$candidate" ] || continue
@@ -1685,7 +1722,7 @@ fi
1685
1722
  MANAGEABLE_APPS=()
1686
1723
  for existing_app in ${DISCOVERED_APPS[@]+"${DISCOVERED_APPS[@]}"}; do
1687
1724
  case "$existing_app" in
1688
- "$APP_DEST"|"${DATA_DIR}/Recordings.app"|"${HOME}/Applications/Recordings.app."*)
1725
+ "$APP_DEST"|"${DATA_DIR}/Recordings.app"|"${DATA_DIR}/HasnaRecordings.app"|"${HOME}/Applications/Recordings.app."*|"${HOME}/Applications/HasnaRecordings.app."*)
1689
1726
  echo "Duplicate disposition: archive transactionally, remove after activation: ${existing_app}"
1690
1727
  MANAGEABLE_APPS+=("$existing_app")
1691
1728
  ;;
@@ -1847,6 +1884,7 @@ done
1847
1884
  --manifest-sha256 "$EXPECTED_MANIFEST_SHA256" \
1848
1885
  --team-id "$EXPECTED_TEAM_ID" \
1849
1886
  --artifact-policy "$ARTIFACT_POLICY" \
1887
+ --variant "$INSTALL_VARIANT" \
1850
1888
  --approved-target "$APPROVED_TARGET" \
1851
1889
  --approved-target-identity-kind "$APPROVED_TARGET_IDENTITY_KIND" \
1852
1890
  --approved-target-identity-sha256 "$APPROVED_TARGET_IDENTITY_SHA256"
@@ -2012,6 +2050,7 @@ write_journal candidate-installed
2012
2050
  --manifest-sha256 "$EXPECTED_MANIFEST_SHA256" \
2013
2051
  --team-id "$EXPECTED_TEAM_ID" \
2014
2052
  --artifact-policy "$ARTIFACT_POLICY" \
2053
+ --variant "$INSTALL_VARIANT" \
2015
2054
  --approved-target "$APPROVED_TARGET" \
2016
2055
  --approved-target-identity-kind "$APPROVED_TARGET_IDENTITY_KIND" \
2017
2056
  --approved-target-identity-sha256 "$APPROVED_TARGET_IDENTITY_SHA256"
@@ -2027,11 +2066,12 @@ fi
2027
2066
  --manifest-sha256 "$EXPECTED_MANIFEST_SHA256" \
2028
2067
  --team-id "$EXPECTED_TEAM_ID" \
2029
2068
  --artifact-policy "$ARTIFACT_POLICY" \
2069
+ --variant "$INSTALL_VARIANT" \
2030
2070
  --approved-target "$APPROVED_TARGET" \
2031
2071
  --approved-target-identity-kind "$APPROVED_TARGET_IDENTITY_KIND" \
2032
2072
  --approved-target-identity-sha256 "$APPROVED_TARGET_IDENTITY_SHA256"
2033
2073
  SMOKE_TOOL_PATH="/usr/bin:/bin:/usr/sbin:/sbin:$("$DIRNAME_EXECUTABLE" "$BUN_EXECUTABLE")"
2034
- PATH="$SMOKE_TOOL_PATH" "$RUNTIME_SMOKE" "$APP_DEST" "$BUN_EXECUTABLE"
2074
+ PATH="$SMOKE_TOOL_PATH" "$RUNTIME_SMOKE" "$APP_DEST" "$BUN_EXECUTABLE" --variant "$INSTALL_VARIANT"
2035
2075
  write_journal activated
2036
2076
 
2037
2077
  write_journal committed
@@ -2043,7 +2083,14 @@ STOPPED_RUNNING_APP=0
2043
2083
  if [ "$LAUNCH_APP" -eq 1 ] || [ "$was_running" -eq 1 ]; then
2044
2084
  EXPECTED_EXECUTABLE="$APP_DEST/Contents/MacOS/Recordings"
2045
2085
  RUNNING_EXECUTABLES+=("$EXPECTED_EXECUTABLE")
2046
- "$OPEN_EXECUTABLE" -n "$APP_DEST"
2086
+ if [ "$INSTALL_VARIANT" = "bar" ]; then
2087
+ # Bar installs relaunch with an explicit --bar-only so the launch record is
2088
+ # self-describing; the compile-time RECORDINGS_BAR_ONLY default makes the bar
2089
+ # windowless even without the argument.
2090
+ "$OPEN_EXECUTABLE" -n "$APP_DEST" --args --bar-only
2091
+ else
2092
+ "$OPEN_EXECUTABLE" -n "$APP_DEST"
2093
+ fi
2047
2094
  attempts=$((LAUNCH_TIMEOUT_SECONDS * 10))
2048
2095
  launched_pid=""
2049
2096
  launched_start_identity=""