@isaacthoman/pulpo 0.124.3 → 0.126.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 +83 -7
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -14527,6 +14527,40 @@ function date4(params) {
14527
14527
  // ../../node_modules/zod/v4/classic/external.js
14528
14528
  config(en_default());
14529
14529
 
14530
+ // ../../packages/contracts/dist/response-timing.js
14531
+ function record2(value) {
14532
+ return value !== null && typeof value === "object" ? value : void 0;
14533
+ }
14534
+ function hasAssistantReplyText(output) {
14535
+ return Array.isArray(output) && output.some((raw) => {
14536
+ const item = record2(raw);
14537
+ if (item?.type !== "message" || item.role && item.role !== "assistant")
14538
+ return false;
14539
+ if (typeof item.content === "string")
14540
+ return Boolean(item.content.trim());
14541
+ return Array.isArray(item.content) && item.content.some((rawPart) => {
14542
+ const part = record2(rawPart);
14543
+ const text = typeof rawPart === "string" ? rawPart : part?.text ?? part?.content ?? part?.refusal;
14544
+ return typeof text === "string" && Boolean(text.trim());
14545
+ });
14546
+ });
14547
+ }
14548
+ function eventHasAssistantReplyText(type, payload) {
14549
+ const value = record2(payload);
14550
+ if (!value)
14551
+ return false;
14552
+ if (type === "response.output_text.delta" || type === "response.output_text.done" || type === "response.refusal.delta" || type === "response.refusal.done") {
14553
+ const text = value.delta ?? value.text ?? value.refusal;
14554
+ return typeof text === "string" && Boolean(text.trim());
14555
+ }
14556
+ if (type === "response.output_item.added" || type === "response.output_item.done")
14557
+ return hasAssistantReplyText([value.item]);
14558
+ if (type === "response.content_part.added" || type === "response.content_part.done") {
14559
+ return hasAssistantReplyText([{ type: "message", content: [value.part] }]);
14560
+ }
14561
+ return type.startsWith("response.") && hasAssistantReplyText(record2(value.response)?.output);
14562
+ }
14563
+
14530
14564
  // ../../packages/contracts/dist/composer.js
14531
14565
  var composerDraftIdSchema = external_exports.union([external_exports.literal("new"), external_exports.uuid()]);
14532
14566
  var composerAttachmentSchema = external_exports.object({
@@ -16318,6 +16352,31 @@ var CHAT_PRESET_ICON_NAMES = [
16318
16352
  "zoom-out"
16319
16353
  ];
16320
16354
 
16355
+ // ../../packages/contracts/dist/shelf.js
16356
+ var shelfContentSchema = external_exports.object({
16357
+ content: external_exports.string().max(1e6),
16358
+ attachmentIds: external_exports.array(external_exports.uuid()).max(100)
16359
+ });
16360
+ var shelvedDraftSchema = external_exports.object({
16361
+ id: external_exports.uuid(),
16362
+ content: external_exports.string(),
16363
+ attachments: external_exports.array(composerAttachmentSchema),
16364
+ position: external_exports.number().int(),
16365
+ revision: external_exports.number().int().nonnegative(),
16366
+ createdAt: external_exports.string(),
16367
+ updatedAt: external_exports.string()
16368
+ });
16369
+ var savedDraft = shelfContentSchema.extend({ id: external_exports.uuid() });
16370
+ var shelfMutationSchema = external_exports.object({
16371
+ operationId: external_exports.uuid(),
16372
+ action: external_exports.discriminatedUnion("type", [
16373
+ external_exports.object({ type: external_exports.literal("save"), draft: savedDraft }),
16374
+ external_exports.object({ type: external_exports.literal("restore"), id: external_exports.uuid(), replacement: savedDraft.optional() }),
16375
+ external_exports.object({ type: external_exports.literal("delete"), id: external_exports.uuid() }),
16376
+ external_exports.object({ type: external_exports.literal("reorder"), id: external_exports.uuid(), targetId: external_exports.uuid(), edge: external_exports.enum(["before", "after"]) })
16377
+ ])
16378
+ });
16379
+
16321
16380
  // ../../packages/contracts/dist/index.js
16322
16381
  var idSchema = external_exports.uuid();
16323
16382
  var isoDateSchema = external_exports.iso.datetime();
@@ -16619,6 +16678,8 @@ var responseUsageSchema = external_exports.object({
16619
16678
  totalTokens: external_exports.number().int().nonnegative()
16620
16679
  });
16621
16680
  var storedResponseSchema = external_exports.object({
16681
+ requestReceivedAt: isoDateSchema.nullable().optional(),
16682
+ firstReplyTextAt: isoDateSchema.nullable().optional(),
16622
16683
  id: idSchema,
16623
16684
  chatId: idSchema,
16624
16685
  userId: idSchema,
@@ -16635,6 +16696,8 @@ var storedResponseSchema = external_exports.object({
16635
16696
  completedAt: isoDateSchema.nullable()
16636
16697
  });
16637
16698
  var responseEventSchema = external_exports.object({
16699
+ requestReceivedAt: isoDateSchema.nullable().optional(),
16700
+ firstReplyTextAt: isoDateSchema.nullable().optional(),
16638
16701
  responseId: idSchema,
16639
16702
  sequence: external_exports.number().int().positive(),
16640
16703
  type: external_exports.string().min(1),
@@ -16677,6 +16740,8 @@ var recallItemSchema = external_exports.object({
16677
16740
  sources: external_exports.array(recallSourceSchema).max(5)
16678
16741
  });
16679
16742
  var responseSnapshotSchema = external_exports.object({
16743
+ requestReceivedAt: isoDateSchema.nullable().optional(),
16744
+ firstReplyTextAt: isoDateSchema.nullable().optional(),
16680
16745
  responseId: idSchema,
16681
16746
  status: responseStatusSchema,
16682
16747
  sequence: external_exports.number().int().nonnegative(),
@@ -16826,12 +16891,22 @@ function applyResponseEventToSnapshot(snapshot, event) {
16826
16891
  status: snapshot.status === "queued" ? "in_progress" : snapshot.status,
16827
16892
  sequence: event.sequence,
16828
16893
  output,
16894
+ requestReceivedAt: snapshot.requestReceivedAt ?? event.requestReceivedAt,
16895
+ firstReplyTextAt: snapshot.firstReplyTextAt ?? event.firstReplyTextAt ?? (eventHasAssistantReplyText(event.type, event.payload) ? event.emittedAt : void 0),
16829
16896
  updatedAt: event.emittedAt
16830
16897
  };
16831
16898
  }
16832
16899
  function mergeResponseSnapshots(current, incoming) {
16833
16900
  if (incoming.sequence < current.sequence)
16834
16901
  return current;
16902
+ const requestReceivedAt = current.requestReceivedAt ?? incoming.requestReceivedAt;
16903
+ const firstReplyTextAt = current.firstReplyTextAt ?? incoming.firstReplyTextAt;
16904
+ if (current.requestReceivedAt !== requestReceivedAt || current.firstReplyTextAt !== firstReplyTextAt) {
16905
+ current = { ...current, requestReceivedAt, firstReplyTextAt };
16906
+ }
16907
+ if (incoming.requestReceivedAt !== requestReceivedAt || incoming.firstReplyTextAt !== firstReplyTextAt) {
16908
+ incoming = { ...incoming, requestReceivedAt, firstReplyTextAt };
16909
+ }
16835
16910
  if (incoming.sequence === current.sequence) {
16836
16911
  const currentTerminal = current.status !== "queued" && current.status !== "in_progress";
16837
16912
  const incomingTerminal = incoming.status !== "queued" && incoming.status !== "in_progress";
@@ -17387,6 +17462,7 @@ var managementAccountSettingsSchema = external_exports.object({
17387
17462
  composerSyncEnabled: external_exports.boolean().default(true),
17388
17463
  sendWithEnter: external_exports.boolean().default(true),
17389
17464
  streamResponses: external_exports.boolean().default(true),
17465
+ showPromptSuggestions: external_exports.boolean().default(true),
17390
17466
  showReasoning: external_exports.boolean().default(true),
17391
17467
  showResponseCost: external_exports.boolean().default(false),
17392
17468
  chatWidth: external_exports.enum(["full", "narrow"]).default("narrow"),
@@ -17678,7 +17754,7 @@ var syncRequestSchema = external_exports.object({
17678
17754
  activeChatId: idSchema.optional(),
17679
17755
  responseCursors: external_exports.record(idSchema, external_exports.number().int().nonnegative())
17680
17756
  });
17681
- var stateInvalidationScopeSchema = external_exports.enum(["chats", "folders", "models", "usage", "settings", "friends", "pool", "billing"]);
17757
+ var stateInvalidationScopeSchema = external_exports.enum(["chats", "folders", "models", "usage", "settings", "friends", "pool", "billing", "shelved-drafts"]);
17682
17758
  var syncResultSchema = external_exports.object({
17683
17759
  accountRevision: external_exports.number().int().nonnegative(),
17684
17760
  invalidate: external_exports.array(stateInvalidationScopeSchema),
@@ -18315,7 +18391,7 @@ async function runModelTest(input) {
18315
18391
  }
18316
18392
 
18317
18393
  // src/index.ts
18318
- var CLI_VERSION = true ? "0.124.3" : "0.1.0";
18394
+ var CLI_VERSION = true ? "0.126.0" : "0.1.0";
18319
18395
  var CLI_BUNDLED = true;
18320
18396
  var commandIo = /* @__PURE__ */ new WeakMap();
18321
18397
  var commandClientFactory = /* @__PURE__ */ new WeakMap();
@@ -18384,13 +18460,13 @@ var SECRET_INPUT_KEYS = /* @__PURE__ */ new Set(["apiKey", "password", "secret",
18384
18460
  function resolveEnvironmentReferences(value, path = "") {
18385
18461
  if (Array.isArray(value)) return value.map((item, index) => resolveEnvironmentReferences(item, `${path}[${index}]`));
18386
18462
  if (!value || typeof value !== "object") return value;
18387
- const record2 = value;
18388
- if (Object.keys(record2).length === 1 && typeof record2.fromEnv === "string") {
18389
- const secret = process.env[record2.fromEnv];
18390
- if (secret === void 0) throw new Error(`Environment variable ${record2.fromEnv} is not set`);
18463
+ const record3 = value;
18464
+ if (Object.keys(record3).length === 1 && typeof record3.fromEnv === "string") {
18465
+ const secret = process.env[record3.fromEnv];
18466
+ if (secret === void 0) throw new Error(`Environment variable ${record3.fromEnv} is not set`);
18391
18467
  return secret;
18392
18468
  }
18393
- return Object.fromEntries(Object.entries(record2).map(([key, item]) => {
18469
+ return Object.fromEntries(Object.entries(record3).map(([key, item]) => {
18394
18470
  const itemPath = path ? `${path}.${key}` : key;
18395
18471
  if (SECRET_INPUT_KEYS.has(key) && typeof item === "string") {
18396
18472
  throw new Error(`${itemPath} must use { "fromEnv": "NAME" } instead of a plaintext JSON secret`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isaacthoman/pulpo",
3
- "version": "0.124.3",
3
+ "version": "0.126.0",
4
4
  "description": "Operator-first command-line client for Pulpo",
5
5
  "type": "module",
6
6
  "bin": {