@robota-sdk/agent-cli 3.0.0-beta.1 → 3.0.0-beta.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/dist/node/bin.cjs CHANGED
@@ -625,7 +625,7 @@ function InputArea({ onSubmit, isDisabled, registry }) {
625
625
  var import_react4 = __toESM(require("react"), 1);
626
626
  var import_ink7 = require("ink");
627
627
  var import_jsx_runtime7 = require("react/jsx-runtime");
628
- var OPTIONS = ["Allow", "Deny"];
628
+ var OPTIONS = ["Allow", "Allow always (this session)", "Deny"];
629
629
  function formatArgs2(args) {
630
630
  const entries = Object.entries(args);
631
631
  if (entries.length === 0) return "(no arguments)";
@@ -641,10 +641,12 @@ function PermissionPrompt({ request }) {
641
641
  setSelected(0);
642
642
  }
643
643
  const doResolve = import_react4.default.useCallback(
644
- (allowed) => {
644
+ (index) => {
645
645
  if (resolvedRef.current) return;
646
646
  resolvedRef.current = true;
647
- request.resolve(allowed);
647
+ if (index === 0) request.resolve(true);
648
+ else if (index === 1) request.resolve("allow-session");
649
+ else request.resolve(false);
648
650
  },
649
651
  [request]
650
652
  );
@@ -655,11 +657,13 @@ function PermissionPrompt({ request }) {
655
657
  } else if (key.downArrow || key.rightArrow) {
656
658
  setSelected((prev) => prev < OPTIONS.length - 1 ? prev + 1 : prev);
657
659
  } else if (key.return) {
658
- doResolve(selected === 0);
659
- } else if (input === "y" || input === "a" || input === "1") {
660
- doResolve(true);
661
- } else if (input === "n" || input === "d" || input === "2") {
662
- doResolve(false);
660
+ doResolve(selected);
661
+ } else if (input === "y" || input === "1") {
662
+ doResolve(0);
663
+ } else if (input === "a" || input === "2") {
664
+ doResolve(1);
665
+ } else if (input === "n" || input === "d" || input === "3") {
666
+ doResolve(2);
663
667
  }
664
668
  });
665
669
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_ink7.Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [
@@ -719,11 +723,11 @@ function useSession(props) {
719
723
  setPermissionRequest({
720
724
  toolName: next.toolName,
721
725
  toolArgs: next.toolArgs,
722
- resolve: (allowed) => {
726
+ resolve: (result) => {
723
727
  permissionQueueRef.current.shift();
724
728
  processingRef.current = false;
725
729
  setPermissionRequest(null);
726
- next.resolve(allowed);
730
+ next.resolve(result);
727
731
  setTimeout(() => processNextPermission(), 0);
728
732
  }
729
733
  });
@@ -813,6 +817,26 @@ async function executeSlashCommand(cmd, parts, session, addMessage, setMessages,
813
817
  Messages: ${session.getMessageCount()}`
814
818
  });
815
819
  return true;
820
+ case "permissions": {
821
+ const mode = session.getPermissionMode();
822
+ const sessionAllowed = session.getSessionAllowedTools();
823
+ const lines = [`Permission mode: ${mode}`];
824
+ if (sessionAllowed.length > 0) {
825
+ lines.push(`Session-approved tools: ${sessionAllowed.join(", ")}`);
826
+ } else {
827
+ lines.push("No session-approved tools.");
828
+ }
829
+ addMessage({ role: "system", content: lines.join("\n") });
830
+ return true;
831
+ }
832
+ case "context": {
833
+ const ctx = session.getContextState();
834
+ addMessage({
835
+ role: "system",
836
+ content: `Context: ${ctx.usedTokens.toLocaleString()} / ${ctx.maxTokens.toLocaleString()} tokens (${Math.round(ctx.usedPercentage)}%)`
837
+ });
838
+ return true;
839
+ }
816
840
  case "exit":
817
841
  exit();
818
842
  return true;
@@ -860,8 +884,12 @@ async function runSessionPrompt(prompt, session, addMessage, clearStreamingText,
860
884
  setContextPercentage(session.getContextState().usedPercentage);
861
885
  } catch (err) {
862
886
  clearStreamingText();
863
- const errMsg = err instanceof Error ? err.message : String(err);
864
- addMessage({ role: "system", content: `Error: ${errMsg}` });
887
+ if (err instanceof DOMException && err.name === "AbortError") {
888
+ addMessage({ role: "system", content: "Cancelled." });
889
+ } else {
890
+ const errMsg = err instanceof Error ? err.message : String(err);
891
+ addMessage({ role: "system", content: `Error: ${errMsg}` });
892
+ }
865
893
  } finally {
866
894
  setIsThinking(false);
867
895
  }
@@ -945,8 +973,9 @@ function App(props) {
945
973
  (0, import_ink8.useInput)(
946
974
  (_input, key) => {
947
975
  if (key.ctrl && _input === "c") exit();
976
+ if (key.escape && isThinking) session.abort();
948
977
  },
949
- { isActive: !permissionRequest && !isThinking }
978
+ { isActive: !permissionRequest }
950
979
  );
951
980
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_ink8.Box, { flexDirection: "column", children: [
952
981
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_ink8.Box, { flexDirection: "column", paddingX: 1, marginBottom: 1, children: [
package/dist/node/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  startCli
4
- } from "./chunk-C56WFH5S.js";
4
+ } from "./chunk-OH7DJXHF.js";
5
5
 
6
6
  // src/bin.ts
7
7
  startCli().catch((err) => {
@@ -607,7 +607,7 @@ function InputArea({ onSubmit, isDisabled, registry }) {
607
607
  import React4 from "react";
608
608
  import { Box as Box5, Text as Text7, useInput as useInput3 } from "ink";
609
609
  import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
610
- var OPTIONS = ["Allow", "Deny"];
610
+ var OPTIONS = ["Allow", "Allow always (this session)", "Deny"];
611
611
  function formatArgs2(args) {
612
612
  const entries = Object.entries(args);
613
613
  if (entries.length === 0) return "(no arguments)";
@@ -623,10 +623,12 @@ function PermissionPrompt({ request }) {
623
623
  setSelected(0);
624
624
  }
625
625
  const doResolve = React4.useCallback(
626
- (allowed) => {
626
+ (index) => {
627
627
  if (resolvedRef.current) return;
628
628
  resolvedRef.current = true;
629
- request.resolve(allowed);
629
+ if (index === 0) request.resolve(true);
630
+ else if (index === 1) request.resolve("allow-session");
631
+ else request.resolve(false);
630
632
  },
631
633
  [request]
632
634
  );
@@ -637,11 +639,13 @@ function PermissionPrompt({ request }) {
637
639
  } else if (key.downArrow || key.rightArrow) {
638
640
  setSelected((prev) => prev < OPTIONS.length - 1 ? prev + 1 : prev);
639
641
  } else if (key.return) {
640
- doResolve(selected === 0);
641
- } else if (input === "y" || input === "a" || input === "1") {
642
- doResolve(true);
643
- } else if (input === "n" || input === "d" || input === "2") {
644
- doResolve(false);
642
+ doResolve(selected);
643
+ } else if (input === "y" || input === "1") {
644
+ doResolve(0);
645
+ } else if (input === "a" || input === "2") {
646
+ doResolve(1);
647
+ } else if (input === "n" || input === "d" || input === "3") {
648
+ doResolve(2);
645
649
  }
646
650
  });
647
651
  return /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [
@@ -701,11 +705,11 @@ function useSession(props) {
701
705
  setPermissionRequest({
702
706
  toolName: next.toolName,
703
707
  toolArgs: next.toolArgs,
704
- resolve: (allowed) => {
708
+ resolve: (result) => {
705
709
  permissionQueueRef.current.shift();
706
710
  processingRef.current = false;
707
711
  setPermissionRequest(null);
708
- next.resolve(allowed);
712
+ next.resolve(result);
709
713
  setTimeout(() => processNextPermission(), 0);
710
714
  }
711
715
  });
@@ -795,6 +799,26 @@ async function executeSlashCommand(cmd, parts, session, addMessage, setMessages,
795
799
  Messages: ${session.getMessageCount()}`
796
800
  });
797
801
  return true;
802
+ case "permissions": {
803
+ const mode = session.getPermissionMode();
804
+ const sessionAllowed = session.getSessionAllowedTools();
805
+ const lines = [`Permission mode: ${mode}`];
806
+ if (sessionAllowed.length > 0) {
807
+ lines.push(`Session-approved tools: ${sessionAllowed.join(", ")}`);
808
+ } else {
809
+ lines.push("No session-approved tools.");
810
+ }
811
+ addMessage({ role: "system", content: lines.join("\n") });
812
+ return true;
813
+ }
814
+ case "context": {
815
+ const ctx = session.getContextState();
816
+ addMessage({
817
+ role: "system",
818
+ content: `Context: ${ctx.usedTokens.toLocaleString()} / ${ctx.maxTokens.toLocaleString()} tokens (${Math.round(ctx.usedPercentage)}%)`
819
+ });
820
+ return true;
821
+ }
798
822
  case "exit":
799
823
  exit();
800
824
  return true;
@@ -842,8 +866,12 @@ async function runSessionPrompt(prompt, session, addMessage, clearStreamingText,
842
866
  setContextPercentage(session.getContextState().usedPercentage);
843
867
  } catch (err) {
844
868
  clearStreamingText();
845
- const errMsg = err instanceof Error ? err.message : String(err);
846
- addMessage({ role: "system", content: `Error: ${errMsg}` });
869
+ if (err instanceof DOMException && err.name === "AbortError") {
870
+ addMessage({ role: "system", content: "Cancelled." });
871
+ } else {
872
+ const errMsg = err instanceof Error ? err.message : String(err);
873
+ addMessage({ role: "system", content: `Error: ${errMsg}` });
874
+ }
847
875
  } finally {
848
876
  setIsThinking(false);
849
877
  }
@@ -927,8 +955,9 @@ function App(props) {
927
955
  useInput4(
928
956
  (_input, key) => {
929
957
  if (key.ctrl && _input === "c") exit();
958
+ if (key.escape && isThinking) session.abort();
930
959
  },
931
- { isActive: !permissionRequest && !isThinking }
960
+ { isActive: !permissionRequest }
932
961
  );
933
962
  return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", children: [
934
963
  /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", paddingX: 1, marginBottom: 1, children: [
@@ -641,7 +641,7 @@ function InputArea({ onSubmit, isDisabled, registry }) {
641
641
  var import_react4 = __toESM(require("react"), 1);
642
642
  var import_ink7 = require("ink");
643
643
  var import_jsx_runtime7 = require("react/jsx-runtime");
644
- var OPTIONS = ["Allow", "Deny"];
644
+ var OPTIONS = ["Allow", "Allow always (this session)", "Deny"];
645
645
  function formatArgs2(args) {
646
646
  const entries = Object.entries(args);
647
647
  if (entries.length === 0) return "(no arguments)";
@@ -657,10 +657,12 @@ function PermissionPrompt({ request }) {
657
657
  setSelected(0);
658
658
  }
659
659
  const doResolve = import_react4.default.useCallback(
660
- (allowed) => {
660
+ (index) => {
661
661
  if (resolvedRef.current) return;
662
662
  resolvedRef.current = true;
663
- request.resolve(allowed);
663
+ if (index === 0) request.resolve(true);
664
+ else if (index === 1) request.resolve("allow-session");
665
+ else request.resolve(false);
664
666
  },
665
667
  [request]
666
668
  );
@@ -671,11 +673,13 @@ function PermissionPrompt({ request }) {
671
673
  } else if (key.downArrow || key.rightArrow) {
672
674
  setSelected((prev) => prev < OPTIONS.length - 1 ? prev + 1 : prev);
673
675
  } else if (key.return) {
674
- doResolve(selected === 0);
675
- } else if (input === "y" || input === "a" || input === "1") {
676
- doResolve(true);
677
- } else if (input === "n" || input === "d" || input === "2") {
678
- doResolve(false);
676
+ doResolve(selected);
677
+ } else if (input === "y" || input === "1") {
678
+ doResolve(0);
679
+ } else if (input === "a" || input === "2") {
680
+ doResolve(1);
681
+ } else if (input === "n" || input === "d" || input === "3") {
682
+ doResolve(2);
679
683
  }
680
684
  });
681
685
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_ink7.Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [
@@ -735,11 +739,11 @@ function useSession(props) {
735
739
  setPermissionRequest({
736
740
  toolName: next.toolName,
737
741
  toolArgs: next.toolArgs,
738
- resolve: (allowed) => {
742
+ resolve: (result) => {
739
743
  permissionQueueRef.current.shift();
740
744
  processingRef.current = false;
741
745
  setPermissionRequest(null);
742
- next.resolve(allowed);
746
+ next.resolve(result);
743
747
  setTimeout(() => processNextPermission(), 0);
744
748
  }
745
749
  });
@@ -829,6 +833,26 @@ async function executeSlashCommand(cmd, parts, session, addMessage, setMessages,
829
833
  Messages: ${session.getMessageCount()}`
830
834
  });
831
835
  return true;
836
+ case "permissions": {
837
+ const mode = session.getPermissionMode();
838
+ const sessionAllowed = session.getSessionAllowedTools();
839
+ const lines = [`Permission mode: ${mode}`];
840
+ if (sessionAllowed.length > 0) {
841
+ lines.push(`Session-approved tools: ${sessionAllowed.join(", ")}`);
842
+ } else {
843
+ lines.push("No session-approved tools.");
844
+ }
845
+ addMessage({ role: "system", content: lines.join("\n") });
846
+ return true;
847
+ }
848
+ case "context": {
849
+ const ctx = session.getContextState();
850
+ addMessage({
851
+ role: "system",
852
+ content: `Context: ${ctx.usedTokens.toLocaleString()} / ${ctx.maxTokens.toLocaleString()} tokens (${Math.round(ctx.usedPercentage)}%)`
853
+ });
854
+ return true;
855
+ }
832
856
  case "exit":
833
857
  exit();
834
858
  return true;
@@ -876,8 +900,12 @@ async function runSessionPrompt(prompt, session, addMessage, clearStreamingText,
876
900
  setContextPercentage(session.getContextState().usedPercentage);
877
901
  } catch (err) {
878
902
  clearStreamingText();
879
- const errMsg = err instanceof Error ? err.message : String(err);
880
- addMessage({ role: "system", content: `Error: ${errMsg}` });
903
+ if (err instanceof DOMException && err.name === "AbortError") {
904
+ addMessage({ role: "system", content: "Cancelled." });
905
+ } else {
906
+ const errMsg = err instanceof Error ? err.message : String(err);
907
+ addMessage({ role: "system", content: `Error: ${errMsg}` });
908
+ }
881
909
  } finally {
882
910
  setIsThinking(false);
883
911
  }
@@ -961,8 +989,9 @@ function App(props) {
961
989
  (0, import_ink8.useInput)(
962
990
  (_input, key) => {
963
991
  if (key.ctrl && _input === "c") exit();
992
+ if (key.escape && isThinking) session.abort();
964
993
  },
965
- { isActive: !permissionRequest && !isThinking }
994
+ { isActive: !permissionRequest }
966
995
  );
967
996
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_ink8.Box, { flexDirection: "column", children: [
968
997
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_ink8.Box, { flexDirection: "column", paddingX: 1, marginBottom: 1, children: [
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  startCli
3
- } from "./chunk-C56WFH5S.js";
3
+ } from "./chunk-OH7DJXHF.js";
4
4
 
5
5
  // src/index.ts
6
6
  import { Session, SessionStore, query, TRUST_TO_MODE } from "@robota-sdk/agent-sdk";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robota-sdk/agent-cli",
3
- "version": "3.0.0-beta.1",
3
+ "version": "3.0.0-beta.2",
4
4
  "description": "AI coding assistant CLI built on Robota SDK",
5
5
  "type": "module",
6
6
  "bin": {
@@ -35,8 +35,8 @@
35
35
  "marked-terminal": "^7.3.0",
36
36
  "react": "19.2.4",
37
37
  "string-width": "^8.2.0",
38
- "@robota-sdk/agent-core": "3.0.0-beta.1",
39
- "@robota-sdk/agent-sdk": "3.0.0-beta.1"
38
+ "@robota-sdk/agent-core": "3.0.0-beta.2",
39
+ "@robota-sdk/agent-sdk": "3.0.0-beta.2"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/marked": "^6.0.0",