@curviate/cli 0.15.0 → 0.15.2

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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,83 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
6
  Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html):
7
7
  a new command or flag is a minor; a breaking command/flag/exit-code change is a major; a fix is a patch.
8
8
 
9
+ ## [0.15.2] - 2026-07-12
10
+
11
+ A patch release fixing an interactive-terminal hang on `account link`.
12
+
13
+ ### Fixed
14
+
15
+ - **`account link --password-stdin` / `--li-at-stdin` no longer hang on an
16
+ interactive terminal.** These flags previously read stdin to EOF, which a
17
+ human paste + Enter never produces on a TTY — the command hung
18
+ indefinitely and the pasted secret echoed on-screen. The read is now
19
+ mode-aware: piped/redirected stdin (non-TTY) is unchanged (read to EOF,
20
+ trimmed); an interactive TTY now prints a single cue line, then reads one
21
+ no-echo line — paste + Enter resolves immediately, including a paste whose
22
+ clipboard content ends in a trailing newline. An empty line still falls
23
+ through to the normal resolution order (env var, then the password
24
+ prompt / `li_at` fail-fast).
25
+ - **`--preview` never blocks on a terminal read.** Under `--preview`, the
26
+ interactive stdin read is suppressed entirely, matching every other
27
+ preview-mode command.
28
+
29
+ ## [0.15.1] - 2026-07-11
30
+
31
+ A patch release of agent-experience (AX) and developer-experience (DX)
32
+ improvements: clearer errors and help, a modest default pacing on `--all`
33
+ streams, one back-compatible reaction-signature unification, and a
34
+ `profile endorse` fix. No breaking changes.
35
+
36
+ ### Added
37
+
38
+ - **Successor hints for removed/renamed commands.** Reaching for a command that
39
+ moved or was removed in 0.15.0 — `post list`, `post comment`/`comments`,
40
+ `connect respond`, `profile connections`, `account connect-link`/`reconnect-link`/`reconnect`,
41
+ `inbox sync`/`sync-chat`, `recruiter add-candidate`/`project-jobs`/`sync`,
42
+ `sales-nav sync`, `webhook state-diff`, `company followers` — now prints a
43
+ one-line "did you mean" pointer to the replacement instead of a bare
44
+ "unknown command". The exit code is unchanged (2).
45
+ - **`--all` NDJSON-mode notice.** When `--all` streaming engages, a one-line
46
+ notice on stderr makes the format switch explicit (`--all` streams NDJSON —
47
+ one object per line — not the `{items, cursor}` envelope), so an agent
48
+ pattern-matching the plain-mode shape does not mis-parse the stream.
49
+ - **`--page-delay <ms>` and default `--all` pacing.** `--all` now pauses a
50
+ modest default between page fetches, keeping a long stream under the platform
51
+ rate gate. `--page-delay <ms>` overrides it (pass `0` to disable).
52
+ - **`job list --state ALL`.** A best-effort client-side union across every state
53
+ (DRAFT/OPEN/CLOSED/REVIEW/SUSPENDED): each state is queried, re-filtered
54
+ against its own state, then merged and de-duplicated by id. There is no
55
+ unified cursor — each state is walked independently and `--max-pages` applies
56
+ per state.
57
+ - **`--fields` unknown-field warning.** Projecting a field that matches nothing
58
+ on the response now emits one stderr warning naming the unmatched fields and
59
+ listing the available keys, instead of silently returning `{}`. The output is
60
+ unchanged — the known fields still project.
61
+
62
+ ### Changed
63
+
64
+ - **Reaction commands unified on the positional form.** `post react <post_id>
65
+ <reaction>` and `message react <chat_id> <message_id> <emoji>` now take the
66
+ reaction/emoji as a positional argument, matching `comment react`/`unreact`
67
+ and `post unreact`. The previous `--reaction` and `--emoji` flags still work as
68
+ deprecated aliases (no breaking removal). A missing value is now a usage error
69
+ (exit 2) rather than a silent empty reaction.
70
+ - **Constraint discoverability in help.** `job create`/`job update` help now
71
+ states the 200-character minimum on `--description` explicitly, and
72
+ `job publish --budget-amount` notes it must be non-negative.
73
+ - **List-lag notes.** `post user-posts`, `comment list`, `inbox messages`, and
74
+ `connect sent`/`received` help now note that a very recent create/delete may
75
+ take a few minutes to appear or clear (LinkedIn-side indexing), and that a
76
+ direct `get` reflects a change immediately.
77
+
78
+ ### Fixed
79
+
80
+ - **`profile endorse <slug|url>`** now resolves the handle to the member's
81
+ provider id before endorsing (via a contact-safe profile read), matching
82
+ `profile follow`/`unfollow`. Previously a slug or URL 404'd because the
83
+ endorse endpoint accepts only the provider id; the provider-id form was
84
+ unaffected.
85
+
9
86
  ## [0.15.0] - 2026-07-11
