@decido/shell-auth 4.0.1 → 4.0.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/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{create as S}from"zustand";import{persist as y,createJSONStorage as h}from"zustand/middleware";import{get as g,set as p,del as f}from"idb-keyval";import{secure as c}from"@decido/tauri-bridge";import{isTauri as u}from"@decido/tauri-bridge";var v=e=>typeof btoa>"u"?e:btoa(encodeURIComponent(e)),b=e=>{if(typeof atob>"u")return e;try{return decodeURIComponent(atob(e))}catch{return e}},d={getItem:async e=>{try{if(u()){let t=await c.secureVault.getItem(e);if(t!==null)return t}let r=await g(e);return r?b(r):null}catch(r){return console.error(`[SecureStorage] Failed to get item ${e}`,r),null}},setItem:async(e,r)=>{try{if(u()){await c.secureVault.setItem(e,r);return}let t=v(r);await p(e,t)}catch(t){console.error(`[SecureStorage] Failed to set item ${e}`,t)}},removeItem:async e=>{try{u()&&await c.secureVault.removeItem(e),await f(e)}catch(r){console.error(`[SecureStorage] Failed to remove item ${e}`,r)}}};var A=S()(y((e,r)=>({isAuthenticated:!1,userRole:null,userName:null,availableLicenses:[],activeContext:null,hasCompletedWelcome:!1,hasSeenTour:!1,login:(t,o,s)=>{let n=s||[{type:"personal",id:"personal",name:`${o}'s Private Space`}];e({isAuthenticated:!0,userRole:t,userName:o,availableLicenses:n,activeContext:n.length===1?n[0]:null})},joinSwarm:async t=>{try{let s=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"),n=decodeURIComponent(atob(s).split("").map(function(l){return"%"+("00"+l.charCodeAt(0).toString(16)).slice(-2)}).join("")),a=JSON.parse(n);if(!a.tenantId||!a.name)return!1;let i={type:a.type||"enterprise",id:a.tenantId,name:a.name,swarmKey:a.swarm_key,websocketRelayUrl:a.ws_url},{availableLicenses:m}=r();return m.find(l=>l.id===i.id)?e({activeContext:i}):e({availableLicenses:[...m,i],activeContext:i}),!0}catch(o){return console.error("Failed to join swarm from token",o),!1}},setActiveContext:t=>{let{availableLicenses:o}=r(),s=o.find(n=>n.id===t)||null;e({activeContext:s})},setHasCompletedWelcome:t=>{e({hasCompletedWelcome:t})},setHasSeenTour:t=>{e({hasSeenTour:t})},logout:()=>e({isAuthenticated:!1,userRole:null,userName:null,availableLicenses:[],activeContext:null,hasCompletedWelcome:!1,hasSeenTour:!1})}),{name:"decido-auth-storage",storage:h(()=>d)}));export{d as secureStorage,A as useAuthStore};
package/package.json CHANGED
@@ -1,19 +1,24 @@
1
1
  {
2
2
  "name": "@decido/shell-auth",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "description": "Decido OS Shell Authentication & Obfuscated Persistence Core",
5
- "main": "src/index.ts",
6
- "types": "src/index.ts",
5
+ "main": "./dist/index.js",
6
+ "types": "dist/index.d.ts",
7
7
  "directories": {
8
8
  "src": "src"
9
9
  },
10
10
  "exports": {
11
- ".": "./src/index.ts"
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.mjs",
14
+ "require": "./dist/index.js",
15
+ "default": "./dist/index.mjs"
16
+ }
12
17
  },
13
18
  "dependencies": {
14
19
  "idb-keyval": "^6.2.1",
15
20
  "zustand": "^4.5.2",
16
- "@decido/tauri-bridge": "4.0.1"
21
+ "@decido/tauri-bridge": "4.0.2"
17
22
  },
18
23
  "devDependencies": {
19
24
  "typescript": "^5.0.0"
@@ -25,8 +30,9 @@
25
30
  "files": [
26
31
  "dist"
27
32
  ],
33
+ "module": "./dist/index.mjs",
28
34
  "scripts": {
29
35
  "lint": "eslint \"src/**/*.ts*\"",
30
- "build": "tsup src/index.ts --format esm --dts --minify --clean"
36
+ "build": "tsup src/index.ts --format esm,cjs"
31
37
  }
32
38
  }
package/src/index.ts DELETED
@@ -1,131 +0,0 @@
1
- import { create } from 'zustand';
2
- import { persist, createJSONStorage } from 'zustand/middleware';
3
- import { secureStorage } from './secureStorage';
4
-
5
- export type UserRole = 'creator' | 'admin' | 'user' | 'demo' | 'developer';
6
- export type LicenseType = 'personal' | 'enterprise';
7
-
8
- export interface LicenseTarget {
9
- type: LicenseType;
10
- id: string;
11
- name: string;
12
- enabledPlugins?: string[];
13
- systemPrompt?: string;
14
- swarmKey?: string;
15
- websocketRelayUrl?: string;
16
- }
17
-
18
- export interface AuthState {
19
- isAuthenticated: boolean;
20
- userRole: UserRole | null;
21
- userName: string | null;
22
-
23
- availableLicenses: LicenseTarget[];
24
- activeContext: LicenseTarget | null;
25
- hasCompletedWelcome: boolean;
26
- hasSeenTour: boolean;
27
-
28
- login: (role: UserRole, name: string, licenses?: LicenseTarget[]) => void;
29
- joinSwarm: (token: string) => Promise<boolean>;
30
- setActiveContext: (licenseId: string) => void;
31
- setHasCompletedWelcome: (val: boolean) => void;
32
- setHasSeenTour: (val: boolean) => void;
33
- logout: () => void;
34
- }
35
-
36
- export const useAuthStore = create<AuthState>()(
37
- persist(
38
- (set, get) => ({
39
- isAuthenticated: false,
40
- userRole: null,
41
- userName: null,
42
- availableLicenses: [],
43
- activeContext: null,
44
- hasCompletedWelcome: false,
45
- hasSeenTour: false,
46
-
47
- login: (role, name, licenses) => {
48
- const defaultLicenses: LicenseTarget[] = licenses || [{
49
- type: 'personal',
50
- id: 'personal',
51
- name: `${name}'s Private Space`
52
- }];
53
-
54
- set({
55
- isAuthenticated: true,
56
- userRole: role,
57
- userName: name,
58
- availableLicenses: defaultLicenses,
59
- activeContext: defaultLicenses.length === 1 ? defaultLicenses[0] : null
60
- });
61
- },
62
-
63
- joinSwarm: async (token: string) => {
64
- try {
65
- const base64Url = token.split('.')[1];
66
- const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
67
- const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
68
- return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
69
- }).join(''));
70
-
71
- const payload = JSON.parse(jsonPayload);
72
-
73
- if (!payload.tenantId || !payload.name) return false;
74
-
75
- const newTarget: LicenseTarget = {
76
- type: payload.type || 'enterprise',
77
- id: payload.tenantId,
78
- name: payload.name,
79
- swarmKey: payload.swarm_key,
80
- websocketRelayUrl: payload.ws_url
81
- };
82
-
83
- const { availableLicenses } = get();
84
- if (!availableLicenses.find(l => l.id === newTarget.id)) {
85
- set({
86
- availableLicenses: [...availableLicenses, newTarget],
87
- activeContext: newTarget
88
- });
89
- } else {
90
- set({ activeContext: newTarget });
91
- }
92
- return true;
93
- } catch (e) {
94
- console.error("Failed to join swarm from token", e);
95
- return false;
96
- }
97
- },
98
-
99
- setActiveContext: (licenseId: string) => {
100
- const { availableLicenses } = get();
101
- const target = availableLicenses.find(l => l.id === licenseId) || null;
102
- set({ activeContext: target });
103
- },
104
-
105
- setHasCompletedWelcome: (val: boolean) => {
106
- set({ hasCompletedWelcome: val });
107
- },
108
-
109
- setHasSeenTour: (val: boolean) => {
110
- set({ hasSeenTour: val });
111
- },
112
-
113
- logout: () => set({
114
- isAuthenticated: false,
115
- userRole: null,
116
- userName: null,
117
- availableLicenses: [],
118
- activeContext: null,
119
- hasCompletedWelcome: false,
120
- hasSeenTour: false
121
- }),
122
- }),
123
- {
124
- name: 'decido-auth-storage',
125
- storage: createJSONStorage(() => secureStorage)
126
- }
127
- )
128
- );
129
-
130
- // Re-export secureStorage helper just in case it's needed externally
131
- export * from './secureStorage';