@phaseo/cli 0.1.1 → 0.1.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.
@@ -0,0 +1,271 @@
1
+ import { spawn } from "node:child_process";
2
+ import { chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { homedir, platform as currentPlatform } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ const SESSION_SERVICE = "phaseo-cli-session";
6
+ const SESSION_ACCOUNT = "default";
7
+ function configDir() {
8
+ return process.env.PHASEO_CONFIG_DIR || join(process.env.XDG_CONFIG_HOME || join(homedir(), ".config"), "phaseo");
9
+ }
10
+ export function configDirPath() {
11
+ return configDir();
12
+ }
13
+ export function sessionPath() {
14
+ return join(configDir(), "session.json");
15
+ }
16
+ function secureSessionPath() {
17
+ return join(configDir(), "session.secure");
18
+ }
19
+ export function preferredSessionBackend(env = process.env, platform = currentPlatform()) {
20
+ const override = env.PHASEO_SESSION_BACKEND?.trim().toLowerCase();
21
+ if (override === "file")
22
+ return "file";
23
+ if (override === "os") {
24
+ if (platform === "win32")
25
+ return "dpapi-file";
26
+ if (platform === "darwin")
27
+ return "keychain";
28
+ if (platform === "linux")
29
+ return "secret-service";
30
+ return "unavailable";
31
+ }
32
+ if (platform === "win32")
33
+ return "dpapi-file";
34
+ if (platform === "darwin")
35
+ return "keychain";
36
+ if (platform === "linux")
37
+ return "secret-service";
38
+ return "unavailable";
39
+ }
40
+ function storageError(backend, cause) {
41
+ const detail = cause instanceof Error && cause.message ? ` (${cause.message})` : "";
42
+ if (backend === "unavailable") {
43
+ return new Error("No OS-backed credential store is available on this platform. Set PHASEO_SESSION_BACKEND=file only if you explicitly accept plaintext session storage.");
44
+ }
45
+ return new Error(`Unable to store the Phaseo session in the OS credential store${detail}. Fix the credential-store service and retry. Set PHASEO_SESSION_BACKEND=file only if you explicitly accept plaintext session storage.`);
46
+ }
47
+ function parseSession(raw) {
48
+ try {
49
+ const parsed = JSON.parse(raw);
50
+ if (typeof parsed.accessToken !== "string" ||
51
+ !parsed.accessToken ||
52
+ typeof parsed.refreshToken !== "string" ||
53
+ !parsed.refreshToken ||
54
+ typeof parsed.expiresAt !== "number" ||
55
+ !Number.isFinite(parsed.expiresAt) ||
56
+ parsed.expiresAt <= 0 ||
57
+ typeof parsed.apiUrl !== "string" ||
58
+ !parsed.apiUrl)
59
+ return null;
60
+ if (parsed.scope !== undefined && typeof parsed.scope !== "string")
61
+ return null;
62
+ return parsed;
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ async function runCommand(file, args, input) {
69
+ return new Promise((resolve, reject) => {
70
+ const child = spawn(file, args, { stdio: "pipe" });
71
+ let stdout = "";
72
+ let stderr = "";
73
+ child.stdout.setEncoding("utf8");
74
+ child.stderr.setEncoding("utf8");
75
+ child.stdout.on("data", (chunk) => {
76
+ stdout += chunk;
77
+ });
78
+ child.stderr.on("data", (chunk) => {
79
+ stderr += chunk;
80
+ });
81
+ child.on("error", reject);
82
+ child.on("close", (code) => {
83
+ if (code === 0) {
84
+ resolve(stdout);
85
+ return;
86
+ }
87
+ reject(new Error(stderr.trim() || `${file} exited with code ${code}`));
88
+ });
89
+ if (typeof input === "string") {
90
+ child.stdin.write(input);
91
+ }
92
+ child.stdin.end();
93
+ });
94
+ }
95
+ async function readSessionFile() {
96
+ try {
97
+ const raw = await readFile(sessionPath(), "utf8");
98
+ return parseSession(raw);
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ async function writeSessionFile(session) {
105
+ const file = sessionPath();
106
+ await mkdir(dirname(file), { recursive: true, mode: 0o700 });
107
+ await writeFile(file, `${JSON.stringify(session, null, 2)}\n`, { mode: 0o600 });
108
+ await chmod(file, 0o600);
109
+ }
110
+ async function clearSessionFile() {
111
+ await rm(sessionPath(), { force: true }).catch(() => undefined);
112
+ }
113
+ async function readDpapiSession() {
114
+ try {
115
+ const base64 = (await readFile(secureSessionPath(), "utf8")).trim();
116
+ if (!base64)
117
+ return null;
118
+ const raw = await runCommand("powershell.exe", [
119
+ "-NoProfile",
120
+ "-NonInteractive",
121
+ "-Command",
122
+ "Add-Type -AssemblyName System.Security; $base64 = [Console]::In.ReadToEnd().Trim(); if (-not $base64) { exit 1 }; $bytes = [Convert]::FromBase64String($base64); $plain = [System.Security.Cryptography.ProtectedData]::Unprotect($bytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser); [Console]::OutputEncoding = [System.Text.Encoding]::UTF8; [Console]::Write([System.Text.Encoding]::UTF8.GetString($plain))",
123
+ ], base64);
124
+ return parseSession(raw);
125
+ }
126
+ catch {
127
+ return null;
128
+ }
129
+ }
130
+ async function writeDpapiSession(session) {
131
+ const file = secureSessionPath();
132
+ await mkdir(dirname(file), { recursive: true, mode: 0o700 });
133
+ const payload = JSON.stringify(session);
134
+ const protectedPayload = await runCommand("powershell.exe", [
135
+ "-NoProfile",
136
+ "-NonInteractive",
137
+ "-Command",
138
+ "Add-Type -AssemblyName System.Security; $text = [Console]::In.ReadToEnd(); $bytes = [System.Text.Encoding]::UTF8.GetBytes($text); $protected = [System.Security.Cryptography.ProtectedData]::Protect($bytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser); [Console]::Write([Convert]::ToBase64String($protected))",
139
+ ], payload);
140
+ await writeFile(file, `${protectedPayload.trim()}\n`, { mode: 0o600 });
141
+ await chmod(file, 0o600);
142
+ }
143
+ async function clearDpapiSession() {
144
+ await rm(secureSessionPath(), { force: true }).catch(() => undefined);
145
+ }
146
+ async function readKeychainSession() {
147
+ try {
148
+ const raw = await runCommand("security", [
149
+ "find-generic-password",
150
+ "-a",
151
+ SESSION_ACCOUNT,
152
+ "-s",
153
+ SESSION_SERVICE,
154
+ "-w",
155
+ ]);
156
+ return parseSession(raw);
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ async function writeKeychainSession(session) {
163
+ await runCommand("security", [
164
+ "add-generic-password",
165
+ "-U",
166
+ "-a",
167
+ SESSION_ACCOUNT,
168
+ "-s",
169
+ SESSION_SERVICE,
170
+ "-w",
171
+ JSON.stringify(session),
172
+ ]);
173
+ }
174
+ async function clearKeychainSession() {
175
+ await runCommand("security", [
176
+ "delete-generic-password",
177
+ "-a",
178
+ SESSION_ACCOUNT,
179
+ "-s",
180
+ SESSION_SERVICE,
181
+ ]).catch(() => undefined);
182
+ }
183
+ async function readSecretServiceSession() {
184
+ try {
185
+ const raw = await runCommand("secret-tool", [
186
+ "lookup",
187
+ "service",
188
+ SESSION_SERVICE,
189
+ "account",
190
+ SESSION_ACCOUNT,
191
+ ]);
192
+ return parseSession(raw);
193
+ }
194
+ catch {
195
+ return null;
196
+ }
197
+ }
198
+ async function writeSecretServiceSession(session) {
199
+ await runCommand("secret-tool", [
200
+ "store",
201
+ "--label=Phaseo CLI session",
202
+ "service",
203
+ SESSION_SERVICE,
204
+ "account",
205
+ SESSION_ACCOUNT,
206
+ ], JSON.stringify(session));
207
+ }
208
+ async function clearSecretServiceSession() {
209
+ await runCommand("secret-tool", [
210
+ "clear",
211
+ "service",
212
+ SESSION_SERVICE,
213
+ "account",
214
+ SESSION_ACCOUNT,
215
+ ]).catch(() => undefined);
216
+ }
217
+ export async function readSession() {
218
+ const backend = preferredSessionBackend();
219
+ if (backend === "dpapi-file") {
220
+ return readDpapiSession();
221
+ }
222
+ if (backend === "keychain") {
223
+ return readKeychainSession();
224
+ }
225
+ if (backend === "secret-service") {
226
+ return readSecretServiceSession();
227
+ }
228
+ return backend === "file" ? readSessionFile() : null;
229
+ }
230
+ export async function writeSession(session) {
231
+ const backend = preferredSessionBackend();
232
+ try {
233
+ if (backend === "dpapi-file") {
234
+ await writeDpapiSession(session);
235
+ await clearSessionFile();
236
+ return;
237
+ }
238
+ if (backend === "keychain") {
239
+ await writeKeychainSession(session);
240
+ await clearSessionFile();
241
+ return;
242
+ }
243
+ if (backend === "secret-service") {
244
+ await writeSecretServiceSession(session);
245
+ await clearSessionFile();
246
+ return;
247
+ }
248
+ if (backend === "file") {
249
+ await writeSessionFile(session);
250
+ return;
251
+ }
252
+ }
253
+ catch (error) {
254
+ throw storageError(backend, error);
255
+ }
256
+ throw storageError(backend);
257
+ }
258
+ export async function clearSession() {
259
+ const backend = preferredSessionBackend();
260
+ if (backend === "dpapi-file") {
261
+ await clearDpapiSession();
262
+ }
263
+ else if (backend === "keychain") {
264
+ await clearKeychainSession();
265
+ }
266
+ else if (backend === "secret-service") {
267
+ await clearSecretServiceSession();
268
+ }
269
+ await clearSessionFile();
270
+ }
271
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,25 +1,42 @@
1
1
  {
2
2
  "name": "@phaseo/cli",
3
- "version": "0.1.1",
4
- "description": "Phaseo command line interface transition package.",
3
+ "description": "Official Phaseo command line interface",
4
+ "version": "0.1.2",
5
5
  "type": "module",
6
+ "private": false,
6
7
  "license": "MIT",
7
8
  "bin": {
8
- "phaseo": "bin/phaseo.js",
9
- "aistats": "bin/phaseo.js"
9
+ "phaseo": "./dist/index.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
10
16
  },
11
17
  "files": [
12
- "bin",
13
- "README.md"
18
+ "dist",
19
+ "README.md",
20
+ "LICENSE"
14
21
  ],
15
- "dependencies": {
16
- "@ai-stats/cli": "0.1.1"
22
+ "dependencies": {},
23
+ "devDependencies": {
24
+ "@types/node": "^25.6.0",
25
+ "tsx": "^4.21.0",
26
+ "typescript": "^6.0.3"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
17
30
  },
18
31
  "repository": {
19
32
  "type": "git",
20
- "url": "git+https://github.com/phaseoteam/Phaseo.git"
33
+ "url": "git+https://github.com/phaseoteam/Phaseo.git",
34
+ "directory": "packages/cli/phaseo"
21
35
  },
22
- "publishConfig": {
23
- "access": "public"
36
+ "scripts": {
37
+ "sync:capabilities": "node ./scripts/sync-capabilities.mjs",
38
+ "build": "pnpm run sync:capabilities && tsc -p tsconfig.json",
39
+ "test": "pnpm run sync:capabilities && node --test --import tsx tests/*.test.ts",
40
+ "smoke:oauth-client": "node ./scripts/oauth-client-smoke.mjs"
24
41
  }
25
- }
42
+ }
package/bin/phaseo.js DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import "@ai-stats/cli";