@autohq/cli 0.1.95 → 0.1.97

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 +67 -6
  2. package/package.json +2 -3
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({
@@ -19155,7 +19211,7 @@ function createApiClient(input) {
19155
19211
  const organizationId = input.env.AUTO_ORGANIZATION_ID?.trim() || config2.organizationId;
19156
19212
  if (!organizationId) {
19157
19213
  throw new Error(
19158
- "No active organization. Run `auto login` and select an organization first."
19214
+ "No active organization. Run `auto auth login` to sign in, then `auto orgs use <organization>` to select one."
19159
19215
  );
19160
19216
  }
19161
19217
  return { organizationId };
@@ -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.95",
21678
+ version: "0.1.97",
21617
21679
  license: "SEE LICENSE IN README.md",
21618
21680
  publishConfig: {
21619
21681
  access: "public"
@@ -21628,8 +21690,7 @@ var init_package = __esm({
21628
21690
  },
21629
21691
  type: "module",
21630
21692
  bin: {
21631
- auto: "./dist/index.js",
21632
- "auto-agent-bridge": "./dist/agent-bridge.js"
21693
+ auto: "./dist/index.js"
21633
21694
  },
21634
21695
  files: ["dist"],
21635
21696
  scripts: {
@@ -30136,7 +30197,7 @@ function registerProjectCommands(program, context) {
30136
30197
  ).option("--api-url <url>", "Auto API base URL").option("--server <url>", "Auto web server URL").action(async (options) => {
30137
30198
  await handleProjectsList(context, options);
30138
30199
  });
30139
- projects.command("create").description("Create a project in the active organization.").requiredOption("--name <name>", "Project name").option("--api-url <url>", "Auto API base URL").option("--server <url>", "Auto web server URL").option("--use", "Set the new project as active").action(async (options) => {
30200
+ projects.command("create").description("Create a project in the active organization.").requiredOption("--name <name>", "Project name").option("--api-url <url>", "Auto API base URL").option("--server <url>", "Auto web server URL").option("--use", "Set the new project as active", true).option("--no-use", "Keep the current active project").action(async (options) => {
30140
30201
  const response = await createDirectoryClient(context).createProject({
30141
30202
  projectName: options.name,
30142
30203
  apiBaseUrl: apiUrlFromOptions(context, options)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autohq/cli",
3
- "version": "0.1.95",
3
+ "version": "0.1.97",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -15,8 +15,7 @@
15
15
  },
16
16
  "type": "module",
17
17
  "bin": {
18
- "auto": "./dist/index.js",
19
- "auto-agent-bridge": "./dist/agent-bridge.js"
18
+ "auto": "./dist/index.js"
20
19
  },
21
20
  "files": ["dist"],
22
21
  "scripts": {