@super-one/cli 0.51.2-alpha → 0.52.0-alpha

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/MANIFEST.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@super-one/cli",
3
- "version": "0.51.2-alpha",
3
+ "version": "0.52.0-alpha",
4
4
  "kind": "npm",
5
5
  "minNodeMajor": 20,
6
- "builtAt": "2026-08-09T22:39:13.017Z"
6
+ "builtAt": "2026-08-10T10:37:56.328Z"
7
7
  }
package/lib/cli.mjs CHANGED
@@ -666,6 +666,269 @@ var init_host_action_superone_descriptors = __esm({
666
666
  "additionalProperties": false
667
667
  }
668
668
  },
669
+ {
670
+ "name": "project_list",
671
+ "description": "List SuperOne projects (id, name, path, lastActiveAt). Call this to discover projectId before session_list/session_search with projectId. Default order is last-active desc. Filter with query (name/path substring). isCurrent marks the project of the calling session.",
672
+ "inputSchema": {
673
+ "type": "object",
674
+ "properties": {
675
+ "query": {
676
+ "type": "string",
677
+ "description": "Case-insensitive substring filter on project name or path."
678
+ },
679
+ "limit": {
680
+ "type": "integer",
681
+ "minimum": 1,
682
+ "maximum": 100,
683
+ "description": "Max rows. Default 50, max 100."
684
+ },
685
+ "offset": {
686
+ "type": "integer",
687
+ "minimum": 0,
688
+ "description": "Pagination offset. Default 0."
689
+ }
690
+ },
691
+ "additionalProperties": false
692
+ }
693
+ },
694
+ {
695
+ "name": "session_list",
696
+ "description": "List SuperOne sessions (metadata only). Default: current project. Pass projectId (from project_list) for another project, or allProjects=true for every project. Rows include projectId only \u2014 use project_list for path/name. Use before session_read/session_search to find ids. Filter by title query, harness, pin/hidden, dates. Sort with order (default last_active_desc; last_active_asc oldest-first; also created_*, message_count_*, size_*). When order is size_*, rows include sizeBytes (approx character length of stored message JSON for ranking \u2014 not disk page-file bytes). Paginate with limit/offset. Not live collab or harness resume.",
697
+ "inputSchema": {
698
+ "type": "object",
699
+ "properties": {
700
+ "query": {
701
+ "type": "string",
702
+ "description": "Case-insensitive title substring filter."
703
+ },
704
+ "harness": {
705
+ "type": "string",
706
+ "enum": [
707
+ "claude",
708
+ "codex",
709
+ "acp",
710
+ "opencode"
711
+ ],
712
+ "description": "Filter by harness."
713
+ },
714
+ "includeHidden": {
715
+ "type": "boolean",
716
+ "description": "Include hidden sessions. Default false."
717
+ },
718
+ "includePinnedOnly": {
719
+ "type": "boolean",
720
+ "description": "Only pinned sessions. Default false."
721
+ },
722
+ "parentOnly": {
723
+ "type": "boolean",
724
+ "description": "Exclude collab child sessions. Default false."
725
+ },
726
+ "olderThan": {
727
+ "type": "string",
728
+ "description": "ISO timestamp \u2014 only sessions last active before this."
729
+ },
730
+ "newerThan": {
731
+ "type": "string",
732
+ "description": "ISO timestamp \u2014 only sessions last active after this."
733
+ },
734
+ "projectId": {
735
+ "type": "string",
736
+ "description": "List sessions in this SuperOne project id only (from project_list). Mutually exclusive with allProjects. Default: current project."
737
+ },
738
+ "allProjects": {
739
+ "type": "boolean",
740
+ "description": "List sessions across every SuperOne project. Mutually exclusive with projectId. Default false."
741
+ },
742
+ "order": {
743
+ "type": "string",
744
+ "enum": [
745
+ "last_active_desc",
746
+ "last_active_asc",
747
+ "created_desc",
748
+ "created_asc",
749
+ "message_count_desc",
750
+ "message_count_asc",
751
+ "size_desc",
752
+ "size_asc"
753
+ ],
754
+ "description": "Sort order. Default last_active_desc. last_active_asc = oldest first. created_* by createdAt; message_count_* by message count; size_* ranks by approx transcript size and includes sizeBytes (character length of message JSON, not disk page-file bytes)."
755
+ },
756
+ "limit": {
757
+ "type": "integer",
758
+ "minimum": 1,
759
+ "maximum": 50,
760
+ "description": "Max rows. Default 20, max 50."
761
+ },
762
+ "offset": {
763
+ "type": "integer",
764
+ "minimum": 0,
765
+ "description": "Pagination offset. Default 0."
766
+ }
767
+ },
768
+ "additionalProperties": false
769
+ }
770
+ },
771
+ {
772
+ "name": "session_search",
773
+ "description": "Search SuperOne chat transcripts by text. Default: current project; projectId (from project_list) or allProjects for cross-project. Returns matching message hits with short snippets and projectId. Then call session_read with sessionId/messageId for full content. Snippets are pointers only \u2014 not full message bodies.",
774
+ "inputSchema": {
775
+ "type": "object",
776
+ "properties": {
777
+ "query": {
778
+ "type": "string",
779
+ "minLength": 1,
780
+ "description": "Search terms (AND). Matches title and message text."
781
+ },
782
+ "harness": {
783
+ "type": "string",
784
+ "enum": [
785
+ "claude",
786
+ "codex",
787
+ "acp",
788
+ "opencode"
789
+ ]
790
+ },
791
+ "sessionIds": {
792
+ "type": "array",
793
+ "items": {
794
+ "type": "string"
795
+ },
796
+ "maxItems": 32,
797
+ "description": "Optional: restrict search to these session ids."
798
+ },
799
+ "role": {
800
+ "type": "string",
801
+ "enum": [
802
+ "user",
803
+ "assistant",
804
+ "any"
805
+ ],
806
+ "description": "Message role filter. Default any."
807
+ },
808
+ "projectId": {
809
+ "type": "string",
810
+ "description": "Search this SuperOne project id only (from project_list). Mutually exclusive with allProjects. Default: current project."
811
+ },
812
+ "allProjects": {
813
+ "type": "boolean",
814
+ "description": "Search every SuperOne project. Mutually exclusive with projectId. Default false."
815
+ },
816
+ "limit": {
817
+ "type": "integer",
818
+ "minimum": 1,
819
+ "maximum": 50,
820
+ "description": "Max hits. Default 20, max 50."
821
+ }
822
+ },
823
+ "required": [
824
+ "query"
825
+ ],
826
+ "additionalProperties": false
827
+ }
828
+ },
829
+ {
830
+ "name": "session_read",
831
+ "description": "Read any SuperOne session's saved transcript by id (any project; harness-agnostic content; does not resume provider threads). Views: meta | user | assistant | text | tools | tool_detail. user/assistant/text are pure conversation (no tool lines; assistant/text include toolCount). tools = index; tool_detail needs toolUseId. Paginate with limit/cursor; anchor with messageId/around. Prefer user then on-demand assistant/tools. meta includes projectId (use project_list for path/name).",
832
+ "inputSchema": {
833
+ "type": "object",
834
+ "properties": {
835
+ "sessionId": {
836
+ "type": "string",
837
+ "minLength": 1,
838
+ "description": "Target SuperOne session id from session_list or session_search (any project)."
839
+ },
840
+ "view": {
841
+ "type": "string",
842
+ "enum": [
843
+ "meta",
844
+ "user",
845
+ "assistant",
846
+ "text",
847
+ "tools",
848
+ "tool_detail"
849
+ ],
850
+ "description": "meta=metadata; user=user text only; assistant=assistant text + toolCount; text=both; tools=tool index; tool_detail=one tool (needs toolUseId). Default text."
851
+ },
852
+ "messageId": {
853
+ "type": "string",
854
+ "description": "Anchor page at this message id (from search or a prior read)."
855
+ },
856
+ "around": {
857
+ "type": "integer",
858
+ "minimum": 0,
859
+ "maximum": 50,
860
+ "description": "With messageId: include this many messages before and after on the global timeline."
861
+ },
862
+ "cursor": {
863
+ "type": [
864
+ "integer",
865
+ "null"
866
+ ],
867
+ "description": "Exclusive end index for the next older page (from a prior read). Omit for newest page."
868
+ },
869
+ "limit": {
870
+ "type": "integer",
871
+ "minimum": 1,
872
+ "maximum": 50,
873
+ "description": "Max messages this page. Default 20, max 50."
874
+ },
875
+ "includeThinking": {
876
+ "type": "boolean",
877
+ "description": "Include thinking blocks in text views. Default false."
878
+ },
879
+ "toolUseId": {
880
+ "type": "string",
881
+ "description": "Required for view=tool_detail."
882
+ }
883
+ },
884
+ "required": [
885
+ "sessionId"
886
+ ],
887
+ "additionalProperties": false
888
+ }
889
+ },
890
+ {
891
+ "name": "session_cleanup",
892
+ "description": "Hide, unhide, or delete SuperOne sessions by id (from session_list; ids may be from any project). hide/unhide need no confirmation. delete always opens a user confirmation dialog. Never deletes the current session; skips pinned unless includePinned. Prefer session_list to choose ids first.",
893
+ "inputSchema": {
894
+ "type": "object",
895
+ "properties": {
896
+ "action": {
897
+ "type": "string",
898
+ "enum": [
899
+ "hide",
900
+ "unhide",
901
+ "delete"
902
+ ],
903
+ "description": "hide/unhide soft-archive (no confirm). delete permanently removes after user approval dialog."
904
+ },
905
+ "sessionIds": {
906
+ "type": "array",
907
+ "items": {
908
+ "type": "string"
909
+ },
910
+ "minItems": 1,
911
+ "maxItems": 50,
912
+ "description": "Session ids from session_list to act on."
913
+ },
914
+ "includePinned": {
915
+ "type": "boolean",
916
+ "description": "Allow acting on pinned sessions. Default false (pinned are skipped)."
917
+ },
918
+ "maxDelete": {
919
+ "type": "integer",
920
+ "minimum": 1,
921
+ "maximum": 50,
922
+ "description": "Hard cap on sessions acted on. Default 50."
923
+ }
924
+ },
925
+ "required": [
926
+ "action",
927
+ "sessionIds"
928
+ ],
929
+ "additionalProperties": false
930
+ }
931
+ },
669
932
  {
670
933
  "name": "media_list_providers",
671
934
  "description": "List configured media providers that have usable credentials. Filter by image or video. Use a returned provider id with media_generate_image or media_generate_video; use kind to select the matching media manual topic. Honor returned sizing and sizeNote constraints.",
@@ -9063,6 +9326,11 @@ var init_superone_host_owned_tools = __esm({
9063
9326
  "miniapp_dev_pack",
9064
9327
  "miniapp_dev_update_types",
9065
9328
  "session_rename",
9329
+ "project_list",
9330
+ "session_list",
9331
+ "session_search",
9332
+ "session_read",
9333
+ "session_cleanup",
9066
9334
  "session_collab_list_agents",
9067
9335
  "session_collab_request",
9068
9336
  "session_collab_start",
@@ -11660,10 +11928,10 @@ var init_capability_prompt_tags = __esm({
11660
11928
  // ../../packages/shared/src/miniapp-prompt-tags.ts
11661
11929
  function stripMiniAppMarkup(text) {
11662
11930
  return stripCapabilityMarkup(
11663
- text.replace(MINIAPP_REMINDER_REGEX, "").replace(MINIAPP_TAG_REGEX, (_2, appName) => `@${String(appName).trim()}`)
11931
+ text.replace(MINIAPP_REMINDER_REGEX, "").replace(SESSION_REMINDER_REGEX, "").replace(DESKTOP_APP_REMINDER_REGEX, "").replace(MINIAPP_TAG_REGEX, (_2, appName) => `@${String(appName).trim()}`).replace(SESSION_TAG_REGEX, (_2, title) => `@${String(title).trim()}`).replace(DESKTOP_APP_TAG_REGEX, (_2, name) => `@${String(name).trim()}`)
11664
11932
  );
11665
11933
  }
11666
- var MINIAPP_TAG_REGEX, MINIAPP_REMINDER_REGEX;
11934
+ var MINIAPP_TAG_REGEX, MINIAPP_REMINDER_REGEX, SESSION_TAG_REGEX, SESSION_REMINDER_REGEX, DESKTOP_APP_TAG_REGEX, DESKTOP_APP_REMINDER_REGEX;
11667
11935
  var init_miniapp_prompt_tags = __esm({
11668
11936
  "../../packages/shared/src/miniapp-prompt-tags.ts"() {
11669
11937
  "use strict";
@@ -11671,6 +11939,10 @@ var init_miniapp_prompt_tags = __esm({
11671
11939
  init_capability_prompt_tags();
11672
11940
  MINIAPP_TAG_REGEX = /<superone-miniapp>\s*<appname>([\s\S]*?)<\/appname>\s*<appid>([\s\S]*?)<\/appid>\s*<\/superone-miniapp>/g;
11673
11941
  MINIAPP_REMINDER_REGEX = /\n*<superone-miniapp-reminder>[\s\S]*?<\/superone-miniapp-reminder>\n*/g;
11942
+ SESSION_TAG_REGEX = /<superone-session>\s*<title>([\s\S]*?)<\/title>\s*<sessionId>([\s\S]*?)<\/sessionId>\s*<\/superone-session>/g;
11943
+ SESSION_REMINDER_REGEX = /\n*<superone-session-reminder>[\s\S]*?<\/superone-session-reminder>\n*/g;
11944
+ DESKTOP_APP_TAG_REGEX = /<superone-desktop-app>\s*<name>([\s\S]*?)<\/name>\s*<bundleId>([\s\S]*?)<\/bundleId>\s*<\/superone-desktop-app>/g;
11945
+ DESKTOP_APP_REMINDER_REGEX = /\n*<superone-desktop-app-reminder>[\s\S]*?<\/superone-desktop-app-reminder>\n*/g;
11674
11946
  }
11675
11947
  });
11676
11948
 
@@ -12127,6 +12399,75 @@ function createSqliteHostActionStore(db) {
12127
12399
  }
12128
12400
  return cancelled;
12129
12401
  },
12402
+ rebindSessionController(input) {
12403
+ const now = input.now ?? Date.now();
12404
+ const to = input.toControllerClientSessionId.trim();
12405
+ if (!to) {
12406
+ throw Object.assign(new Error("toControllerClientSessionId required"), {
12407
+ code: "invalid_argument"
12408
+ });
12409
+ }
12410
+ const migrated = [];
12411
+ const cancelled = [];
12412
+ db.prepare("BEGIN IMMEDIATE").run();
12413
+ try {
12414
+ const raw = db.prepare(
12415
+ `SELECT action_id, session_id, turn_id, controller_client_session_id, tool_name, tool_group,
12416
+ args_json, replay_policy, state, version, created_at, deadline,
12417
+ claim_token_hash, claimed_at, claim_expires_at, result_json, error_json,
12418
+ response_payload_hash, finished_at
12419
+ FROM host_actions
12420
+ WHERE session_id = ? AND state IN ('pending', 'claimed')`
12421
+ ).all(input.sessionId);
12422
+ for (const r of raw) {
12423
+ const row = mapRow(r);
12424
+ if (row.controllerClientSessionId === to) continue;
12425
+ if (row.state === "claimed" && row.replayPolicy !== "safe") {
12426
+ const nextVersion2 = row.version + 1;
12427
+ const errorJson = JSON.stringify({
12428
+ code: "cancelled",
12429
+ reason: "controller_rebound_unsafe_claim"
12430
+ });
12431
+ const result2 = db.prepare(
12432
+ `UPDATE host_actions SET
12433
+ state = 'cancelled', version = ?, error_json = ?, finished_at = ?,
12434
+ claim_token_hash = NULL, claim_expires_at = NULL, claimed_at = NULL
12435
+ WHERE action_id = ? AND version = ? AND state = 'claimed'`
12436
+ ).run(nextVersion2, errorJson, now, row.actionId, row.version);
12437
+ if (result2.changes === 1) {
12438
+ const updated = load(row.actionId);
12439
+ insertChange(updated, now);
12440
+ cancelled.push(updated);
12441
+ }
12442
+ continue;
12443
+ }
12444
+ const nextVersion = row.version + 1;
12445
+ const result = db.prepare(
12446
+ `UPDATE host_actions SET
12447
+ controller_client_session_id = ?,
12448
+ state = 'pending',
12449
+ version = ?,
12450
+ claim_token_hash = NULL,
12451
+ claimed_at = NULL,
12452
+ claim_expires_at = NULL
12453
+ WHERE action_id = ? AND version = ? AND state IN ('pending', 'claimed')`
12454
+ ).run(to, nextVersion, row.actionId, row.version);
12455
+ if (result.changes === 1) {
12456
+ const updated = load(row.actionId);
12457
+ insertChange(updated, now);
12458
+ migrated.push(updated);
12459
+ }
12460
+ }
12461
+ db.prepare("COMMIT").run();
12462
+ } catch (err) {
12463
+ try {
12464
+ db.prepare("ROLLBACK").run();
12465
+ } catch {
12466
+ }
12467
+ throw err;
12468
+ }
12469
+ return { migrated, cancelled };
12470
+ },
12130
12471
  reconcileExpired(nowInput) {
12131
12472
  const now = nowInput ?? Date.now();
12132
12473
  const changed = [];
@@ -12598,6 +12939,56 @@ var init_session_runtime = __esm({
12598
12939
  this.persist(session);
12599
12940
  return this.clone(session);
12600
12941
  }
12942
+ /**
12943
+ * Move Host Action controller identity to the client that just acquired control.
12944
+ *
12945
+ * Session.create stamps controllerClientSessionId once. Normal refresh keeps the
12946
+ * same clientSessionId, but re-pair / revoke+pair issues a new id. Control lease
12947
+ * can follow the new desktop while host_actions stay addressed to the revoked
12948
+ * controller — every SuperOne MCP then times out with deadline_exceeded.
12949
+ *
12950
+ * Call this from session.acquireControl after a successful lease acquire.
12951
+ * Idempotent when the controller is already the new client.
12952
+ */
12953
+ rebindHostActionController(sessionId, controllerClientSessionId) {
12954
+ const session = this.live.get(sessionId);
12955
+ if (!session) {
12956
+ throw Object.assign(new Error("session not found"), { code: "not_found" });
12957
+ }
12958
+ if (session.closed || session.status === "ended") {
12959
+ throw Object.assign(new Error("session is closed"), { code: "failed_precondition" });
12960
+ }
12961
+ const next = typeof controllerClientSessionId === "string" ? controllerClientSessionId.trim() : "";
12962
+ if (!next) {
12963
+ throw Object.assign(new Error("controllerClientSessionId required"), {
12964
+ code: "invalid_argument"
12965
+ });
12966
+ }
12967
+ const prev = session.controllerClientSessionId;
12968
+ if (prev === next) {
12969
+ return this.clone(session);
12970
+ }
12971
+ session.controllerClientSessionId = next;
12972
+ if (session.hostActionCapabilityVersion < 1) {
12973
+ session.hostActionCapabilityVersion = HOST_ACTION_CAPABILITY_VERSION;
12974
+ }
12975
+ if (!session.hostActionToolGroups.length) {
12976
+ session.hostActionToolGroups = [...DEFAULT_HOST_ACTION_TOOL_GROUPS];
12977
+ }
12978
+ session.updatedAt = Date.now();
12979
+ this.persist(session);
12980
+ if (this.hostActions) {
12981
+ const { cancelled } = this.hostActions.rebindSessionController({
12982
+ sessionId: session.sessionId,
12983
+ toControllerClientSessionId: next
12984
+ });
12985
+ for (const row of cancelled) {
12986
+ this.settleHostActionWaiter(this.hostActions.toTerminal(row));
12987
+ }
12988
+ this.wakeHostActionPollers();
12989
+ }
12990
+ return this.clone(session);
12991
+ }
12601
12992
  /**
12602
12993
  * Patch durable per-session turn defaults.
12603
12994
  * Only keys present in `patch` are updated; null clears a stored default.
@@ -41663,6 +42054,23 @@ var init_tool_normalization = __esm({
41663
42054
  }
41664
42055
  });
41665
42056
 
42057
+ // ../../packages/shared/src/session-archive-result-shape.ts
42058
+ function isSessionArchiveToolName(toolName) {
42059
+ if (!toolName) return false;
42060
+ return /(?:^|__)(?:project_list|session_(?:list|search|read|cleanup))$/.test(toolName);
42061
+ }
42062
+ function looksLikeSessionArchiveToon(summary) {
42063
+ return /(?:^|\n)(?:projects|sessions|hits)\[\d+\]/.test(summary.trim());
42064
+ }
42065
+ function looksLikeSessionArchiveJson(obj) {
42066
+ return Array.isArray(obj.sessions) || Array.isArray(obj.hits) || Array.isArray(obj.projects) || typeof obj.action === "string" && (Array.isArray(obj.deleted) || Array.isArray(obj.affected) || Array.isArray(obj.candidates) || Array.isArray(obj.failed));
42067
+ }
42068
+ var init_session_archive_result_shape = __esm({
42069
+ "../../packages/shared/src/session-archive-result-shape.ts"() {
42070
+ "use strict";
42071
+ }
42072
+ });
42073
+
41666
42074
  // ../../packages/acp/src/tool-result-map.ts
41667
42075
  function formatAcpRawOutput(raw) {
41668
42076
  return formatAgentToolOutput(raw);
@@ -41764,11 +42172,13 @@ function looksLikeCollabResult(obj) {
41764
42172
  function shouldKeepFullToolResult(summary, toolName) {
41765
42173
  if (summary.length <= 4e3) return true;
41766
42174
  if (isCollabToolName(toolName)) return true;
42175
+ if (isSessionArchiveToolName(toolName)) return true;
42176
+ if (looksLikeSessionArchiveToon(summary)) return true;
41767
42177
  const trimmed = summary.trim();
41768
42178
  if (!trimmed.startsWith("{")) return false;
41769
42179
  try {
41770
42180
  const obj = JSON.parse(trimmed);
41771
- return typeof obj.widget_code === "string" && obj.widget_code.length > 0 || looksLikeCollabResult(obj);
42181
+ return typeof obj.widget_code === "string" && obj.widget_code.length > 0 || looksLikeCollabResult(obj) || looksLikeSessionArchiveJson(obj);
41772
42182
  } catch {
41773
42183
  return false;
41774
42184
  }
@@ -41780,6 +42190,7 @@ var init_tool_result_map = __esm({
41780
42190
  "../../packages/acp/src/tool-result-map.ts"() {
41781
42191
  "use strict";
41782
42192
  init_capability_prompt_tags();
42193
+ init_session_archive_result_shape();
41783
42194
  init_tool_ui();
41784
42195
  init_tool_normalization();
41785
42196
  }
@@ -58244,8 +58655,8 @@ import { fileURLToPath } from "node:url";
58244
58655
  function resolveCliReleaseVersion() {
58245
58656
  const fromEnv = process.env.SUPERONE_CLI_VERSION?.trim();
58246
58657
  if (fromEnv) return fromEnv;
58247
- if ("0.51.2-alpha".trim()) {
58248
- return "0.51.2-alpha".trim();
58658
+ if ("0.52.0-alpha".trim()) {
58659
+ return "0.52.0-alpha".trim();
58249
58660
  }
58250
58661
  const fromDist = readDistManifestVersion();
58251
58662
  if (fromDist) return fromDist;
@@ -63988,7 +64399,8 @@ function handleSessionCreate(payload, ctx) {
63988
64399
  harnessId,
63989
64400
  providerId,
63990
64401
  title: typeof p2.title === "string" ? p2.title : void 0,
63991
- // Pairing-level identity survives token refresh; control lease is a fence, not identity.
64402
+ // Initial HA controller = creating client. Token refresh keeps the same
64403
+ // clientSessionId; re-pair does not — acquireControl rebinds (see above).
63992
64404
  controllerClientSessionId: ctx.client.clientSessionId
63993
64405
  });
63994
64406
  if (model || effort || permissionMode || sandboxMode) {
@@ -64075,6 +64487,11 @@ function handleSessionAcquireControl(payload, ctx) {
64075
64487
  holderClientId: ctx.client.clientSessionId,
64076
64488
  ttlMs: typeof p2.ttlMs === "number" ? p2.ttlMs : void 0
64077
64489
  });
64490
+ try {
64491
+ ctx.sessions.rebindHostActionController(sessionId, ctx.client.clientSessionId);
64492
+ } catch (err) {
64493
+ if (err.code !== "not_found") throw err;
64494
+ }
64078
64495
  return { result: lease };
64079
64496
  } catch (err) {
64080
64497
  return mapThrown6(err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@super-one/cli",
3
- "version": "0.51.2-alpha",
3
+ "version": "0.52.0-alpha",
4
4
  "description": "SuperOne headless node CLI — remote execution environment (RPC, workspaces, sessions).",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",