@arbidocs/cli 0.3.119 → 0.3.121

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
@@ -1,5 +1,50 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.3.121
4
+
5
+ [compare changes](https://github.com/arbicity/ARBI-frontend/compare/v0.3.120...HEAD)
6
+
7
+ ### 🚀 Enhancements
8
+
9
+ - **theme:** Default to Fraunces/Inter with editorial heading polish ([907ecdc8](https://github.com/arbicity/ARBI-frontend/commit/907ecdc8))
10
+ - **theme:** Tighten radius, add editorial marks, warm the neutral palette ([d42cc2bc](https://github.com/arbicity/ARBI-frontend/commit/d42cc2bc))
11
+ - **theme:** Complete the status-token system (solid fills, hover-strong, dark trios) ([ad3e6f56](https://github.com/arbicity/ARBI-frontend/commit/ad3e6f56))
12
+ - **api:** Circuit-break runaway settings writes at the fetch layer ([#1094](https://github.com/arbicity/ARBI-frontend/pull/1094))
13
+ - **subscription:** Add a "Stay on Free plan" opt-out to the plan dialog ([79cda37b](https://github.com/arbicity/ARBI-frontend/commit/79cda37b))
14
+ - **subscription:** Lead the plan dialog with why you'd upgrade ([b0add3a7](https://github.com/arbicity/ARBI-frontend/commit/b0add3a7))
15
+ - **blocks:** Reference images for studio image generation ([#1087](https://github.com/arbicity/ARBI-frontend/pull/1087))
16
+
17
+ ### 🩹 Fixes
18
+
19
+ - **pwa:** Make deploys reach stale clients automatically (SW update watcher + cache fixes) ([#1079](https://github.com/arbicity/ARBI-frontend/pull/1079))
20
+ - **documents:** Gallery thumbnail never appears after reprocessing a document ([3071dedf](https://github.com/arbicity/ARBI-frontend/commit/3071dedf))
21
+ - **subscription:** Stop the plan cards bleeding out of the dialog on narrow screens ([2310a6d5](https://github.com/arbicity/ARBI-frontend/commit/2310a6d5))
22
+
23
+ ### 💅 Refactors
24
+
25
+ - **theme:** Make hardcoded colors and radii respond to design tokens ([44d9c907](https://github.com/arbicity/ARBI-frontend/commit/44d9c907))
26
+ - Clear all ESLint warnings (dead code, unused deps, file splits) ([a582e35b](https://github.com/arbicity/ARBI-frontend/commit/a582e35b))
27
+
28
+ ### ✅ Tests
29
+
30
+ - De-flake useOfflineDocuments by stubbing the lazy DocumentViewer chunk ([218df512](https://github.com/arbicity/ARBI-frontend/commit/218df512))
31
+
32
+ ## v0.3.120
33
+
34
+ [compare changes](https://github.com/arbicity/ARBI-frontend/compare/v0.3.119...HEAD)
35
+
36
+ ### 🚀 Enhancements
37
+
38
+ - **subscription:** Show plan prices directly on login for free users ([#1083](https://github.com/arbicity/ARBI-frontend/pull/1083))
39
+ - **kit:** Add SDK-free /ui and /site subpath exports ([#1084](https://github.com/arbicity/ARBI-frontend/pull/1084))
40
+
41
+ ### 🩹 Fixes
42
+
43
+ - Connect notifications WebSocket on same-origin deployments ([#1074](https://github.com/arbicity/ARBI-frontend/pull/1074))
44
+ - Notifications WebSocket must never log the user out ([#1075](https://github.com/arbicity/ARBI-frontend/pull/1075))
45
+ - New user wedged on /login after registering (trailing-slash return-URL trap) ([#1076](https://github.com/arbicity/ARBI-frontend/pull/1076))
46
+ - **tips:** Stop the smart-tips bar flickering on app entry ([#1081](https://github.com/arbicity/ARBI-frontend/pull/1081))
47
+
3
48
  ## v0.3.119
4
49
 
5
50
  [compare changes](https://github.com/arbicity/ARBI-frontend/compare/v0.3.118...HEAD)
package/dist/index.js CHANGED
@@ -3694,7 +3694,7 @@ function getLatestVersion(skipCache = false) {
3694
3694
  }
3695
3695
  }
3696
3696
  function getCurrentVersion() {
3697
- return "0.3.119";
3697
+ return "0.3.121";
3698
3698
  }
3699
3699
  function readChangelog(fromVersion, toVersion) {
3700
3700
  try {
@@ -3747,17 +3747,17 @@ function showChangelog(fromVersion, toVersion) {
3747
3747
  async function checkForUpdates(autoUpdate) {
3748
3748
  try {
3749
3749
  const latest = getLatestVersion();
3750
- if (!latest || latest === "0.3.119") return;
3750
+ if (!latest || latest === "0.3.121") return;
3751
3751
  if (autoUpdate) {
3752
3752
  warn(`
3753
- Your arbi version is out of date (${"0.3.119"} \u2192 ${latest}). Updating...`);
3753
+ Your arbi version is out of date (${"0.3.121"} \u2192 ${latest}). Updating...`);
3754
3754
  child_process.execSync("npm install -g @arbidocs/cli@latest", { stdio: "inherit" });
3755
- showChangelog("0.3.119", latest);
3755
+ showChangelog("0.3.121", latest);
3756
3756
  console.log(`Updated to ${latest}.`);
3757
3757
  } else {
3758
3758
  warn(
3759
3759
  `
3760
- Your arbi version is out of date (${"0.3.119"} \u2192 ${latest}).
3760
+ Your arbi version is out of date (${"0.3.121"} \u2192 ${latest}).
3761
3761
  Run "arbi update" to upgrade, or "arbi update auto" to always stay up to date.`
3762
3762
  );
3763
3763
  }
@@ -3789,10 +3789,10 @@ function markNagShown(latest) {
3789
3789
  function hintUpdateOnError() {
3790
3790
  try {
3791
3791
  const cached = readCache();
3792
- if (!cached || cached.latest === "0.3.119") return;
3792
+ if (!cached || cached.latest === "0.3.121") return;
3793
3793
  if (!shouldShowNag(cached.latest)) return;
3794
3794
  warn(
3795
- `Your arbi version is out of date (${"0.3.119"} \u2192 ${cached.latest}). Run "arbi update".`
3795
+ `Your arbi version is out of date (${"0.3.121"} \u2192 ${cached.latest}). Run "arbi update".`
3796
3796
  );
3797
3797
  markNagShown(cached.latest);
3798
3798
  } catch {
@@ -9490,6 +9490,143 @@ function registerTaskCommand(program2) {
9490
9490
  })()
9491
9491
  );
9492
9492
  }
9493
+ var TRIGGERS = ["one_time", "recurring", "event"];
9494
+ var ACTIONS = ["notify", "agent_prompt", "run_skill"];
9495
+ var STATUSES = ["active", "paused"];
9496
+ function oneOf(value, allowed, flag) {
9497
+ if (allowed.includes(value)) return value;
9498
+ error(`${flag} must be one of: ${allowed.join(", ")} (got: ${value})`);
9499
+ process.exit(1);
9500
+ }
9501
+ function printTask(t) {
9502
+ label("ID:", ref(t.external_id));
9503
+ label("Name:", t.name);
9504
+ label("Trigger:", t.trigger_type);
9505
+ if (t.rrule) label("RRule:", t.rrule);
9506
+ if (t.run_at) label("Run at:", t.run_at);
9507
+ if (t.event_kind) label("Event:", t.event_kind);
9508
+ label("Timezone:", t.timezone);
9509
+ label("Action:", t.action_type);
9510
+ if (t.prompt) label("Prompt:", t.prompt);
9511
+ if (t.skill_ref) label("Skill:", t.skill_ref);
9512
+ if (t.agent_ext_id) label("Agent:", t.agent_ext_id);
9513
+ if (t.workspace_ext_id) label("Workspace:", t.workspace_ext_id);
9514
+ label("Status:", status(t.status));
9515
+ label("Notify on complete:", String(t.notify_on_complete));
9516
+ if (t.next_run_at) label("Next run:", t.next_run_at);
9517
+ if (t.last_run_at) label("Last run:", t.last_run_at);
9518
+ if (t.last_error) label("Last error:", t.last_error);
9519
+ }
9520
+ function registerScheduleCommand(program2) {
9521
+ const schedule = program2.command("schedule").description("Scheduled tasks (/v1/tasks): create, list, get, update, run, delete");
9522
+ schedule.command("create").description("Create a scheduled task").requiredOption("--name <name>", "Task name (required)").option("--trigger <one_time|recurring|event>", "Trigger type", "one_time").option("--rrule <RRULE>", "RFC-5545 recurrence rule (for --trigger recurring)").option("--run-at <ISO>", "When to run once (ISO-8601, for --trigger one_time)").option("--timezone <tz>", "IANA timezone", "UTC").option("--event-kind <kind>", "Event name to react to (for --trigger event)").option("--action <notify|agent_prompt|run_skill>", "What the task does", "notify").option("--prompt <text>", "Prompt/message for notify or agent_prompt actions").option("--skill <ref>", "Skill reference (for --action run_skill)").option("--agent <agt-id>", "Agent to run the prompt as (external id)").option("--workspace <wrk-id>", "Workspace to scope the task to (external id)").option("--notify-on-complete", "Send a notification when the task completes").option("--json", "Output as JSON").action(
9523
+ (opts) => runAction(async () => {
9524
+ const { arbi } = await resolveAuth();
9525
+ const body = {
9526
+ name: opts.name,
9527
+ trigger_type: oneOf(opts.trigger, TRIGGERS, "--trigger"),
9528
+ timezone: opts.timezone,
9529
+ action_type: oneOf(opts.action, ACTIONS, "--action"),
9530
+ prompt: opts.prompt ?? ""
9531
+ };
9532
+ if (opts.rrule) body.rrule = opts.rrule;
9533
+ if (opts.runAt) body.run_at = opts.runAt;
9534
+ if (opts.eventKind) body.event_kind = opts.eventKind;
9535
+ if (opts.skill) body.skill_ref = opts.skill;
9536
+ if (opts.agent) body.agent_ext_id = opts.agent;
9537
+ if (opts.workspace) body.workspace_ext_id = opts.workspace;
9538
+ if (opts.notifyOnComplete) body.notify_on_complete = true;
9539
+ const data = await sdk.tasks.createTask(arbi, body);
9540
+ if (opts.json) {
9541
+ printJson(data);
9542
+ return;
9543
+ }
9544
+ success(`Created scheduled task: ${data.name} (${ref(data.external_id)})`);
9545
+ })()
9546
+ );
9547
+ schedule.command("list").description("List your scheduled tasks").option("--json", "Output as JSON").action(
9548
+ (opts) => runAction(async () => {
9549
+ const { arbi } = await resolveAuth();
9550
+ const data = await sdk.tasks.listTasks(arbi);
9551
+ if (!emitListOrTable(data, opts, "No scheduled tasks found.")) return;
9552
+ printTable(
9553
+ [
9554
+ { header: "ID", width: 22, value: (r) => r.external_id },
9555
+ { header: "NAME", width: 26, value: (r) => r.name ?? "" },
9556
+ { header: "TRIGGER", width: 12, value: (r) => r.trigger_type ?? "" },
9557
+ { header: "ACTION", width: 14, value: (r) => r.action_type ?? "" },
9558
+ { header: "STATUS", width: 10, value: (r) => status(r.status ?? "") },
9559
+ { header: "NEXT RUN", width: 26, value: (r) => r.next_run_at ?? "" }
9560
+ ],
9561
+ data
9562
+ );
9563
+ })()
9564
+ );
9565
+ schedule.command("get <id>").description("Show a scheduled task").option("--json", "Output as JSON").action(
9566
+ (id, opts) => runAction(async () => {
9567
+ const { arbi } = await resolveAuth();
9568
+ const data = await sdk.tasks.getTask(arbi, id);
9569
+ if (opts.json) {
9570
+ printJson(data);
9571
+ return;
9572
+ }
9573
+ printTask(data);
9574
+ })()
9575
+ );
9576
+ schedule.command("update <id>").description("Update a scheduled task (use --status to pause/resume)").option("--name <name>", "New name").option("--rrule <RRULE>", "New recurrence rule").option("--run-at <ISO>", "New one-time run time (ISO-8601)").option("--timezone <tz>", "New IANA timezone").option("--prompt <text>", "New prompt/message").option("--skill <ref>", "New skill reference").option("--status <active|paused>", "Pause or resume the task").option("--notify-on-complete <bool>", "Notify on complete (true|false)").option("--json", "Output as JSON").action(
9577
+ (id, opts) => runAction(async () => {
9578
+ const { arbi } = await resolveAuth();
9579
+ const body = {};
9580
+ if (opts.name !== void 0) body.name = opts.name;
9581
+ if (opts.rrule !== void 0) body.rrule = opts.rrule;
9582
+ if (opts.runAt !== void 0) body.run_at = opts.runAt;
9583
+ if (opts.timezone !== void 0) body.timezone = opts.timezone;
9584
+ if (opts.prompt !== void 0) body.prompt = opts.prompt;
9585
+ if (opts.skill !== void 0) body.skill_ref = opts.skill;
9586
+ if (opts.status !== void 0) body.status = oneOf(opts.status, STATUSES, "--status");
9587
+ if (opts.notifyOnComplete !== void 0) {
9588
+ body.notify_on_complete = /^(1|true|yes)$/i.test(opts.notifyOnComplete);
9589
+ }
9590
+ if (Object.keys(body).length === 0) {
9591
+ error("Nothing to update. Pass at least one field (e.g. --name, --status).");
9592
+ process.exit(1);
9593
+ }
9594
+ const data = await sdk.tasks.updateTask(arbi, id, body);
9595
+ if (opts.json) {
9596
+ printJson(data);
9597
+ return;
9598
+ }
9599
+ success(`Updated scheduled task: ${ref(id)}`);
9600
+ })()
9601
+ );
9602
+ schedule.command("run <id>").description("Fire a scheduled task now (does not advance its schedule)").option("--json", "Output as JSON").action(
9603
+ (id, opts) => runAction(async () => {
9604
+ const { arbi } = await resolveAuth();
9605
+ const data = await sdk.tasks.runTask(arbi, id);
9606
+ if (opts.json) {
9607
+ printJson(data);
9608
+ return;
9609
+ }
9610
+ success(`Ran scheduled task: ${ref(id)}`);
9611
+ })()
9612
+ );
9613
+ schedule.command("delete <id>").description("Delete a scheduled task (irreversible)").action(
9614
+ (id) => runAction(async () => {
9615
+ const { arbi } = await resolveAuth();
9616
+ await sdk.tasks.deleteTask(arbi, id);
9617
+ success(`Deleted scheduled task: ${ref(id)}`);
9618
+ })()
9619
+ );
9620
+ schedule.allowUnknownOption(true).allowExcessArguments(true).action(async () => {
9621
+ const tail = schedule.args ?? [];
9622
+ const subcommands = schedule.commands.map((c) => c.name());
9623
+ const firstNonFlag = tail.find((a) => !a.startsWith("-"));
9624
+ if (firstNonFlag && !subcommands.includes(firstNonFlag)) {
9625
+ suggestSubcommandAndExit("schedule", firstNonFlag, subcommands);
9626
+ }
9627
+ await schedule.commands.find((c) => c.name() === "list").parseAsync(tail, { from: "user" });
9628
+ });
9629
+ }
9493
9630
  var MARKER_START = "# arbi-cli completion start";
9494
9631
  var MARKER_END = "# arbi-cli completion end";
9495
9632
  var BASH_COMPLETION = `
@@ -9871,8 +10008,18 @@ function registerNotificationsCommand(program2) {
9871
10008
  await notif.commands.find((c) => c.name() === "list").parseAsync(tail, { from: "user" });
9872
10009
  });
9873
10010
  }
10011
+ async function resolveProjectId(arbi, explicit) {
10012
+ if (explicit) return explicit;
10013
+ const list = await sdk.projects.listProjects(arbi);
10014
+ const first = list?.[0]?.external_id;
10015
+ if (!first) {
10016
+ error("No projects found. Pass --project <id> or create one with: arbi project create <name>");
10017
+ process.exit(3);
10018
+ }
10019
+ return first;
10020
+ }
9874
10021
  function registerProjectCommand(program2) {
9875
- const project = program2.command("project").description("Project tenancy: list, create, refresh");
10022
+ const project = program2.command("project").description("Project tenancy: list, create, rename, update, delete, refresh");
9876
10023
  project.command("list").description("List your projects").option("--json", "Output as JSON").action(
9877
10024
  (opts) => runAction(async () => {
9878
10025
  const { arbi } = await resolveAuth();
@@ -9896,6 +10043,43 @@ function registerProjectCommand(program2) {
9896
10043
  success(`Created project: ${data.name} (${ref(data.external_id)})`);
9897
10044
  })()
9898
10045
  );
10046
+ project.command("rename <name>").description("Rename a project (defaults to your first project)").option("-p, --project <id>", "Project id to rename (default: your first project)").action(
10047
+ (name, opts) => runAction(async () => {
10048
+ const { arbi } = await resolveAuth();
10049
+ const id = await resolveProjectId(arbi, opts.project);
10050
+ const data = await sdk.projects.renameProject(arbi, id, name);
10051
+ success(`Renamed project ${ref(id)} \u2192 ${data.name}`);
10052
+ })()
10053
+ );
10054
+ project.command("update").description("Update a project\u2019s name and/or per-user daily credit cap").option("-p, --project <id>", "Project id to update (default: your first project)").option("--name <name>", "New project name").option("--daily-cap <credits>", "Per-user daily credit cap (a number)").action(
10055
+ (opts) => runAction(async () => {
10056
+ const { arbi } = await resolveAuth();
10057
+ const body = {};
10058
+ if (opts.name !== void 0) body.name = opts.name;
10059
+ if (opts.dailyCap !== void 0) {
10060
+ const cap = Number(opts.dailyCap);
10061
+ if (!Number.isFinite(cap)) {
10062
+ error(`--daily-cap must be a number, got: ${opts.dailyCap}`);
10063
+ process.exit(1);
10064
+ }
10065
+ body.daily_cap_per_user = cap;
10066
+ }
10067
+ if (Object.keys(body).length === 0) {
10068
+ error("Nothing to update. Pass --name and/or --daily-cap.");
10069
+ process.exit(1);
10070
+ }
10071
+ const id = await resolveProjectId(arbi, opts.project);
10072
+ const data = await sdk.projects.updateProject(arbi, id, body);
10073
+ success(`Updated project ${ref(id)} (${data.name})`);
10074
+ })()
10075
+ );
10076
+ project.command("delete <id>").description("Delete a project (irreversible; requires an explicit id)").action(
10077
+ (id) => runAction(async () => {
10078
+ const { arbi } = await resolveAuth();
10079
+ await sdk.projects.deleteProject(arbi, id);
10080
+ success(`Deleted project: ${ref(id)}`);
10081
+ })()
10082
+ );
9899
10083
  project.command("refresh <id>").description("Refresh a project (force plan/usage sync from billing)").action(
9900
10084
  (id) => runAction(async () => {
9901
10085
  const { arbi } = await resolveAuth();
@@ -10054,30 +10238,32 @@ function registerUsageCommand(program2) {
10054
10238
  }
10055
10239
  function registerAuthCommand(program2) {
10056
10240
  const auth = program2.command("auth").description("Self-service account ops: profile, change-email, delete-account, sso-config");
10057
- auth.command("profile").description("Show or update your display profile (given/family name, picture)").option("--name <given>", "New given name").option("--family <family>", "New family name (empty string clears it)").option(
10241
+ auth.command("profile").description("Show or update your display profile (given/family name, picture)").option("--given-name <given>", "New given name").option("--family-name <family>", "New family name (empty string clears it)").option(
10058
10242
  "--picture <path-or-url>",
10059
- "Profile picture (local path \u2192 base64 inline; URL \u2192 stored verbatim)"
10060
- ).action(
10243
+ "Profile picture (local path \u2192 base64 inline; URL/data-URI \u2192 stored verbatim)"
10244
+ ).option("--name <given>", "Alias for --given-name").option("--family <family>", "Alias for --family-name").action(
10061
10245
  (opts) => runAction(async () => {
10062
10246
  const { arbi } = await resolveAuth();
10063
- const noUpdates = !opts.name && opts.family === void 0 && !opts.picture;
10247
+ const given = opts.givenName ?? opts.name;
10248
+ const family = opts.familyName ?? opts.family;
10249
+ const noUpdates = given === void 0 && family === void 0 && !opts.picture;
10064
10250
  if (noUpdates) {
10065
10251
  const myExtId = arbi.session.getState().userExtId;
10066
- const res2 = await arbi.fetch.GET("/v1/workspace/users");
10067
- if (res2.error || !res2.data) {
10252
+ const res = await arbi.fetch.GET("/v1/workspace/users");
10253
+ if (res.error || !res.data) {
10068
10254
  error(
10069
10255
  "No profile-read endpoint exists. To inspect: arbi status --json or arbi contacts --json"
10070
10256
  );
10071
10257
  process.exit(1);
10072
10258
  }
10073
- const me = res2.data.find(
10259
+ const me = res.data.find(
10074
10260
  (u) => u.external_id === myExtId
10075
10261
  );
10076
10262
  const profile = me ?? { external_id: myExtId };
10077
10263
  for (const [k, v] of Object.entries(profile)) {
10078
10264
  label(`${k}:`, typeof v === "object" ? JSON.stringify(v) : String(v));
10079
10265
  }
10080
- dim("\nPass --name/--family/--picture to update.");
10266
+ dim("\nPass --given-name/--family-name/--picture to update.");
10081
10267
  return;
10082
10268
  }
10083
10269
  let picture = opts.picture;
@@ -10093,11 +10279,10 @@ function registerAuthCommand(program2) {
10093
10279
  }
10094
10280
  }
10095
10281
  const body = {};
10096
- if (opts.name !== void 0) body.given_name = opts.name;
10097
- if (opts.family !== void 0) body.family_name = opts.family;
10282
+ if (given !== void 0) body.given_name = given;
10283
+ if (family !== void 0) body.family_name = family;
10098
10284
  if (picture !== void 0) body.picture = picture;
10099
- const res = await arbi.fetch.PATCH("/v1/user/profile", { body });
10100
- if (res.error) throw new Error(`Profile update failed: ${JSON.stringify(res.error)}`);
10285
+ await sdk.profile.updateProfile(arbi, body);
10101
10286
  success("Profile updated.");
10102
10287
  })()
10103
10288
  );
@@ -10298,7 +10483,7 @@ console.info = (...args) => {
10298
10483
  _origInfo(...args);
10299
10484
  };
10300
10485
  var program = new commander.Command();
10301
- program.name("arbi").description("ARBI CLI \u2014 interact with ARBI from the terminal").version("0.3.119").showHelpAfterError(true).showSuggestionAfterError(true);
10486
+ program.name("arbi").description("ARBI CLI \u2014 interact with ARBI from the terminal").version("0.3.121").showHelpAfterError(true).showSuggestionAfterError(true);
10302
10487
  registerConfigCommand(program);
10303
10488
  registerLoginCommand(program);
10304
10489
  registerRegisterCommand(program);
@@ -10326,6 +10511,7 @@ registerQuickstartCommand(program);
10326
10511
  registerAgentCreateCommand(program);
10327
10512
  registerAgentCommand(program);
10328
10513
  registerTaskCommand(program);
10514
+ registerScheduleCommand(program);
10329
10515
  registerCompletionCommand(program);
10330
10516
  registerListenCommand(program);
10331
10517
  registerSessionCommand(program);
@@ -10351,7 +10537,7 @@ applyHelpGroups(program, {
10351
10537
  "Search & ask:": ["ask", "find", "cite", "watch"],
10352
10538
  "Tagging:": ["tags", "doctags"],
10353
10539
  "Conversations & messaging:": ["convo", "dm", "listen", "notifications", "contacts"],
10354
- "Agents & tasks:": ["agent", "agent-create", "task", "agentconfig", "session"],
10540
+ "Agents & tasks:": ["agent", "agent-create", "task", "schedule", "agentconfig", "session"],
10355
10541
  "Account:": ["auth", "usage", "files"],
10356
10542
  "System:": ["health", "models", "settings", "tui", "local", "update"]
10357
10543
  });