@datarails-ai/dr-cli 1.6.131 → 1.6.132

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/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import { fileURLToPath as fileURLToPath3 } from "url";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "@datarails-ai/dr-cli",
11
- version: "1.6.131",
11
+ version: "1.6.132",
12
12
  description: "Datarails CLI",
13
13
  type: "module",
14
14
  engines: {
@@ -69,7 +69,7 @@ var package_default = {
69
69
  };
70
70
 
71
71
  // src/buildInfo.ts
72
- var BUILD_TIME = "2026-10-14T12:32:00.887Z";
72
+ var BUILD_TIME = "2026-10-14T19:31:40.601Z";
73
73
  function formatBuildTime(iso) {
74
74
  if (iso === "") return "";
75
75
  const d = new Date(iso);
@@ -3895,7 +3895,27 @@ var PROD_GATE_TIER_B = /* @__PURE__ */ new Set([
3895
3895
  "org-export|delete",
3896
3896
  // connectors poll item skip (dr connectors poll skip). The item is never landed,
3897
3897
  // but `dr connectors poll retry` queues it again, so the token alone is enough.
3898
- "connector-poll-item|skip"
3898
+ "connector-poll-item|skip",
3899
+ // connectors poll seeding (dr connectors poll seed, and a `poll set` whose answers seed
3900
+ // and land nothing: `--on-policy-change seed`, with or without `--widen seed`). DR-55448.
3901
+ // A seed marks items already in the source as seen, so a cut-over does not land them a
3902
+ // second time beside the versions the old feed (Workato) already landed. It lands
3903
+ // nothing, deletes nothing and touches no version in the filebox. It is a routine step of
3904
+ // every cut-over (bind, seed --until <cut-over>, enable, pause the old feed), run once per
3905
+ // filebox, often by an agent over hundreds of fileboxes, and the word dialog stalled every
3906
+ // one of them. The token still binds the filebox, server, account, control-plane URL and
3907
+ // the exact --until / settings, and the control-plane audits each call
3908
+ // (`poll.seed` / `poll.put`: user, org, query).
3909
+ // Judged, not free: a seeded item is not undone by `poll retry` (that covers failed,
3910
+ // waiting and skipped items), so a cutoff set too late leaves files unlanded until a
3911
+ // Tier-A land path (`set --on-policy-change land`, `resume --source land`) or an upload
3912
+ // brings them in. Accepted because those files stay in the source and nothing in the
3913
+ // filebox changes; the plan shows the filebox and the cutoff before the token is
3914
+ // redeemed, and a separate `seed --dry-run` counts the already-discovered items it would
3915
+ // mark (the plan does not). If a seed ever lands, deletes or rewrites a version,
3916
+ // these keys move back to Tier A.
3917
+ "connector-poll|seed",
3918
+ "connector-poll|set-seed"
3899
3919
  ]);
3900
3920
  var PROD_GATE_TIER_A = /* @__PURE__ */ new Set([
3901
3921
  // workflow / mec — soft-delete + cascade deletes. `archive` also covers the
@@ -4031,13 +4051,13 @@ var PROD_GATE_TIER_A = /* @__PURE__ */ new Set([
4031
4051
  // deletes whole organizations via the org-delete chord. The single most
4032
4052
  // destructive verb in the CLI; the word gate stays on prod unconditionally.
4033
4053
  "org-import|delete-orgs",
4034
- // connectors polled ingestion (dr connectors poll seed / set / resume --source land).
4035
- // A seed marks items landed so they never land; `set` is gated (as `set-land-or-seed`)
4036
- // only when it lands a wider window or seeds / lands on a change-policy switch;
4037
- // `resume --source land` lands everything a changed source holds. Versions landed in
4038
- // a customer filebox, or files hidden from it, cannot be taken back from the CLI.
4039
- "connector-poll|seed",
4040
- "connector-poll|set-land-or-seed",
4054
+ // connectors polled ingestion writes that LAND files (dr connectors poll set / resume
4055
+ // --source land). `set-land` is a `poll set` with any answer that lands: a wider window
4056
+ // with `--widen land`, or `--on-policy-change land` (a seed alongside a land is still
4057
+ // `set-land`). `resume --source land` lands everything a changed source holds. Versions
4058
+ // landed in a customer filebox cannot be taken back from the CLI. Seeding is Tier B
4059
+ // (`connector-poll|seed` / `|set-seed`, DR-55448).
4060
+ "connector-poll|set-land",
4041
4061
  "connector-poll|resume-land"
4042
4062
  ]);
4043
4063
  function classifyTier(action) {
@@ -44119,6 +44139,9 @@ async function ask(cfg, message, choices, defaultChoice) {
44119
44139
  }
44120
44140
  var WIDEN_HELP = "seed = mark the newly exposed items as already landed, land = land them all";
44121
44141
  var POLICY_HELP = "rekey = re-key the ledger from a fresh listing (nothing lands again), seed = mark everything in the window as landed, land = land everything in the window";
44142
+ function pollSetConfirmVerb(widen, onPolicyChange) {
44143
+ return widen === "land" || onPolicyChange === "land" ? "set-land" : "set-seed";
44144
+ }
44122
44145
  async function runPollSet(cfg) {
44123
44146
  if (Object.keys(cfg.changes).length === 0) {
44124
44147
  throw new Error(
@@ -44175,7 +44198,12 @@ async function runPollSet(cfg) {
44175
44198
  cfg.deadline?.pause();
44176
44199
  await twoStepConfirm({
44177
44200
  out: cfg.out,
44178
- action: pollConfirmAction(cfg.filebox, "set-land-or-seed", cfg.scope, { ...body }),
44201
+ action: pollConfirmAction(
44202
+ cfg.filebox,
44203
+ pollSetConfirmVerb(body.widen, body.on_policy_change),
44204
+ cfg.scope,
44205
+ { ...body }
44206
+ ),
44179
44207
  token: cfg.token,
44180
44208
  server: cfg.scope.serverKey,
44181
44209
  confirmCmd: `dr connectors poll set ${cfg.filebox}${cfg.settingsArgs}${flags}${cfg.targetArgs}`,
@@ -44526,8 +44554,21 @@ function ttyChoicePrompt(message, choices, defaultChoice, io = { input: process.
44526
44554
  askOnce();
44527
44555
  });
44528
44556
  }
44557
+ var POLL_CONFIRM_HELP = [
44558
+ "Confirmation:",
44559
+ " seed, skip and set --on-policy-change seed print a plan and a --confirm-token;",
44560
+ " re-run the printed command, token included, to apply it.",
44561
+ " No dialog opens on production, so an agent or script can run a cut-over unattended:",
44562
+ " dr connectors poll seed <filebox> --until <cut-over> --server <prod>",
44563
+ " dr connectors poll seed <filebox> --until <cut-over> --server <prod> --confirm-token <token>",
44564
+ " (seed --dry-run counts the already-discovered items a seed would mark.)",
44565
+ " A write with any answer that lands files (set --widen land, set --on-policy-change land,",
44566
+ " resume --source land) also asks a person to type a word in a dialog on production,",
44567
+ " even when the same set also seeds (--on-policy-change seed --widen land)."
44568
+ ].join("\n");
44529
44569
  function registerConnectorsPoll(connectors) {
44530
- const poll2 = connectors.command("poll").description("Polled file ingestion: the control-plane lands each new file as one version");
44570
+ const poll2 = connectors.command("poll").description("Polled file ingestion: the control-plane lands each new file as one version").addHelpText("after", `
44571
+ ${POLL_CONFIRM_HELP}`);
44531
44572
  const enableCmd = addSettingsFlags(
44532
44573
  poll2.command("enable").description("Poll a filebox's binding (dated with the filebox's DATE tag)").argument("<filebox>", "filebox id or uuid")
44533
44574
  ).action(async (filebox, opts) => {
@@ -44553,14 +44594,15 @@ function registerConnectorsPoll(connectors) {
44553
44594
  ).option(
44554
44595
  "--widen <seed|land>",
44555
44596
  "a wider window: seed (mark exposed items landed) or land them"
44556
- ).option("--on-policy-change <rekey|seed|land>", "a --same-name switch: rekey, seed or land")
44597
+ ).option("--on-policy-change <rekey|seed|land>", "a --same-name switch: rekey, seed or land").addHelpText("after", `
44598
+ ${POLL_CONFIRM_HELP}`)
44557
44599
  ).action(
44558
44600
  async (filebox, opts) => {
44559
44601
  const changes = parseSettings(opts);
44560
44602
  const widen = opts.widen === void 0 ? void 0 : parseChoice(opts.widen, "--widen", WIDEN_CHOICES);
44561
44603
  const onPolicyChange = opts.onPolicyChange === void 0 ? void 0 : parseChoice(opts.onPolicyChange, "--on-policy-change", POLICY_CHOICES);
44562
44604
  await preflightConfirmToken(
44563
- pollConfirmAction(filebox, "set-land-or-seed", scopeOf(opts), {
44605
+ pollConfirmAction(filebox, pollSetConfirmVerb(widen, onPolicyChange), scopeOf(opts), {
44564
44606
  ...changes,
44565
44607
  ...widen !== void 0 ? { widen } : {},
44566
44608
  ...onPolicyChange !== void 0 ? { on_policy_change: onPolicyChange } : {}
@@ -44735,14 +44777,17 @@ function registerConnectorsPoll(connectors) {
44735
44777
  });
44736
44778
  addCommonFlags(skipCmd, "Output the item as JSON");
44737
44779
  const seedCmd = addConfirmTokenFlag(
44738
- poll2.command("seed").description("Mark items modified at or before --until as already landed (cut-over)").argument("<filebox>", "filebox id or uuid").requiredOption(
44780
+ poll2.command("seed").description(
44781
+ "Mark items modified at or before --until as already landed (cut-over; token, no dialog)"
44782
+ ).argument("<filebox>", "filebox id or uuid").requiredOption(
44739
44783
  "--until <timestamp>",
44740
44784
  "date or timestamp with a zone, e.g. 2026-10-08T17:30:00Z"
44741
44785
  ).option(
44742
44786
  "--dry-run",
44743
44787
  "count the already-discovered items it would mark, without changing anything",
44744
44788
  false
44745
- )
44789
+ ).addHelpText("after", `
44790
+ ${POLL_CONFIRM_HELP}`)
44746
44791
  ).action(
44747
44792
  async (filebox, opts) => {
44748
44793
  const until = parseTimestampFlag(opts.until, "--until");
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "cliVersion": "1.6.131",
3
+ "cliVersion": "1.6.132",
4
4
  "_contract": "Resolve a command path through `aliases` (canonical prefix + alias segment -> canonical path) before any lookup. A path listed in `pendingCommands`, or whose first segment is a key of `pending`, is UNDECIDED, not unrestricted: fail closed or skip it, and never read a path's absence from `commands` as 'no requirement'. An entry carrying `denied` is UNAVAILABLE to any AGENT-SCOPED credential — one whose `scopes` claim carries at least one `resource:action` entry; a claim that is absent, empty, capability-only or wholly unparseable is UNRESTRICTED, and this mark does not apply to it — whatever else that entry says: it is not a ceiling and it is not always-available, its `denied.reason` says why and `denied.until` names the ticket that lifts it, and the absence of `requires` on it must NEVER be read as 'no requirement'. Only an entry in `commands` with an empty `requires` means always-available.",
5
5
  "commands": {
6
6
  "login": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datarails-ai/dr-cli",
3
- "version": "1.6.131",
3
+ "version": "1.6.132",
4
4
  "description": "Datarails CLI",
5
5
  "type": "module",
6
6
  "engines": {