@isaacthoman/pulpo 0.149.0 → 0.151.0

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 +192 -7
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -14773,6 +14773,50 @@ var avatarCropSettingsSchema = external_exports.object({
14773
14773
  offsetY: external_exports.number()
14774
14774
  });
14775
14775
 
14776
+ // ../../packages/contracts/dist/admin-analytics.js
14777
+ var clientPlatformSchema = external_exports.enum(["web", "desktop", "ios", "android", "cli", "api", "unknown"]);
14778
+ var analyticsRangeSchema = external_exports.enum(["1h", "24h", "7d", "30d", "90d", "all", "custom"]);
14779
+ var analyticsBucketSchema = external_exports.enum(["hour", "day"]);
14780
+ function validTimeZone(value) {
14781
+ try {
14782
+ new Intl.DateTimeFormat("en-US", { timeZone: value }).format();
14783
+ return true;
14784
+ } catch {
14785
+ return false;
14786
+ }
14787
+ }
14788
+ var booleanFilter = external_exports.enum(["true", "false"]).optional();
14789
+ var csvFilter = external_exports.string().trim().max(500).optional();
14790
+ var analyticsRangeQuerySchema = external_exports.object({
14791
+ range: analyticsRangeSchema.default("24h"),
14792
+ from: external_exports.iso.datetime({ offset: true }).optional(),
14793
+ to: external_exports.iso.datetime({ offset: true }).optional(),
14794
+ timeZone: external_exports.string().trim().min(1).max(100).refine(validTimeZone, "Invalid time zone").default("UTC")
14795
+ }).refine((value) => value.range !== "custom" || Boolean(value.from), {
14796
+ message: "Custom ranges need a start time",
14797
+ path: ["from"]
14798
+ });
14799
+ var adminRequestFiltersSchema = external_exports.object({
14800
+ status: csvFilter,
14801
+ origin: csvFilter,
14802
+ platform: csvFilter,
14803
+ model: csvFilter,
14804
+ userId: external_exports.uuid().optional(),
14805
+ apiKeyId: external_exports.uuid().optional(),
14806
+ errorCategory: csvFilter,
14807
+ retry: booleanFilter,
14808
+ fallback: booleanFilter,
14809
+ agent: booleanFilter,
14810
+ ocr: booleanFilter
14811
+ });
14812
+ var adminRequestSortSchema = external_exports.enum(["newest", "slowest", "costliest"]);
14813
+ var insightsFiltersSchema = external_exports.object({
14814
+ platform: csvFilter,
14815
+ plan: csvFilter,
14816
+ origin: csvFilter,
14817
+ model: csvFilter
14818
+ });
14819
+
14776
14820
  // ../../packages/contracts/dist/attachment-limits.js
14777
14821
  var MAX_MESSAGE_ATTACHMENTS = 500;
14778
14822
  var DEFAULT_MAX_INLINE_IMAGES = 5;
@@ -16595,6 +16639,98 @@ var shelfMutationSchema = external_exports.object({
16595
16639
  ])
16596
16640
  });
16597
16641
 