10
87
 
11
88
  Full v2 API-surface parity — the coupled release with `@curviate/sdk` 0.15.0. A large
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-U7Y4EXHT.js";
5
5
  import {
6
6
  readlineSync
7
- } from "./chunk-MKXA2LAR.js";
7
+ } from "./chunk-H4KV7MIN.js";
8
8
  import {
9
9
  AUTH_NEEDED
10
10
  } from "./chunk-ZE7QGR3F.js";
@@ -17,35 +17,53 @@ import {
17
17
  slimAccountListItem
18
18
  } from "./chunk-45KHSWCV.js";
19
19
  import {
20
+ pageDelayFromFlags,
20
21
  streamAll
21
- } from "./chunk-DNTRQZBT.js";
22
+ } from "./chunk-EEMJDJ4W.js";
22
23
  import {
23
24
  createClient,
24
25
  renderError,
25
26
  renderSuccess,
26
27
  renderUnexpectedError,
27
28
  resolveEffectiveConfig
28
- } from "./chunk-JXF47TRY.js";
29
+ } from "./chunk-M33MI53G.js";
29
30
  import {
30
31
  GLOBAL_FLAGS,
31
32
  READ_SINGLE_FLAGS,
32
33
  WRITE_SINGLE_FLAGS
33
- } from "./chunk-4JHGVY7R.js";
34
+ } from "./chunk-TMU3CSPR.js";
34
35
 
35
36
  // src/commands/account.ts
36
37
  import { defineCommand } from "citty";
37
38
 
38
39
  // src/lib/credential-resolve.ts
