@autohq/cli 0.1.94 → 0.1.96

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 (2) hide show
  1. package/dist/index.js +64 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -17096,6 +17096,59 @@ var init_trigger_router = __esm({
17096
17096
  });
17097
17097
 
17098
17098
  // ../../packages/schemas/src/sessions.ts
17099
+ function avatarAssetDimensions(bytes) {
17100
+ return pngDimensions(bytes) ?? jpegDimensions(bytes);
17101
+ }
17102
+ function avatarAssetDimensionsProblem(bytes) {
17103
+ const dimensions = avatarAssetDimensions(bytes);
17104
+ if (!dimensions) {
17105
+ return "image dimensions could not be read; asset must be a valid PNG or JPEG";
17106
+ }
17107
+ const { width, height } = dimensions;
17108
+ if (width !== height || width < MIN_AVATAR_ASSET_DIMENSION_PX || width > MAX_AVATAR_ASSET_DIMENSION_PX) {
17109
+ return `asset must be a square between ${MIN_AVATAR_ASSET_DIMENSION_PX}x${MIN_AVATAR_ASSET_DIMENSION_PX} and ${MAX_AVATAR_ASSET_DIMENSION_PX}x${MAX_AVATAR_ASSET_DIMENSION_PX} pixels, got ${width}x${height}`;
17110
+ }
17111
+ return null;
17112
+ }
17113
+ function pngDimensions(bytes) {
17114
+ if (bytes.length < 24) return null;
17115
+ for (let i = 0; i < PNG_SIGNATURE.length; i++) {
17116
+ if (bytes[i] !== PNG_SIGNATURE[i]) return null;
17117
+ }
17118
+ if (bytes[12] !== 73 || bytes[13] !== 72 || bytes[14] !== 68 || bytes[15] !== 82) {
17119
+ return null;
17120
+ }
17121
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
17122
+ return { width: view.getUint32(16), height: view.getUint32(20) };
17123
+ }
17124
+ function jpegDimensions(bytes) {
17125
+ if (bytes.length < 4 || bytes[0] !== 255 || bytes[1] !== 216) return null;
17126
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
17127
+ let offset = 2;
17128
+ while (offset + 4 <= bytes.length) {
17129
+ if (bytes[offset] !== 255) return null;
17130
+ while (bytes[offset + 1] === 255 && offset + 2 < bytes.length) offset++;
17131
+ const marker = bytes[offset + 1] ?? 0;
17132
+ offset += 2;
17133
+ if (marker === 1 || marker >= 208 && marker <= 215) continue;
17134
+ if (marker === 217 || marker === 218) return null;
17135
+ if (offset + 2 > bytes.length) return null;
17136
+ const length = view.getUint16(offset);
17137
+ if (length < 2) return null;
17138
+ const isStartOfFrame = marker >= 192 && marker <= 207 && marker !== 196 && // DHT
17139
+ marker !== 200 && // JPG (reserved)
17140
+ marker !== 204;
17141
+ if (isStartOfFrame) {
17142
+ if (offset + 7 > bytes.length) return null;
17143
+ return {
17144
+ width: view.getUint16(offset + 5),
17145
+ height: view.getUint16(offset + 3)
17146
+ };
17147
+ }
17148
+ offset += length;
17149
+ }
17150
+ return null;
17151
+ }
17099
17152
  function sessionIdentityDescriptionLength(value) {
17100
17153
  let length = 0;
17101
17154
  for (const char of value) {
@@ -17243,7 +17296,7 @@ function isChatMessageEvent(trigger) {
17243
17296
  function hasFilterValue(trigger, path2, expected) {
17244
17297
  return trigger.where?.[path2] === expected;
17245
17298
  }
17246
- var RESOURCE_KIND_SESSION, TriggerFilterScalarSchema, TriggerFilterPathSchema, TriggerFilterClauseSchema, TriggerFilterSchema, SessionTriggerCheckTimeoutSchema, TriggerEventSchema, TriggerEventsSchema, SessionTriggerSharedFields, SessionTriggerEventSourceFields, SessionTriggerBaseSchema, SessionTriggerDefinitionBaseSchema, SessionTriggerSchema, SessionApplyTriggerSchema, SessionHeartbeatTriggerBaseSchema, SessionHeartbeatTriggerSchema, SessionApplyHeartbeatTriggerSchema, SessionTriggerDefinitionSchema, SessionApplyTriggerDefinitionSchema, SessionTriggersSchema, SessionApplyTriggersSchema, AVATAR_ASSET_EXTENSIONS, MAX_AVATAR_ASSET_BYTES, SESSION_IDENTITY_DESCRIPTION_MAX_LENGTH, SHA256_HEX_PATTERN, SessionIdentitySchema, SessionSpecSchema, SessionApplySpecSchema, SessionStatusSchema, SessionResourceSchema, SessionApplyRequestSchema, SessionApplyTriggerReceiptSchema, SessionApplyResponseSchema, SESSION_TELEGRAM_IDENTITY_STATUSES, SessionTelegramIdentityStatusSchema, SessionPresenceIdentitySchema, SessionPresenceResponseSchema, SessionPresenceConnectRequestSchema, SessionPresenceConnectPendingSchema, SessionPresenceConnectResponseSchema, SessionPresenceIconRequestSchema, SessionPresenceIconResponseSchema, SessionPresenceCompleteResponseSchema;
17299
+ var RESOURCE_KIND_SESSION, TriggerFilterScalarSchema, TriggerFilterPathSchema, TriggerFilterClauseSchema, TriggerFilterSchema, SessionTriggerCheckTimeoutSchema, TriggerEventSchema, TriggerEventsSchema, SessionTriggerSharedFields, SessionTriggerEventSourceFields, SessionTriggerBaseSchema, SessionTriggerDefinitionBaseSchema, SessionTriggerSchema, SessionApplyTriggerSchema, SessionHeartbeatTriggerBaseSchema, SessionHeartbeatTriggerSchema, SessionApplyHeartbeatTriggerSchema, SessionTriggerDefinitionSchema, SessionApplyTriggerDefinitionSchema, SessionTriggersSchema, SessionApplyTriggersSchema, AVATAR_ASSET_EXTENSIONS, MAX_AVATAR_ASSET_BYTES, MIN_AVATAR_ASSET_DIMENSION_PX, MAX_AVATAR_ASSET_DIMENSION_PX, PNG_SIGNATURE, SESSION_IDENTITY_DESCRIPTION_MAX_LENGTH, SHA256_HEX_PATTERN, SessionIdentitySchema, SessionSpecSchema, SessionApplySpecSchema, SessionStatusSchema, SessionResourceSchema, SessionApplyRequestSchema, SessionApplyTriggerReceiptSchema, SessionApplyResponseSchema, SESSION_TELEGRAM_IDENTITY_STATUSES, SessionTelegramIdentityStatusSchema, SessionPresenceIdentitySchema, SessionPresenceResponseSchema, SessionPresenceConnectRequestSchema, SessionPresenceConnectPendingSchema, SessionPresenceConnectResponseSchema, SessionPresenceIconRequestSchema, SessionPresenceIconResponseSchema, SessionPresenceCompleteResponseSchema;
17247
17300
  var init_sessions = __esm({
17248
17301
  "../../packages/schemas/src/sessions.ts"() {
17249
17302
  "use strict";
@@ -17420,6 +17473,9 @@ var init_sessions = __esm({
17420
17473
  ).transform(expandSessionApplyTriggerDefinitions).superRefine(validateAttributedRunsTriggerPairing);
17421
17474
  AVATAR_ASSET_EXTENSIONS = [".png", ".jpg", ".jpeg"];
17422
17475
  MAX_AVATAR_ASSET_BYTES = 2 * 1024 * 1024;
17476
+ MIN_AVATAR_ASSET_DIMENSION_PX = 512;
17477
+ MAX_AVATAR_ASSET_DIMENSION_PX = 2e3;
17478
+ PNG_SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10];
17423
17479
  SESSION_IDENTITY_DESCRIPTION_MAX_LENGTH = 140;
17424
17480
  SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/;
17425
17481
  SessionIdentitySchema = external_exports.object({
@@ -20838,6 +20894,12 @@ function readApplyAssets(resources, projectRoot) {
20838
20894
  projectRoot
20839
20895
  });
20840
20896
  const bytes = readFileSync3(resolvedPath);
20897
+ const dimensionsProblem = avatarAssetDimensionsProblem(bytes);
20898
+ if (dimensionsProblem) {
20899
+ throw new Error(
20900
+ `Invalid session identity avatar asset for "${resource.metadata.name}": ${dimensionsProblem}`
20901
+ );
20902
+ }
20841
20903
  assets[avatarAsset] = {
20842
20904
  sha256: createHash2("sha256").update(bytes).digest("hex"),
20843
20905
  contentType: extname(resolvedPath).toLowerCase() === ".png" ? "image/png" : "image/jpeg",
@@ -21613,7 +21675,7 @@ var init_package = __esm({
21613
21675
  "package.json"() {
21614
21676
  package_default = {
21615
21677
  name: "@autohq/cli",
21616
- version: "0.1.94",
21678
+ version: "0.1.96",
21617
21679
  license: "SEE LICENSE IN README.md",
21618
21680
  publishConfig: {
21619
21681
  access: "public"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autohq/cli",
3
- "version": "0.1.94",
3
+ "version": "0.1.96",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"