16642
+ // ../../packages/contracts/dist/files.js
16643
+ var FILE_NAME_MAX_LENGTH = 255;
16644
+ function normalizeFileName(value) {
16645
+ return value.normalize("NFC").trim();
16646
+ }
16647
+ function fileNameError(name) {
16648
+ if (!name)
16649
+ return "empty";
16650
+ if ([...name].length > FILE_NAME_MAX_LENGTH)
16651
+ return "too_long";
16652
+ if (name === "." || name === "..")
16653
+ return "reserved";
16654
+ for (const character of name) {
16655
+ const code = character.charCodeAt(0);
16656
+ if (character === "/" || code < 32 || code === 127)
16657
+ return "invalid_character";
16658
+ }
16659
+ return null;
16660
+ }
16661
+ var fileNameSchema = external_exports.string().max(4 * FILE_NAME_MAX_LENGTH).transform(normalizeFileName).superRefine((name, context) => {
16662
+ const error51 = fileNameError(name);
16663
+ if (error51)
16664
+ context.addIssue({ code: "custom", message: `Invalid file name (${error51})` });
16665
+ });
16666
+ var fileNodeKindSchema = external_exports.enum(["folder", "doc", "blob"]);
16667
+ var fileNodeStatusSchema = external_exports.enum(["pending", "ready"]);
16668
+ var fileNodeSchema = external_exports.object({
16669
+ id: external_exports.uuid(),
16670
+ parentId: external_exports.uuid().nullable(),
16671
+ kind: fileNodeKindSchema,
16672
+ name: external_exports.string(),
16673
+ status: fileNodeStatusSchema,
16674
+ mimeType: external_exports.string().nullable(),
16675
+ sizeBytes: external_exports.number().int().nonnegative(),
16676
+ revision: external_exports.number().int().nonnegative(),
16677
+ trashedAt: external_exports.string().nullable(),
16678
+ createdAt: external_exports.string(),
16679
+ updatedAt: external_exports.string()
16680
+ });
16681
+ var createFileFolderSchema = external_exports.object({
16682
+ parentId: external_exports.uuid().nullable().default(null),
16683
+ name: fileNameSchema
16684
+ });
16685
+ var FILE_DOC_MAX_MARKDOWN_LENGTH = 2e6;
16686
+ var createFileDocSchema = external_exports.object({
16687
+ parentId: external_exports.uuid().nullable().default(null),
16688
+ name: fileNameSchema.optional(),
16689
+ /** Initial content, e.g. when importing an uploaded .md file. */
16690
+ markdown: external_exports.string().max(FILE_DOC_MAX_MARKDOWN_LENGTH).optional()
16691
+ });
16692
+ var updateFileNodeSchema = external_exports.object({
16693
+ name: fileNameSchema.optional(),
16694
+ parentId: external_exports.uuid().nullable().optional(),
16695
+ expectedRevision: external_exports.number().int().nonnegative().optional()
16696
+ }).refine((input) => input.name !== void 0 || input.parentId !== void 0, { message: "Nothing to update" });
16697
+ var FILE_BATCH_MAX_ITEMS = 500;
16698
+ var fileIdsSchema = external_exports.array(external_exports.uuid()).min(1).max(FILE_BATCH_MAX_ITEMS);
16699
+ var fileNodeIdsSchema = external_exports.object({ ids: fileIdsSchema });
16700
+ var moveFileNodesSchema = external_exports.object({
16701
+ items: external_exports.array(external_exports.object({
16702
+ id: external_exports.uuid(),
16703
+ parentId: external_exports.uuid().nullable(),
16704
+ /** Optional target name, e.g. when undoing a move that had to rename. */
16705
+ name: fileNameSchema.optional()
16706
+ })).min(1).max(FILE_BATCH_MAX_ITEMS)
16707
+ });
16708
+ var saveAttachmentToFilesSchema = external_exports.object({
16709
+ parentId: external_exports.uuid().nullable().default(null),
16710
+ name: fileNameSchema.optional(),
16711
+ replaceId: external_exports.uuid().optional()
16712
+ });
16713
+ var copyFileNodesSchema = external_exports.object({
16714
+ ids: fileIdsSchema,
16715
+ parentId: external_exports.uuid().nullable()
16716
+ });
16717
+ var reserveFileUploadSchema = external_exports.object({
16718
+ parentId: external_exports.uuid().nullable().default(null),
16719
+ name: fileNameSchema,
16720
+ mimeType: external_exports.string().min(1).max(255),
16721
+ // The per-file cap is an admin setting enforced when the upload is reserved.
16722
+ sizeBytes: external_exports.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER)
16723
+ });
16724
+ var fileGridPositionSchema = external_exports.object({
16725
+ x: external_exports.number().int().min(0).max(1e6),
16726
+ y: external_exports.number().int().min(0).max(1e6)
16727
+ });
16728
+ var updateFileFolderLayoutSchema = external_exports.object({
16729
+ folderId: external_exports.uuid().nullable(),
16730
+ snapToGrid: external_exports.boolean().optional(),
16731
+ positions: external_exports.record(external_exports.uuid(), fileGridPositionSchema.nullable()).refine((positions) => Object.keys(positions).length <= 5e3, { message: "Too many positions" }).optional()
16732
+ });
16733
+
16598
16734
  // ../../packages/contracts/dist/index.js