40
+ var STDIN_TTY_CUE = "Reading secret from stdin (paste + Enter): ";
41
+ function defaultReadSingleLine() {
42
+ return readlineSync("", { mask: true });
43
+ }
39
44
  async function resolveSecret(params) {
40
45
  if (params.flagValue !== void 0 && params.flagValue !== "") {
41
46
  return params.flagValue;
42
47
  }
43
48
  if (params.stdinRequested) {
44
- const reader = params.readStdin ?? defaultReadStdin;
45
- const raw = await reader();
46
- const trimmed = raw.trim();
47
- if (trimmed !== "") {
48
- return trimmed;
49
+ if (params.isTTY) {
50
+ const stdinReadAllowed = params.allowInteractiveStdinRead ?? params.allowInteractive;
51
+ if (stdinReadAllowed !== false) {
52
+ params.out.stderr.write(STDIN_TTY_CUE);
53
+ const reader = params.readSingleLine ?? defaultReadSingleLine;
54
+ const raw = await reader(STDIN_TTY_CUE);
55
+ const trimmed = raw.trim();
56
+ if (trimmed !== "") {
57
+ return trimmed;
58
+ }
59
+ }
60
+ } else {
61
+ const reader = params.readStdin ?? defaultReadStdin;
62
+ const raw = await reader();
63
+ const trimmed = raw.trim();
64
+ if (trimmed !== "") {
65
+ return trimmed;
66
+ }
49
67
  }
50
68
  }
51
69
  const envValue = process.env[params.envVar];
@@ -225,7 +243,8 @@ async function runAccountList(client, flags, out) {
225
243
  const fn = (p) => client.accounts.list(p);
226
244
  for await (const item of streamAll(fn, params, {
227
245
  maxPages,
228
- out
246
+ out,
247
+ pageDelayMs: pageDelayFromFlags(flags)
229
248
  })) {
230
249
  const projected = outOpts.verbose ? item : slimAccountListItem(item);
231
250
  out.stdout.write(JSON.stringify(projected) + "\n");
@@ -260,12 +279,20 @@ async function buildAuthBody(flags, ctx) {
260
279
  flagValue: flags.password,
261
280
  stdinRequested: flags["password-stdin"],
262
281
  envVar: "CURVIATE_LINKEDIN_PASSWORD",
282
+ isTTY: ctx.isTTY,
263
283
  readStdin: ctx.readStdin,
284
+ readSingleLine: ctx.readSingleLine,
264
285
  required: true,
265
- // The interactive prompt/fail-fast only engages once --email is present
266
- // (nothing meaningful to prompt toward yet otherwise) — and never
267
- // under --preview (a client-side render must not prompt or exit).
286
+ // The masked-prompt/fail-fast tiers (3/4) only engage once --email is
287
+ // present (nothing meaningful to prompt toward yet otherwise) — and
288
+ // never under --preview (a client-side render must not prompt or
289
+ // exit).
268
290
  allowInteractive: !ctx.previewMode && Boolean(flags.email),
291
+ // Tier-1b's own gate is preview-only, deliberately NOT email-gated: a
292
+ // user who passed --password-stdin on a TTY gets the read regardless
293
+ // of --email — an email-less body still fails downstream validation,
294
+ // as expected, rather than the flag being silently ignored.
295
+ allowInteractiveStdinRead: !ctx.previewMode,
269
296
  failMessage: "no password \u2014 pass --password, --password-stdin, or set CURVIATE_LINKEDIN_PASSWORD",
270
297
  prompt: { isTTY: ctx.isTTY, readline: ctx.readline, promptText: "LinkedIn password: " },
271
298
  out: ctx.out
@@ -282,7 +309,9 @@ async function buildAuthBody(flags, ctx) {
282
309
  flagValue: flags["li-at"],
283
310
  stdinRequested: flags["li-at-stdin"],
284
311
  envVar: "CURVIATE_LINKEDIN_LI_AT",
312
+ isTTY: ctx.isTTY,
285
313
  readStdin: ctx.readStdin,
314
+ readSingleLine: ctx.readSingleLine,
286
315
  required: true,
287
316
  allowInteractive: !ctx.previewMode,
288
317
  failMessage: "no li_at \u2014 pass --li-at, --li-at-stdin, or set CURVIATE_LINKEDIN_LI_AT",
@@ -328,6 +357,13 @@ function resolveCredentialIO(io) {
328
357
  isOutputTTY: io.isOutputTTY ?? (process.stdout.isTTY ?? false),
329
358
  readline: io.readline ?? readlineSync,
330
359
  readStdin: io.readStdin ?? defaultReadStdin,
360
+ // Always the masked, no-echo raw-mode branch — never a bare readlineSync
361
+ // pass-through, which would default mask to false and echo the secret.
362
+ // Prompt is deliberately EMPTY, not `cue`: credential-resolve.ts already
363
+ // wrote STDIN_TTY_CUE to out.stderr before calling this reader, and
364
+ // readlineSync itself writes its `prompt` argument to stderr too — the
365
+ // cue text would otherwise print twice on a real terminal.
366
+ readSingleLine: io.readSingleLine ?? (() => readlineSync("", { mask: true })),
331
367
  sleep: io.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms))),
332
368
  now: io.now ?? (() => Date.now()),
333
369
  open: io.open ?? defaultOpen
@@ -462,6 +498,7 @@ async function runAccountLink(client, flags, out, io = {}) {
462
498
  isTTY: resolvedIo.isTTY,
463
499
  readline: resolvedIo.readline,
464
500
  readStdin: resolvedIo.readStdin,
501
+ readSingleLine: resolvedIo.readSingleLine,
465
502
  previewMode: flags.preview ?? false
466
503
  });
467
504
  const body = {
@@ -12,11 +12,27 @@ function truncationProseNote(pagesFetched) {
12
12
  return `Streaming truncated at ${pagesFetched} page(s). Use --all --max-pages or --cursor for manual paging.
13
13
  `;
14
14
  }
15
+ function ndjsonModeNotice() {
16
+ return "--all streams NDJSON: one object per line; the {items,cursor} envelope is not used\n";
17
+ }
18
+ var DEFAULT_PAGE_DELAY_MS = 400;
19
+ function pageDelayFrom(raw) {
20
+ if (raw === void 0 || raw === "") return void 0;
21
+ const n = Number(raw);
22
+ if (!Number.isInteger(n) || n < 0) return void 0;
23
+ return n;
24
+ }
25
+ function pageDelayFromFlags(flags) {
26
+ return pageDelayFrom(flags["page-delay"]);
27
+ }
28
+ var realSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
15
29
  function truncationSentinelLine(pagesFetched, hasMore) {
16
30
  return JSON.stringify({ object: "stream_truncated", pages_fetched: pagesFetched, has_more: hasMore }) + "\n";
17
31
  }
18
32
  async function* streamAll(fn, params, opts = {}) {
19
33
  const maxPages = opts.maxPages ?? 100;
34
+ const pageDelayMs = opts.pageDelayMs ?? DEFAULT_PAGE_DELAY_MS;
35
+ const sleep = opts.sleep ?? realSleep;
20
36
  let cursor = void 0;
21
37
  let pageCount = 0;
22
38
  let firstPage = true;
@@ -30,7 +46,10 @@ async function* streamAll(fn, params, opts = {}) {
30
46
  "--all requires a paginated method (response must have `items` or `data` array). Remove --all for non-list commands."
31
47
  );
32
48
  }
33
- firstPage = false;
49
+ if (firstPage) {
50
+ if (opts.out) opts.out.stderr.write(ndjsonModeNotice());
51
+ firstPage = false;
52
+ }
34
53
  if (Array.isArray(items)) {
35
54
  for (const item of items) {
36
55
  yield item;
@@ -49,9 +68,13 @@ async function* streamAll(fn, params, opts = {}) {
49
68
  }
50
69
  break;
51
70
  }
71
+ if (pageDelayMs > 0) await sleep(pageDelayMs);
52
72
  }
53
73
  }
54
74
 
55
75
  export {
76
+ ndjsonModeNotice,
77
+ DEFAULT_PAGE_DELAY_MS,
78
+ pageDelayFromFlags,
56
79
  streamAll
57
80
  };
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/lib/readline.ts
4
+ import { createInterface } from "readline";
5
+ async function readlineSync(prompt, opts = {}) {
6
+ const stdin = opts.stdin ?? process.stdin;
7
+ return new Promise((resolve, reject) => {
8
+ process.stderr.write(prompt);
9
+ if (opts.mask && typeof stdin.setRawMode === "function") {
10
+ stdin.setRawMode(true);
11
+ stdin.resume();
12
+ stdin.setEncoding("utf8");
13
+ let input = "";
14
+ const onData = (chunk) => {
15
+ for (let i = 0; i < chunk.length; i++) {
16
+ const char = chunk[i];
17
+ if (char === "\r" || char === "\n") {
18
+ stdin.setRawMode?.(false);
19
+ stdin.pause();
20
+ stdin.removeListener("data", onData);
21
+ process.stderr.write("\n");
22
+ resolve(input);
23
+ return;
24
+ } else if (char === "") {
25
+ stdin.setRawMode?.(false);
26
+ stdin.pause();
27
+ stdin.removeListener("data", onData);
28
+ reject(new Error("Interrupted."));
29
+ return;
30
+ } else if (char === "\x7F" || char === "\b") {
31
+ input = input.slice(0, -1);
32
+ } else {
33
+ input += char;
34
+ }
35
+ }
36
+ };
37
+ stdin.on("data", onData);
38
+ } else {
39
+ const rl = createInterface({
40
+ input: stdin,
41
+ output: void 0,
42
+ // suppress default echo (prompt already on stderr)
43
+ terminal: false
44
+ });
45
+ rl.once("line", (line) => {
46
+ rl.close();
47
+ resolve(line.trim());
48
+ });
49
+ rl.once("error", reject);
50
+ rl.once("close", () => resolve(""));
51
+ }
52
+ });
53
+ }
54
+
55
+ export {
56
+ readlineSync
57
+ };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  readConfig
4
- } from "./chunk-4JHGVY7R.js";
4
+ } from "./chunk-TMU3CSPR.js";
5
5
 
6
6
  // src/lib/resolve.ts
7
7
  var DEFAULT_BASE_URL = "https://api.curviate.com";
@@ -73,10 +73,42 @@ function applyProjection(data, fields) {
73
73
  }
74
74
  return data;
75
75
  }
