@agentknight/client 0.9.38 → 0.9.39

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.
@@ -18906,7 +18906,7 @@ function sameClientPath(left, right, cwd = process.cwd()) {
18906
18906
  return process.platform === "win32" ? leftPath.toLowerCase() === rightPath.toLowerCase() : leftPath === rightPath;
18907
18907
  }
18908
18908
  function isClientConfigurationKey(key) {
18909
- return directoryAliases.some(([legacy]) => key === legacy) || /^(?:RELAY_|USER_ID$|AGENTKNIGHT_|PAIRING_|SESSION_REFRESH_|HEARTBEAT_|LOG_LEVEL$|SHOW_PAIRING_|PC_AGENT_|SNAPSHOT_|TIMELINE_|SECURE_MESSAGE_)/u.test(key);
18909
+ return directoryAliases.some(([legacy]) => key === legacy) || /^(?:RELAY_|USER_ID$|AGENTKNIGHT_|PAIRING_|SESSION_REFRESH_|SESSION_IMAGES_|HEARTBEAT_|LOG_LEVEL$|SHOW_PAIRING_|PC_AGENT_|SNAPSHOT_|TIMELINE_|SECURE_MESSAGE_)/u.test(key);
18910
18910
  }
18911
18911
  function clearClientConfiguration(environment) {
18912
18912
  for (const key of Object.keys(environment)) {
@@ -19391,7 +19391,7 @@ async function installPreparedPackage(options) {
19391
19391
  import { createConnection, createServer } from "node:net";
19392
19392
  import { join as join5, resolve as resolve3 } from "node:path";
19393
19393
 
19394
- // ../../shared/sdk/dist/chunks/chunk-GNQC2IS2.js
19394
+ // ../../shared/sdk/dist/chunks/chunk-E3XCZWRK.js
19395
19395
  var IdSchema = external_exports.string().trim().min(1).max(256);
19396
19396
  var IsoDateSchema = external_exports.iso.datetime({ offset: true });
19397
19397
  var Base64UrlKeyIdSchema = external_exports.string().regex(/^[A-Za-z0-9_-]{22}$/u, "Expected a 16-byte base64url key ID");
@@ -21055,12 +21055,16 @@ var SESSION_DIRECTORY_MAX_DEPTH = 32;
21055
21055
  var SESSION_DIRECTORY_MAX_ENTRIES = 500;
21056
21056
  var SESSION_DIRECTORY_MAX_RESPONSE_BYTES = 128 * 1024;
21057
21057
  var SESSION_FILE_MAX_ORIGINAL_BYTES = 500 * 1024;
21058
+ var SESSION_FILE_V2_MAX_ORIGINAL_BYTES = 1024 * 1024;
21058
21059
  var SESSION_FILE_GZIP_THRESHOLD_BYTES = 20 * 1024;
21059
21060
  var SESSION_FILE_MAX_IMAGE_BYTES = 100 * 1024;
21060
21061
  var SESSION_FILE_MAX_IMAGE_PIXELS = 16 * 1024 * 1024;
21061
21062
  var SESSION_FILE_MAX_TRANSFER_BYTES = SESSION_FILE_MAX_ORIGINAL_BYTES + 1024;
21062
21063
  var SESSION_FILE_MAX_BASE64_LENGTH = Math.ceil(SESSION_FILE_MAX_TRANSFER_BYTES / 3) * 4;
21063
21064
  var SESSION_FILE_MAX_RESPONSE_BYTES = SESSION_FILE_MAX_BASE64_LENGTH + 8192;
21065
+ var SESSION_FILE_V2_MAX_TRANSFER_BYTES = SESSION_FILE_V2_MAX_ORIGINAL_BYTES + 1024;
21066
+ var SESSION_FILE_V2_MAX_BASE64_LENGTH = Math.ceil(SESSION_FILE_V2_MAX_TRANSFER_BYTES / 3) * 4;
21067
+ var SESSION_FILE_V2_MAX_RESPONSE_BYTES = SESSION_FILE_V2_MAX_BASE64_LENGTH + 8192;
21064
21068
  var SESSION_FILE_MEDIA_TYPES = [
21065
21069
  "text/plain",
21066
21070
  "text/html",
@@ -21073,6 +21077,9 @@ var SESSION_FILE_MEDIA_TYPES = [
21073
21077
  "application/yaml",
21074
21078
  "image/webp"
21075
21079
  ];
21080
+ var SESSION_FILE_VIDEO_MEDIA_TYPES = ["video/mp4", "video/webm"];
21081
+ var SESSION_FILE_V2_MEDIA_TYPES = [...SESSION_FILE_MEDIA_TYPES, ...SESSION_FILE_VIDEO_MEDIA_TYPES];
21082
+ var SESSION_FILE_MAX_VIDEO_PIXELS = 16 * 1024 * 1024;
21076
21083
  function isSafeSessionDirectoryPath(path2) {
21077
21084
  if (path2 === "")
21078
21085
  return true;
@@ -21110,27 +21117,35 @@ var SessionFileReadDataSchema = external_exports.object({
21110
21117
  path: external_exports.string().min(1).max(SESSION_DIRECTORY_MAX_PATH_LENGTH).refine(isSafeSessionDirectoryPath),
21111
21118
  rootRevision: external_exports.string().regex(/^[A-Za-z0-9_-]{43}$/u)
21112
21119
  }).strict();
21113
- var SessionFileReadResultDataSchema = external_exports.object({
21114
- path: SessionFileReadDataSchema.shape.path,
21115
- rootRevision: SessionFileReadDataSchema.shape.rootRevision,
21116
- mediaType: external_exports.enum(SESSION_FILE_MEDIA_TYPES),
21117
- originalByteLength: external_exports.number().int().min(0).max(SESSION_FILE_MAX_ORIGINAL_BYTES),
21118
- // Canonical length after decompression, not the length of the transport bytes.
21119
- byteLength: external_exports.number().int().min(0).max(SESSION_FILE_MAX_ORIGINAL_BYTES),
21120
- encoding: external_exports.enum(["identity", "gzip"]),
21121
- data: external_exports.string().max(SESSION_FILE_MAX_BASE64_LENGTH)
21122
- }).strict().superRefine((result, context) => {
21123
- const invalid = () => context.addIssue({ code: "custom", message: "Invalid file content" });
21124
- if (result.encoding === "gzip" !== result.originalByteLength >= SESSION_FILE_GZIP_THRESHOLD_BYTES)
21125
- invalid();
21126
- if (result.mediaType === "image/webp" ? result.byteLength === 0 || result.byteLength > SESSION_FILE_MAX_IMAGE_BYTES || result.originalByteLength === 0 : result.byteLength !== result.originalByteLength)
21127
- invalid();
21128
- const base643 = result.data;
21129
- const padding = base643.endsWith("==") ? 2 : base643.endsWith("=") ? 1 : 0;
21130
- const length = base643.length / 4 * 3 - padding;
21131
- if (base643.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/u.test(base643) || length > SESSION_FILE_MAX_TRANSFER_BYTES || padding === 2 && !/[AQgw]==$/u.test(base643) || padding === 1 && !/[AEIMQUYcgkosw048]=$/u.test(base643) || (result.encoding === "identity" ? length !== result.byteLength : length < 20))
21132
- invalid();
21133
- });
21120
+ function fileResultSchema(mediaTypes, extended) {
21121
+ const maxOriginal = extended ? SESSION_FILE_V2_MAX_ORIGINAL_BYTES : SESSION_FILE_MAX_ORIGINAL_BYTES;
21122
+ const maxTransfer = extended ? SESSION_FILE_V2_MAX_TRANSFER_BYTES : SESSION_FILE_MAX_TRANSFER_BYTES;
21123
+ return external_exports.object({
21124
+ path: SessionFileReadDataSchema.shape.path,
21125
+ rootRevision: SessionFileReadDataSchema.shape.rootRevision,
21126
+ mediaType: external_exports.enum(mediaTypes),
21127
+ originalByteLength: external_exports.number().int().min(0).max(maxOriginal),
21128
+ // Canonical length after decompression, not the length of the transport bytes.
21129
+ byteLength: external_exports.number().int().min(0).max(maxOriginal),
21130
+ encoding: external_exports.enum(["identity", "gzip"]),
21131
+ data: external_exports.string().max(extended ? SESSION_FILE_V2_MAX_BASE64_LENGTH : SESSION_FILE_MAX_BASE64_LENGTH)
21132
+ }).strict().superRefine((result, context) => {
21133
+ const invalid = () => context.addIssue({ code: "custom", message: "Invalid file content" });
21134
+ if (result.encoding === "gzip" !== result.originalByteLength >= SESSION_FILE_GZIP_THRESHOLD_BYTES)
21135
+ invalid();
21136
+ if (result.mediaType === "image/webp" ? result.byteLength === 0 || result.byteLength > SESSION_FILE_MAX_IMAGE_BYTES || result.originalByteLength === 0 : result.byteLength !== result.originalByteLength)
21137
+ invalid();
21138
+ if (result.mediaType.startsWith("video/") && (result.byteLength === 0 || !result.path.toLowerCase().endsWith(result.mediaType === "video/mp4" ? ".mp4" : ".webm")))
21139
+ invalid();
21140
+ const base643 = result.data;
21141
+ const padding = base643.endsWith("==") ? 2 : base643.endsWith("=") ? 1 : 0;
21142
+ const length = base643.length / 4 * 3 - padding;
21143
+ if (base643.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/u.test(base643) || length > maxTransfer || padding === 2 && !/[AQgw]==$/u.test(base643) || padding === 1 && !/[AEIMQUYcgkosw048]=$/u.test(base643) || (result.encoding === "identity" ? length !== result.byteLength : length < 20))
21144
+ invalid();
21145
+ });
21146
+ }
21147
+ var SessionFileReadResultDataSchema = fileResultSchema(SESSION_FILE_MEDIA_TYPES, false);
21148
+ var SessionFileReadV2ResultDataSchema = fileResultSchema(SESSION_FILE_V2_MEDIA_TYPES, true);
21134
21149
  var SessionGitProjectSchema = external_exports.object({
21135
21150
  localRepositoryKey: external_exports.string().length(43).regex(/^[A-Za-z0-9_-]{43}$/),
21136
21151
  worktreeRoot: external_exports.string().min(1).max(SESSION_PROJECT_IDENTITY_MAX_PATH_LENGTH),
@@ -21231,6 +21246,65 @@ var SessionResourceReadResultDataSchema = external_exports.object({
21231
21246
  if (base643.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/u.test(base643) || length > SESSION_RESOURCE_MAX_TRANSFER_BYTES || padding === 2 && !/[AQgw]==$/u.test(base643) || padding === 1 && !/[AEIMQUYcgkosw048]=$/u.test(base643) || (result.encoding === "identity" ? length !== result.byteLength : length < 20))
21232
21247
  invalid();
21233
21248
  });
21249
+ var SESSION_IMAGE_MAX_BYTES = 3 * 1024 * 1024;
21250
+ var SESSION_IMAGE_MAX_PIXELS = 16 * 1024 * 1024;
21251
+ var SessionImageIdSchema = external_exports.uuid();
21252
+ var SessionImageTransferModeSchema = external_exports.enum(["direct", "proxy"]);
21253
+ var DirectUrlSchema = external_exports.string().regex(/^https:\/\/[^/?#@\\\s\x00-\x1f\x7f]+(?:[/?][^#\\\s\x00-\x1f\x7f]*)?$/u).refine((raw) => {
21254
+ if (!URL.canParse(raw))
21255
+ return false;
21256
+ const url2 = new URL(raw);
21257
+ return url2.protocol === "https:" && url2.username === "" && url2.password === "" && url2.hash === "";
21258
+ }, "Direct transfers require HTTPS without userinfo, fragments or unsafe characters");
21259
+ var ProxyUrlSchema = external_exports.string().regex(/^\/api\/v3\/session-images\/[0-9a-f-]+\/content\?[^#\\\s\x00-\x1f\x7f]+$/u);
21260
+ var SessionImageTransferHeadersSchema = external_exports.record(external_exports.string().regex(/^(?:content-type|if-none-match|x-ms-blob-type)$/u), external_exports.string().min(1).max(256).regex(/^[\x20-\x7e]+$/u));
21261
+ var SessionImageUploadRequestSchema = external_exports.object({
21262
+ machineId: IdSchema,
21263
+ sessionId: IdSchema,
21264
+ sizeBytes: external_exports.number().int().min(1).max(SESSION_IMAGE_MAX_BYTES)
21265
+ }).strict();
21266
+ var SessionImageScopeSchema = external_exports.object({
21267
+ machineId: IdSchema,
21268
+ sessionId: IdSchema
21269
+ }).strict();
21270
+ var UploadResultFields = {
21271
+ imageId: SessionImageIdSchema,
21272
+ uploadExpiresAt: external_exports.number().int().positive(),
21273
+ method: external_exports.literal("PUT"),
21274
+ contentType: external_exports.literal("image/webp"),
21275
+ headers: SessionImageTransferHeadersSchema.refine((headers) => headers["content-type"] === "image/webp")
21276
+ };
21277
+ var SessionImageUploadResultSchema = external_exports.discriminatedUnion("mode", [
21278
+ external_exports.object({ ...UploadResultFields, mode: external_exports.literal("direct"), uploadUrl: DirectUrlSchema }).strict(),
21279
+ external_exports.object({ ...UploadResultFields, mode: external_exports.literal("proxy"), uploadUrl: ProxyUrlSchema }).strict()
21280
+ ]);
21281
+ var SessionImageCommitResultSchema = external_exports.object({
21282
+ imageId: SessionImageIdSchema,
21283
+ machineId: IdSchema,
21284
+ sessionId: IdSchema,
21285
+ sizeBytes: external_exports.number().int().min(1).max(SESSION_IMAGE_MAX_BYTES),
21286
+ width: external_exports.number().int().positive(),
21287
+ height: external_exports.number().int().positive(),
21288
+ sha256: external_exports.string().regex(/^[a-f0-9]{64}$/u),
21289
+ expiresAt: external_exports.number().int().positive()
21290
+ }).strict();
21291
+ var DownloadResultFields = {
21292
+ image: SessionImageCommitResultSchema,
21293
+ downloadExpiresAt: external_exports.number().int().positive(),
21294
+ method: external_exports.literal("GET"),
21295
+ headers: SessionImageTransferHeadersSchema
21296
+ };
21297
+ var SessionImageDownloadResultSchema = external_exports.discriminatedUnion("mode", [
21298
+ external_exports.object({ ...DownloadResultFields, mode: external_exports.literal("direct"), downloadUrl: DirectUrlSchema }).strict(),
21299
+ external_exports.object({ ...DownloadResultFields, mode: external_exports.literal("proxy"), downloadUrl: ProxyUrlSchema }).strict()
21300
+ ]);
21301
+ var TimelineImageBlobRequestSchema = external_exports.object({
21302
+ sha256: external_exports.string().regex(/^[a-f0-9]{64}$/u)
21303
+ }).strict();
21304
+ var TimelineImageBlobResultSchema = external_exports.object({
21305
+ sha256: TimelineImageBlobRequestSchema.shape.sha256,
21306
+ image: SessionImageCommitResultSchema
21307
+ }).strict();
21234
21308
  var SESSION_RENAME_OPERATION = "session.rename";
21235
21309
  var SESSION_RENAME_VERSION = 1;
21236
21310
  var SESSION_RENAME_CAPABILITY = sessionCommunicationOperationCapability(SESSION_RENAME_OPERATION, SESSION_RENAME_VERSION);
@@ -21722,6 +21796,13 @@ var WorkbenchAndroidSchemas = {
21722
21796
  WorkbenchCompactResult: WorkbenchCompactResultSchema
21723
21797
  };
21724
21798
  var AndroidProtocolSchemas = {
21799
+ TimelineImageBlobRequest: TimelineImageBlobRequestSchema,
21800
+ TimelineImageBlobResult: TimelineImageBlobResultSchema,
21801
+ SessionImageUploadRequest: SessionImageUploadRequestSchema,
21802
+ SessionImageScope: SessionImageScopeSchema,
21803
+ SessionImageUploadResult: SessionImageUploadResultSchema,
21804
+ SessionImageCommitResult: SessionImageCommitResultSchema,
21805
+ SessionImageDownloadResult: SessionImageDownloadResultSchema,
21725
21806
  ...WorkbenchAndroidSchemas,
21726
21807
  ...ScheduleAndroidSchemas,
21727
21808
  SessionCommunication: SessionCommunicationSchema,
@@ -21735,6 +21816,7 @@ var AndroidProtocolSchemas = {
21735
21816
  SessionDirectoryListResultData: SessionDirectoryListResultDataSchema,
21736
21817
  SessionFileReadData: SessionFileReadDataSchema,
21737
21818
  SessionFileReadResultData: SessionFileReadResultDataSchema,
21819
+ SessionFileReadV2ResultData: SessionFileReadV2ResultDataSchema,
21738
21820
  SessionResourceReadData: SessionResourceReadDataSchema,
21739
21821
  SessionResourceReadResultData: SessionResourceReadResultDataSchema,
21740
21822
  SessionDirectoryListRequest: SessionDirectoryListRequestSchema,
@@ -21823,7 +21905,7 @@ var AndroidProtocolSchemas = {
21823
21905
  ProtocolError: ProtocolErrorSchema
21824
21906
  };
21825
21907
 
21826
- // ../../shared/sdk/dist/chunks/chunk-4FC2WG64.js
21908
+ // ../../shared/sdk/dist/chunks/chunk-UE4QYZCG.js
21827
21909
  var OwnerSchema = external_exports.object({ pid: external_exports.number().int().positive(), instanceId: external_exports.uuid().optional() });
21828
21910
  var PeerChatRequestSchema = external_exports.object({
21829
21911
  sessionId: IdSchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentknight/client",
3
- "version": "0.9.38",
3
+ "version": "0.9.39",
4
4
  "description": "AgentKnight PC Agent CLI for remote Copilot, PI and ACP coding sessions",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -41,7 +41,7 @@
41
41
  "qrcode": "1.5.4",
42
42
  "qrcode-terminal": "0.12.0",
43
43
  "zod": "4.5.4",
44
- "@agentknight/sdk": "0.9.38"
44
+ "@agentknight/sdk": "0.9.39"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/qrcode": "1.5.6",
@@ -49,8 +49,8 @@
49
49
  "esbuild": "0.28.2",
50
50
  "sharp": "0.34.5",
51
51
  "socket.io-client": "4.8.3",
52
- "@agentknight/protocol": "0.1.0",
53
- "@agentknight/shared": "0.1.0"
52
+ "@agentknight/shared": "0.1.0",
53
+ "@agentknight/protocol": "0.1.0"
54
54
  },
55
55
  "scripts": {
56
56
  "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",