16599
16735
  var idSchema = external_exports.uuid();
16600
16736
  var isoDateSchema = external_exports.iso.datetime();
@@ -16667,6 +16803,16 @@ var nativeAuthResponseSchema = external_exports.object({
16667
16803
  user: userSchema,
16668
16804
  session: nativeSessionSchema
16669
16805
  });
16806
+ var signedInAccountSchema = external_exports.object({
16807
+ id: idSchema,
16808
+ name: external_exports.string(),
16809
+ username: external_exports.string(),
16810
+ email: external_exports.string(),
16811
+ avatarUrl: external_exports.string().nullable(),
16812
+ profileColor: external_exports.string().nullable(),
16813
+ active: external_exports.boolean()
16814
+ });
16815
+ var signedInAccountListSchema = external_exports.object({ accounts: external_exports.array(signedInAccountSchema) });
16670
16816
  var mobileConfigSchema = external_exports.object({
16671
16817
  mobileApiVersion: external_exports.literal(1),
16672
16818
  instance: external_exports.object({
@@ -16853,6 +16999,13 @@ var poolInvitationSchema = external_exports.object({
16853
16999
  memberCount: external_exports.number().int().min(1).max(6),
16854
17000
  createdAt: isoDateSchema
16855
17001
  });
17002
+ var usageLimitBarSchema = external_exports.object({
17003
+ remainingPercentage: external_exports.number().int().min(0).max(100),
17004
+ availableBarPercentage: external_exports.number().min(0).max(100),
17005
+ pendingMicros: external_exports.number().int().nonnegative(),
17006
+ pendingBarPercentage: external_exports.number().min(0).max(100),
17007
+ resetsAt: isoDateSchema.nullable()
17008
+ });
16856
17009
  var poolSummarySchema = external_exports.object({
16857
17010
  accountBalanceMicros: external_exports.number().int().nonnegative(),
16858
17011
  pool: external_exports.object({
@@ -16860,7 +17013,13 @@ var poolSummarySchema = external_exports.object({
16860
17013
  ownerUserId: idSchema,
16861
17014
  pooledBalanceMicros: external_exports.number().int().nonnegative(),
16862
17015
  members: external_exports.array(poolMemberSchema).max(6),
16863
- pendingInvitations: external_exports.array(poolInvitationSchema)
17016
+ pendingInvitations: external_exports.array(poolInvitationSchema),
17017
+ /** Shared weekly usage from Fat subscribers in the pool; null when nobody shares. */
17018
+ sharedUsage: external_exports.object({
17019
+ total: usageLimitBarSchema,
17020
+ /** The viewer's own five-hour limit on drawing from others' shared usage. */
17021
+ fiveHour: usageLimitBarSchema.nullable()
17022
+ }).nullable()
16864
17023
  }).nullable(),
16865
17024
  incomingInvitations: external_exports.array(poolInvitationSchema)
16866
17025
  });
@@ -17236,6 +17395,9 @@ var modelPreferencesPatchSchema = external_exports.object({
17236
17395
  providerOrder: orderedPreferenceIdsSchema.optional()
17237
17396
  });
17238
17397
  var sidebarPinsSchema = external_exports.object({
17398
+ // Shown by default; saved preferences that predate these keys keep them visible.
17399
+ searchChats: external_exports.boolean().default(true),
17400
+ files: external_exports.boolean().default(true),
17239
17401
  usage: external_exports.boolean().default(false),
17240
17402
  billing: external_exports.boolean().default(false),
17241
17403
  friends: external_exports.boolean().default(false),
@@ -17263,8 +17425,10 @@ var providerCacheIsolationModeSchema = external_exports.enum([
17263
17425
  ]);
17264
17426
  var providerCacheScopeSchema = external_exports.enum(["agent_run", "chat", "user"]);
17265
17427
  var providerToolResultImageModeSchema = external_exports.enum(["native", "user_message"]);
17428
+ var providerApiFormatSchema = external_exports.enum(["openai_responses", "openai_chat_completions", "mistral_chat_completions", "anthropic_messages"]);
17266
17429
  var createProviderSchema = external_exports.object({
17267
17430
  name: external_exports.string().trim().min(1).max(120),
17431
+ apiFormat: providerApiFormatSchema.default("openai_responses"),
17268
17432
  baseUrl: external_exports.url().default("https://api.openai.com/v1"),
17269
17433
  apiKey: external_exports.string().min(1),
17270
17434
  organizationId: external_exports.string().trim().optional(),
@@ -17280,6 +17444,7 @@ var createProviderSchema = external_exports.object({
17280
17444
  });
17281
17445
  var updateProviderSchema = external_exports.object({
17282
17446
  name: external_exports.string().trim().min(1).max(120).optional(),
17447
+ apiFormat: providerApiFormatSchema.optional(),
17283
17448
  baseUrl: external_exports.url().optional(),
17284
17449
  apiKey: external_exports.string().min(1).optional(),
17285
17450
  organizationId: external_exports.string().trim().nullable().optional(),
@@ -17646,6 +17811,7 @@ var authSettingsSchema = external_exports.object({
17646
17811
  pendingMessage: external_exports.string().max(2e3).default("Your account is pending approval. An admin will review it shortly."),
17647
17812
  defaultSignupRole: external_exports.enum(["pending", "user"]).default("pending"),
17648
17813
  apiKeysEnabled: external_exports.boolean().default(true),
17814
+ filesEnabled: external_exports.boolean().default(true),
17649
17815
  inviteCodesEnabled: external_exports.boolean().default(false),
17650
17816
  newAccountModelDefaults: newAccountModelDefaultsSchema.default(() => newAccountModelDefaultsSchema.parse({}))
17651
17817
  });
@@ -17738,6 +17904,8 @@ var instanceOcrSettingsSchema = external_exports.object({
17738
17904
  var accountPreferenceIdsSchema = external_exports.array(external_exports.string().trim().min(1).max(200)).max(500).transform((ids) => [...new Set(ids)]);
17739
17905
  var automaticChatExpirationSchema = external_exports.enum(["disabled", "24h", "7d"]);
17740
17906
  var newChatAutoExpireSchema = external_exports.boolean().default(false);
17907
+ var chatSortModeSchema = external_exports.enum(["default", "recent"]);
17908
+ var fileDoubleClickActionSchema = external_exports.enum(["open", "openBeside"]);
17741
17909
  var ANIMATION_SPEED_MIN = 0.01;
17742
17910
  var ANIMATION_SPEED_MAX = 5;
17743
17911
  var DEFAULT_ANIMATION_SPEED = 1;
@@ -17776,6 +17944,8 @@ var managementAccountSettingsSchema = external_exports.object({
17776
17944
  trashRetention: external_exports.enum(["instant", "24h", "7d", "30d", "90d", "indefinite"]).default("30d"),
17777
17945
  automaticChatExpiration: automaticChatExpirationSchema.default("24h"),
17778
17946
  newChatAutoExpire: newChatAutoExpireSchema,
17947
+ chatSortMode: chatSortModeSchema.default("default"),
17948
+ fileDoubleClickAction: fileDoubleClickActionSchema.default("open"),
17779
17949
  defaultModelId: external_exports.string().max(120).nullable().default(null),
17780
17950
  generation: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.string())).default({}),
17781
17951
  favoriteModelIds: accountPreferenceIdsSchema.default([]),
@@ -17937,6 +18107,9 @@ var updateApiKeySchema = external_exports.object({
17937
18107
  }).refine((input) => Object.values(input).some((value) => value !== void 0), {
17938
18108
  message: "Provide at least one API key setting"
17939
18109
  });
18110
+ var FILE_SCOPE_ROOT = "root";
18111
+ var MAX_CHAT_FILE_SCOPES = 20;
18112
+ var fileScopeIdsSchema = external_exports.array(external_exports.union([external_exports.literal(FILE_SCOPE_ROOT), idSchema])).max(MAX_CHAT_FILE_SCOPES).transform((ids) => [...new Set(ids.map((id) => id.toLowerCase()))]);
17940
18113
  var chatSummarySchema = external_exports.object({
17941
18114
  id: idSchema,
17942
18115
  title: external_exports.string(),
@@ -17945,6 +18118,7 @@ var chatSummarySchema = external_exports.object({
17945
18118
  folderId: idSchema.nullable(),
17946
18119
  sortOrder: external_exports.number().int().optional(),
17947
18120
  temporary: external_exports.boolean(),
18121
+ fileScopeIds: external_exports.array(external_exports.string()).default([]),
17948
18122
  expiresAt: isoDateSchema.nullable().optional(),
17949
18123
  updatedAt: isoDateSchema,
17950
18124
  activeResponseId: idSchema.nullable(),
@@ -17959,7 +18133,9 @@ var createChatSchema = external_exports.object({
17959
18133
  modelId: external_exports.string().min(1),
17960
18134
  title: external_exports.string().trim().min(1).max(200).optional(),
17961
18135
  temporary: external_exports.boolean().default(false),
17962
- autoExpire: external_exports.boolean().default(false)
18136
+ autoExpire: external_exports.boolean().default(false),
18137
+ /** Files items the agent may read and edit in this chat. */
18138
+ fileScopeIds: fileScopeIdsSchema.default([])
17963
18139
  });
17964
18140
  var updateChatSchema = external_exports.object({
17965
18141
  title: external_exports.string().trim().min(1).max(200).optional(),
@@ -17967,7 +18143,8 @@ var updateChatSchema = external_exports.object({
17967
18143
  folderId: idSchema.nullable().optional(),
17968
18144
  modelId: external_exports.string().min(1).optional(),
17969
18145
  sortOrder: external_exports.number().int().optional(),
17970
- autoExpire: external_exports.boolean().optional()
18146
+ autoExpire: external_exports.boolean().optional(),
18147
+ fileScopeIds: fileScopeIdsSchema.optional()
17971
18148
  });
17972
18149
  var attachmentIdListSchema = external_exports.array(idSchema).max(MAX_MESSAGE_ATTACHMENTS).refine((ids) => new Set(ids).size === ids.length, { message: "Attachment ids must be unique" });
17973
18150
  var timeZoneSchema = external_exports.string().trim().min(1).max(100).refine((value) => {
@@ -17990,7 +18167,9 @@ var createChatResponseSchema = external_exports.object({
17990
18167
  maxOutputTokens: external_exports.number().int().positive().optional(),
17991
18168
  presetSelections: external_exports.record(external_exports.string(), external_exports.string()).default({}),
17992
18169
  attachmentIds: attachmentIdListSchema.default([]),
17993
- agentMode: external_exports.boolean().default(false)
18170
+ agentMode: external_exports.boolean().default(false),
18171
+ /** Analytics only: whether dictation produced any of the message text. */
18172
+ usedDictation: external_exports.boolean().optional()
17994
18173
  }).refine((value) => value.input.length > 0 || value.attachmentIds.length > 0, {
17995
18174
  message: "Message must include text or attachments",
17996
18175
  path: ["input"]
@@ -18032,7 +18211,9 @@ var createQueuedMessageSchema = external_exports.object({
18032
18211
  modelId: external_exports.string().min(1),
18033
18212
  presetSelections: external_exports.record(external_exports.string(), external_exports.string()).default({}),
18034
18213
  attachmentIds: attachmentIdListSchema.default([]),
18035
- agentMode: external_exports.boolean().default(false)
18214
+ agentMode: external_exports.boolean().default(false),
18215
+ /** Analytics only: whether dictation produced any of the message text. */
18216
+ usedDictation: external_exports.boolean().optional()
18036
18217
  }).refine((value) => value.input.length > 0 || value.attachmentIds.length > 0, {
18037
18218
  message: "Message must include text or attachments",
18038
18219
  path: ["input"]
@@ -18067,7 +18248,7 @@ var syncRequestSchema = external_exports.object({
18067
18248
  activeChatId: idSchema.optional(),
18068
18249
  responseCursors: external_exports.record(idSchema, external_exports.number().int().nonnegative())
18069
18250
  });
18070
- var stateInvalidationScopeSchema = external_exports.enum(["chats", "folders", "models", "usage", "settings", "friends", "pool", "billing", "shelved-drafts"]);
18251
+ var stateInvalidationScopeSchema = external_exports.enum(["chats", "folders", "models", "usage", "settings", "friends", "pool", "billing", "shelved-drafts", "files"]);
18071
18252
  var syncResultSchema = external_exports.object({
18072
18253
  accountRevision: external_exports.number().int().nonnegative(),
18073
18254
  invalidate: external_exports.array(stateInvalidationScopeSchema),
@@ -18075,6 +18256,10 @@ var syncResultSchema = external_exports.object({
18075
18256
  events: external_exports.array(responseEventSchema)
18076
18257
  });
18077
18258
 
18259
+ // ../../packages/client-core/dist/dictation.js
18260
+ var NOISE_FLOOR_DECIBELS = -60;
18261
+ var NOISE_FLOOR_AMPLITUDE = 10 ** (NOISE_FLOOR_DECIBELS / 20);
18262
+
18078
18263
  // ../../node_modules/marked/lib/marked.esm.js
18079
18264
  function _getDefaults() {
18080
18265
  return {
@@ -20846,7 +21031,7 @@ async function runModelTest(input) {
20846
21031
  }
20847
21032
 
20848
21033
  // src/index.ts
20849
- var CLI_VERSION = true ? "0.149.0" : "0.1.0";
21034
+ var CLI_VERSION = true ? "0.151.0" : "0.1.0";
20850
21035
  var CLI_BUNDLED = true;
20851
21036
  var commandIo = /* @__PURE__ */ new WeakMap();
20852
21037
  var commandClientFactory = /* @__PURE__ */ new WeakMap();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isaacthoman/pulpo",
3
- "version": "0.149.0",
3
+ "version": "0.151.0",
4
4
  "description": "Operator-first command-line client for Pulpo",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "scripts": {
29
29
  "build": "tsc -p tsconfig.json --noEmit && node scripts/build.mjs",
30
- "test": "vitest run",
30
+ "test": "vitest run --exclude \"**/dist/**\"",
31
31
  "pack:check": "npm pack --dry-run"
32
32
  },
33
33
  "dependencies": {
@@ -40,7 +40,7 @@
40
40
  "@types/node": "^24.13.2",
41
41
  "esbuild": "^0.25.0",
42
42
  "typescript": "~6.0.2",
43
- "vitest": "^3.2.7",
43
+ "vitest": "^4.1.11",
44
44
  "zod": "^4.0.5"
45
45
  }
46
46
  }