76
+ function firstProjectableItem(data) {
77
+ const isPlainObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
78
+ if (Array.isArray(data)) {
79
+ return data.length > 0 && isPlainObject(data[0]) ? data[0] : null;
80
+ }
81
+ if (isPlainObject(data)) {
82
+ const items = data["items"];
83
+ if (Array.isArray(items)) {
84
+ return items.length > 0 && isPlainObject(items[0]) ? items[0] : null;
85
+ }
86
+ return data;
87
+ }
88
+ return null;
89
+ }
90
+ function detectUnknownFields(data, fields) {
91
+ if (fields.length === 0) return null;
92
+ const first = firstProjectableItem(data);
93
+ if (first === null) return null;
94
+ const available = Object.keys(first);
95
+ const unknown = fields.filter((f) => {
96
+ const topKey = f.split(".")[0];
97
+ return !Object.prototype.hasOwnProperty.call(first, topKey);
98
+ });
99
+ return unknown.length > 0 ? { unknown, available } : null;
100
+ }
76
101
  function renderSuccess(data, opts, out) {
77
102
  const json = isJsonMode(opts);
78
103
  const fields = opts.fields ? opts.fields.split(",").map((f) => f.trim()).filter(Boolean) : [];
79
104
  const slimmed = !opts.verbose && opts.slim ? opts.slim(data) : data;
105
+ const unknownFields = detectUnknownFields(slimmed, fields);
106
+ if (unknownFields) {
107
+ out.stderr.write(
108
+ `warning: --fields not present on the response: ${unknownFields.unknown.join(", ")}. Available keys: ${unknownFields.available.join(", ")}.
109
+ `
110
+ );
111
+ }
80
112
  const projected = applyProjection(slimmed, fields);
81
113
  if (json) {
82
114
  out.stdout.write(JSON.stringify(projected) + "\n");
@@ -176,6 +176,10 @@ var GLOBAL_FLAGS = {
176
176
  type: "string",
177
177
  description: "Maximum number of pages to fetch when --all is used."
178
178
  },
179
+ "page-delay": {
180
+ type: "string",
181
+ description: "Milliseconds to pause between pages when --all is used (default 400; pass 0 to disable). A modest delay keeps a long stream under the platform rate gate."
182
+ },
179
183
  preview: {
180
184
  type: "boolean",
181
185
  description: "Render the request that would be sent without calling the API.",
package/dist/cli.js CHANGED
@@ -9,6 +9,47 @@ import { createRequire } from "module";
9
9
 
10
10
  // src/dispatch.ts
11
11
  import { runCommand } from "citty";
12
+ var REMOVED_COMMANDS = {
13
+ post: {
14
+ list: "`post list` was removed \u2014 use `post user-posts <user_id>` (accepts `me`).",
15
+ comment: "post comments are their own group now \u2014 use `comment add <post_id> <text>`.",
16
+ comments: "post comments are their own group now \u2014 use `comment list <post_id>`."
17
+ },
18
+ connect: {
19
+ respond: "`connect respond` was split \u2014 use `connect accept <id>` or `connect decline <id>`."
20
+ },
21
+ profile: {
22
+ connections: "`profile connections` was renamed \u2014 use `profile relations`."
23
+ },
24
+ account: {
25
+ "connect-link": "`account connect-link` was removed \u2014 use `account link [--account-id <id>]`.",
26
+ "reconnect-link": "`account reconnect-link` was removed \u2014 use `account link [--account-id <id>]`.",
27
+ reconnect: "`account reconnect` was removed \u2014 use `account link [--account-id <id>]`."
28
+ },
29
+ inbox: {
30
+ sync: "`inbox sync` was removed \u2014 history syncs automatically; just read `inbox messages <chat_id>`.",
31
+ "sync-chat": "`inbox sync-chat` was removed \u2014 history syncs automatically; just read `inbox messages <chat_id>`."
32
+ },
33
+ recruiter: {
34
+ "add-candidate": "`recruiter add-candidate` was renamed \u2014 use `recruiter save-candidate <project_id> --stage-id <id> --candidate-id <id>`.",
35
+ "project-jobs": "`recruiter project-jobs` was renamed \u2014 use `recruiter project-job get <project_id>`.",
36
+ sync: "`recruiter sync` was removed \u2014 Recruiter data syncs automatically now.",
37
+ "add-applicant": "`recruiter add-applicant` was removed with no replacement.",
38
+ "reject-applicant": "`recruiter reject-applicant` was removed with no replacement."
39
+ },
40
+ "sales-nav": {
41
+ sync: "`sales-nav sync` was removed \u2014 Sales Navigator data syncs automatically now."
42
+ },
43
+ webhook: {
44
+ "state-diff": "`webhook state-diff` was removed with no replacement."
45
+ },
46
+ company: {
47
+ followers: "`company followers` was removed with no replacement."
48
+ }
49
+ };
50
+ function successorHint(group, token) {
51
+ return REMOVED_COMMANDS[group]?.[token] ?? null;
52
+ }
12
53
  async function resolveValue(input) {
13
54
  return typeof input === "function" ? input() : input;
14
55
  }
@@ -108,8 +149,10 @@ function hasEmptyFields(rawArgs) {
108
149
  }
109
150
  return false;
110
151
  }
111
- function usageError(message) {
152
+ function usageError(message, hint) {
112
153
  process.stderr.write(`error: ${message}
154
+ `);
155
+ if (hint) process.stderr.write(`hint: ${hint}
113
156
  `);
114
157
  process.stderr.write("Run `curviate --help` for usage.\n");
115
158
  process.exit(2);
@@ -124,6 +167,12 @@ async function resolveLeaf(cmd, rawArgs) {
124
167
  const sub = await resolveValue(subCommands[token]);
125
168
  return resolveLeaf(sub, rawArgs.slice(idx + 1));
126
169
  }
170
+ if (token !== void 0) {
171
+ const hint = successorHint(await nodeName(cmd), token);
172
+ if (hint) {
173
+ usageError(`unknown command \`${token}\``, hint);
174
+ }
175
+ }
127
176
  if (token !== void 0 && hasBarePositional) {
128
177
  const booleanFlags = await booleanFlagNames(cmd);
129
178
  const positionals = positionalTokens(rawArgs, booleanFlags);
@@ -201,24 +250,24 @@ var main = defineCommand({
201
250
  // Subcommand registry — names and descriptions are static for help rendering;
202
251
  // the handler implementation is loaded lazily on first invocation.
203
252
  subCommands: {
204
- login: () => import("./login-BBVQLXM7.js").then((m) => m.loginCommand),
205
- config: () => import("./config-Q2AEWSEC.js").then((m) => m.configCommand),
253
+ login: () => import("./login-GDLWR542.js").then((m) => m.loginCommand),
254
+ config: () => import("./config-P5CPF5WC.js").then((m) => m.configCommand),
206
255
  // ---------------------------------------------------------------------------
207
256
  // Noun groups — lazy-loaded on first invocation.
208
257
  // ---------------------------------------------------------------------------
209
- profile: () => import("./profile-I6YMVXSS.js").then((m) => m.profileCommand),
210
- company: () => import("./company-LGID3SK3.js").then((m) => m.companyCommand),
211
- job: () => import("./job-TFTTCP5B.js").then((m) => m.jobCommand),
212
- connect: () => import("./connect-A7HEKKEE.js").then((m) => m.connectCommand),
213
- search: () => import("./search-6C72M563.js").then((m) => m.searchCommand),
214
- inbox: () => import("./inbox-44JRTJAP.js").then((m) => m.inboxCommand),
215
- message: () => import("./message-FOJTDPW3.js").then((m) => m.messageCommand),
216
- post: () => import("./post-FC6NZXM5.js").then((m) => m.postCommand),
217
- comment: () => import("./comment-Y5IU42CR.js").then((m) => m.commentCommand),
218
- account: () => import("./account-VB52GIUA.js").then((m) => m.accountCommand),
219
- webhook: () => import("./webhook-NSXEIU44.js").then((m) => m.webhookCommand),
220
- "sales-nav": () => import("./sales-nav-6IYKQ4TC.js").then((m) => m.salesNavCommand),
221
- recruiter: () => import("./recruiter-BHT5OJD7.js").then((m) => m.recruiterCommand)
258
+ profile: () => import("./profile-57RJEL7H.js").then((m) => m.profileCommand),
259
+ company: () => import("./company-IYTMW64G.js").then((m) => m.companyCommand),
260
+ job: () => import("./job-YARGTHUY.js").then((m) => m.jobCommand),
261
+ connect: () => import("./connect-TTJHMBUP.js").then((m) => m.connectCommand),
262
+ search: () => import("./search-RD4TXNV7.js").then((m) => m.searchCommand),
263
+ inbox: () => import("./inbox-EOOGJ3ZN.js").then((m) => m.inboxCommand),
264
+ message: () => import("./message-2DLIQIE6.js").then((m) => m.messageCommand),
265
+ post: () => import("./post-GRIJ7X52.js").then((m) => m.postCommand),
266
+ comment: () => import("./comment-NCDXERSI.js").then((m) => m.commentCommand),
267
+ account: () => import("./account-PD3QLOTG.js").then((m) => m.accountCommand),
268
+ webhook: () => import("./webhook-CEP7SGP5.js").then((m) => m.webhookCommand),
269
+ "sales-nav": () => import("./sales-nav-NUMEYOEO.js").then((m) => m.salesNavCommand),
270
+ recruiter: () => import("./recruiter-CTYH7AYG.js").then((m) => m.recruiterCommand)
222
271
  },
223
272
  async run() {
224
273
  const { runMain } = await import("citty");
@@ -16,19 +16,20 @@ import {
16
16
  } from "./chunk-R3VLWLVV.js";
17
17
  import "./chunk-DMQZEPQE.js";
18
18
  import {
19
+ pageDelayFromFlags,
19
20
  streamAll
20
- } from "./chunk-DNTRQZBT.js";
21
+ } from "./chunk-EEMJDJ4W.js";
21
22
  import {
22
23
  createClient,
23
24
  renderError,
24
25
  renderSuccess,
25
26
  renderUnexpectedError,
26
27
  resolveEffectiveConfig
27
- } from "./chunk-JXF47TRY.js";
28
+ } from "./chunk-M33MI53G.js";
28
29
  import {
29
30
  GLOBAL_FLAGS,
30
31
  WRITE_SINGLE_FLAGS
31
- } from "./chunk-4JHGVY7R.js";
32
+ } from "./chunk-TMU3CSPR.js";
32
33
 
33
34
  // src/commands/comment.ts
34
35
  import { defineCommand } from "citty";
@@ -103,7 +104,8 @@ async function runCommentList(client, flags, out) {
103
104
  const fn = (p) => ns.posts.listComments(postId, p);
104
105
  for await (const item of streamAll(fn, params, {
105
106
  maxPages,
106
- out
107
+ out,
108
+ pageDelayMs: pageDelayFromFlags(flags)
107
109
  })) {
108
110
  out.stdout.write(JSON.stringify(item) + "\n");
109
111
  }
@@ -130,7 +132,8 @@ async function runCommentReplies(client, flags, out) {
130
132
  const fn = (p) => ns.comments.listReplies(postId, commentId, p);
131
133
  for await (const item of streamAll(fn, params, {
132
134
  maxPages,
133
- out
135
+ out,
136
+ pageDelayMs: pageDelayFromFlags(flags)
134
137
  })) {
135
138
  out.stdout.write(JSON.stringify(item) + "\n");
136
139
  }
@@ -157,7 +160,8 @@ async function runCommentReactions(client, flags, out) {
157
160
  const fn = (p) => ns.comments.listReactions(postId, commentId, p);
158
161
  for await (const item of streamAll(fn, params, {
159
162
  maxPages,
160
- out
163
+ out,
164
+ pageDelayMs: pageDelayFromFlags(flags)
161
165
  })) {
162
166
  out.stdout.write(JSON.stringify(item) + "\n");
163
167
  }
@@ -189,7 +193,8 @@ async function runCommentUser(client, flags, out) {
189
193
  const fn = (p) => ns.comments.listUserComments(userId, p);
190
194
  for await (const item of streamAll(fn, params, {
191
195
  maxPages,
192
- out
196
+ out,
197
+ pageDelayMs: pageDelayFromFlags(flags)
193
198
  })) {
194
199
  out.stdout.write(JSON.stringify(item) + "\n");
195
200
  }
@@ -401,7 +406,7 @@ async function withClient(flags, fn) {
401
406
  await fn(client, { ...flags, account: flags.account ?? cfg.account }, out);
402
407
  }
403
408
  var commentListCommand = defineCommand({
404
- meta: { name: "list", description: "List the comments on a post." },
409
+ meta: { name: "list", description: "List the comments on a post. A very recent add/delete may take a few minutes to appear or clear here (LinkedIn-side indexing)." },
405
410
  args: {
406
411
  ...GLOBAL_FLAGS,
407
412
  postId: { type: "positional", description: "Post id (or share URN) to list comments for." }
@@ -9,18 +9,19 @@ import {
9
9
  resolveIdentifier
10
10
  } from "./chunk-DMQZEPQE.js";
11
11
  import {
12
+ pageDelayFromFlags,
12
13
  streamAll
13
- } from "./chunk-DNTRQZBT.js";
14
+ } from "./chunk-EEMJDJ4W.js";
14
15
  import {
15
16
  createClient,
16
17
  renderError,
17
18
  renderSuccess,
18
19
  renderUnexpectedError,
19
20
  resolveEffectiveConfig
20
- } from "./chunk-JXF47TRY.js";
21
+ } from "./chunk-M33MI53G.js";
21
22
  import {
22
23
  GLOBAL_FLAGS
23
- } from "./chunk-4JHGVY7R.js";
24
+ } from "./chunk-TMU3CSPR.js";
24
25
 
25
26
  // src/commands/company.ts
26
27
  import { defineCommand } from "citty";
@@ -105,7 +106,8 @@ async function runCompanyEmployees(client, flags, out) {
105
106
  const fn = (p) => ns.companies.employees(identifier, p);
106
107
  for await (const item of streamAll(fn, params, {
107
108
  maxPages,
108
- out
109
+ out,
110
+ pageDelayMs: pageDelayFromFlags(flags)
109
111
  })) {
110
112
  out.stdout.write(JSON.stringify(item) + "\n");
111
113
  }
@@ -132,7 +134,8 @@ async function runCompanyPosts(client, flags, out) {
132
134
  const fn = (p) => ns.companies.posts(identifier, p);
133
135
  for await (const item of streamAll(fn, params, {
134
136
  maxPages,
135
- out
137
+ out,
138
+ pageDelayMs: pageDelayFromFlags(flags)
136
139
  })) {
137
140
  out.stdout.write(JSON.stringify(item) + "\n");
138
141
  }
@@ -160,7 +163,8 @@ async function runCompanyJobs(client, flags, out) {
160
163
  const fn = (p) => ns.companies.jobs(identifier, p);
161
164
  for await (const item of streamAll(fn, params, {
162
165
  maxPages,
163
- out
166
+ out,
167
+ pageDelayMs: pageDelayFromFlags(flags)
164
168
  })) {
165
169
  out.stdout.write(JSON.stringify(item) + "\n");
166
170
  }
@@ -7,7 +7,7 @@ import {
7
7
  renameProfile,
8
8
  setActiveProfile,
9
9
  updateProfileField
10
- } from "./chunk-4JHGVY7R.js";
10
+ } from "./chunk-TMU3CSPR.js";
11
11
 
12
12
  // src/commands/config.ts
13
13
  import { defineCommand } from "citty";