@sendbird/cli 0.0.0-stage → 0.4.0
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/.claude-plugin/plugin.json +11 -0
- package/.codex-plugin/plugin.json +39 -0
- package/LICENSE +13 -0
- package/NOTICE.md +1105 -0
- package/PROVENANCE.md +15 -0
- package/README.md +44 -2
- package/dist/acl.d.ts +2 -0
- package/dist/acl.js +12 -0
- package/dist/acl.js.map +1 -0
- package/dist/billing-plan.d.ts +68 -0
- package/dist/billing-plan.js +235 -0
- package/dist/billing-plan.js.map +1 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +20 -0
- package/dist/browser.js.map +1 -0
- package/dist/calls-catalog.d.ts +79 -0
- package/dist/calls-catalog.js +322 -0
- package/dist/calls-catalog.js.map +1 -0
- package/dist/calls-credits.d.ts +31 -0
- package/dist/calls-credits.js +224 -0
- package/dist/calls-credits.js.map +1 -0
- package/dist/calls-trial.d.ts +45 -0
- package/dist/calls-trial.js +77 -0
- package/dist/calls-trial.js.map +1 -0
- package/dist/calls.d.ts +10 -0
- package/dist/calls.js +470 -0
- package/dist/calls.js.map +1 -0
- package/dist/catalog.d.ts +67 -0
- package/dist/catalog.js +784 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +502 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.d.ts +86 -0
- package/dist/core.js +531 -0
- package/dist/core.js.map +1 -0
- package/dist/diagnostics.d.ts +206 -0
- package/dist/diagnostics.js +664 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/discovery.d.ts +703 -0
- package/dist/discovery.js +846 -0
- package/dist/discovery.js.map +1 -0
- package/dist/docs.d.ts +31 -0
- package/dist/docs.js +139 -0
- package/dist/docs.js.map +1 -0
- package/dist/features.d.ts +131 -0
- package/dist/features.js +227 -0
- package/dist/features.js.map +1 -0
- package/dist/generated-api.d.ts +116 -0
- package/dist/generated-api.js +118 -0
- package/dist/generated-api.js.map +1 -0
- package/dist/human-format.d.ts +40 -0
- package/dist/human-format.js +205 -0
- package/dist/human-format.js.map +1 -0
- package/dist/human-list.d.ts +2 -0
- package/dist/human-list.js +368 -0
- package/dist/human-list.js.map +1 -0
- package/dist/human-output.d.ts +10 -0
- package/dist/human-output.js +1351 -0
- package/dist/human-output.js.map +1 -0
- package/dist/human-pro.d.ts +3 -0
- package/dist/human-pro.js +201 -0
- package/dist/human-pro.js.map +1 -0
- package/dist/human-progress.d.ts +5 -0
- package/dist/human-progress.js +49 -0
- package/dist/human-progress.js.map +1 -0
- package/dist/local.d.ts +42 -0
- package/dist/local.js +707 -0
- package/dist/local.js.map +1 -0
- package/dist/oauth-callback.d.ts +3 -0
- package/dist/oauth-callback.js +66 -0
- package/dist/oauth-callback.js.map +1 -0
- package/dist/oauth-lock.d.ts +6 -0
- package/dist/oauth-lock.js +212 -0
- package/dist/oauth-lock.js.map +1 -0
- package/dist/oauth.d.ts +32 -0
- package/dist/oauth.js +493 -0
- package/dist/oauth.js.map +1 -0
- package/dist/presentation.d.ts +208 -0
- package/dist/presentation.js +156 -0
- package/dist/presentation.js.map +1 -0
- package/dist/pro-api-catalog.d.ts +24 -0
- package/dist/pro-api-catalog.js +619 -0
- package/dist/pro-api-catalog.js.map +1 -0
- package/dist/pro-api.d.ts +10 -0
- package/dist/pro-api.js +338 -0
- package/dist/pro-api.js.map +1 -0
- package/dist/project.d.ts +34 -0
- package/dist/project.js +62 -0
- package/dist/project.js.map +1 -0
- package/dist/recovery.d.ts +41 -0
- package/dist/recovery.js +417 -0
- package/dist/recovery.js.map +1 -0
- package/dist/runner.d.ts +47 -0
- package/dist/runner.js +603 -0
- package/dist/runner.js.map +1 -0
- package/dist/sdk-catalog.d.ts +69 -0
- package/dist/sdk-catalog.js +527 -0
- package/dist/sdk-catalog.js.map +1 -0
- package/dist/sdk-config.d.ts +19 -0
- package/dist/sdk-config.js +85 -0
- package/dist/sdk-config.js.map +1 -0
- package/dist/sdk-dto.d.ts +244 -0
- package/dist/sdk-dto.js +98 -0
- package/dist/sdk-dto.js.map +1 -0
- package/dist/sdk-limits.d.ts +2 -0
- package/dist/sdk-limits.js +3 -0
- package/dist/sdk-limits.js.map +1 -0
- package/dist/sdk-node-file-reader.d.ts +6 -0
- package/dist/sdk-node-file-reader.js +38 -0
- package/dist/sdk-node-file-reader.js.map +1 -0
- package/dist/sdk-pro-catalog.d.ts +22 -0
- package/dist/sdk-pro-catalog.js +234 -0
- package/dist/sdk-pro-catalog.js.map +1 -0
- package/dist/sdk-pro-runtime.d.ts +31 -0
- package/dist/sdk-pro-runtime.js +293 -0
- package/dist/sdk-pro-runtime.js.map +1 -0
- package/dist/sdk-query.d.ts +10 -0
- package/dist/sdk-query.js +29 -0
- package/dist/sdk-query.js.map +1 -0
- package/dist/sdk-runtime.d.ts +15 -0
- package/dist/sdk-runtime.js +685 -0
- package/dist/sdk-runtime.js.map +1 -0
- package/dist/sdk-worker.d.ts +1 -0
- package/dist/sdk-worker.js +26 -0
- package/dist/sdk-worker.js.map +1 -0
- package/dist/sdk.d.ts +29 -0
- package/dist/sdk.js +346 -0
- package/dist/sdk.js.map +1 -0
- package/dist/search-engine.d.ts +17 -0
- package/dist/search-engine.js +54 -0
- package/dist/search-engine.js.map +1 -0
- package/dist/search-intents.d.ts +2 -0
- package/dist/search-intents.js +106 -0
- package/dist/search-intents.js.map +1 -0
- package/dist/search.d.ts +7 -0
- package/dist/search.js +58 -0
- package/dist/search.js.map +1 -0
- package/dist/secret-output.d.ts +2 -0
- package/dist/secret-output.js +108 -0
- package/dist/secret-output.js.map +1 -0
- package/dist/shell.d.ts +3 -0
- package/dist/shell.js +14 -0
- package/dist/shell.js.map +1 -0
- package/dist/skills.d.ts +210 -0
- package/dist/skills.js +374 -0
- package/dist/skills.js.map +1 -0
- package/dist/value-semantics.d.ts +70 -0
- package/dist/value-semantics.js +173 -0
- package/dist/value-semantics.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/windows.d.ts +4 -0
- package/dist/windows.js +136 -0
- package/dist/windows.js.map +1 -0
- package/dist/workflows.d.ts +228 -0
- package/dist/workflows.js +1207 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +90 -4
- package/plugin.json +25 -0
- package/references/agent-guide.json +199 -0
- package/references/commands.md +247 -0
- package/references/dashboard-inventory.json +14796 -0
- package/references/docs-index.json +5329 -0
- package/references/sdk-commands.json +15065 -0
- package/references/workflows.json +1246 -0
- package/skills/sendbird/SKILL.md +96 -0
- package/skills/sendbird/agents/openai.yaml +4 -0
- package/skills/sendbird/references/build-chat-app.md +50 -0
- package/skills/sendbird/references/client-guide.md +34 -0
- package/skills/sendbird/references/client-plugin-bridge.md +77 -0
- package/skills/sendbird/references/client-plugin-install.md +39 -0
- package/skills/sendbird/references/operational-checks.md +35 -0
- package/skills/sendbird/references/pro-capabilities.md +52 -0
- package/skills/sendbird/scripts/client-guide.mjs +283 -0
- package/skills/sendbird/scripts/client-plugin-bridge.mjs +703 -0
- package/skills/sendbird-setup/SKILL.md +18 -0
- package/skills/sendbird-setup/agents/openai.yaml +4 -0
- package/skills/sendbird-setup/references/onboarding.md +73 -0
- package/skills/sendbird-setup/scripts/install-cli.mjs +447 -0
- package/skills/sendbird-setup/scripts/npm-run.mjs +34 -0
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { MutationState, RecoverySnapshot } from "./recovery.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export declare class CliError extends Error {
|
|
4
|
+
code: string;
|
|
5
|
+
exitCode: number;
|
|
6
|
+
details?: unknown | undefined;
|
|
7
|
+
mutationState?: MutationState;
|
|
8
|
+
recoverySnapshot?: RecoverySnapshot;
|
|
9
|
+
constructor(code: string, message: string, exitCode?: number, details?: unknown | undefined);
|
|
10
|
+
}
|
|
11
|
+
export declare const origins: {
|
|
12
|
+
prod: string;
|
|
13
|
+
staging: string;
|
|
14
|
+
};
|
|
15
|
+
declare const Profile: z.ZodObject<{
|
|
16
|
+
env: z.ZodEnum<{
|
|
17
|
+
prod: "prod";
|
|
18
|
+
staging: "staging";
|
|
19
|
+
}>;
|
|
20
|
+
orgId: z.ZodOptional<z.ZodString>;
|
|
21
|
+
appId: z.ZodOptional<z.ZodString>;
|
|
22
|
+
region: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
declare const Config: z.ZodObject<{
|
|
25
|
+
active: z.ZodDefault<z.ZodString>;
|
|
26
|
+
profiles: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
27
|
+
env: z.ZodEnum<{
|
|
28
|
+
prod: "prod";
|
|
29
|
+
staging: "staging";
|
|
30
|
+
}>;
|
|
31
|
+
orgId: z.ZodOptional<z.ZodString>;
|
|
32
|
+
appId: z.ZodOptional<z.ZodString>;
|
|
33
|
+
region: z.ZodOptional<z.ZodString>;
|
|
34
|
+
}, z.core.$strip>>>;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
export type ProfileData = z.infer<typeof Profile>;
|
|
37
|
+
export declare function configDir(): string;
|
|
38
|
+
export declare function config(): {
|
|
39
|
+
active: string;
|
|
40
|
+
profiles: Record<string, {
|
|
41
|
+
env: "prod" | "staging";
|
|
42
|
+
orgId?: string | undefined;
|
|
43
|
+
appId?: string | undefined;
|
|
44
|
+
region?: string | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
};
|
|
47
|
+
export declare function saveConfig(value: z.infer<typeof Config>): void;
|
|
48
|
+
export declare function profile(name?: string): {
|
|
49
|
+
env: "prod" | "staging";
|
|
50
|
+
orgId?: string | undefined;
|
|
51
|
+
appId?: string | undefined;
|
|
52
|
+
region?: string | undefined;
|
|
53
|
+
name: string;
|
|
54
|
+
};
|
|
55
|
+
export declare function updateProfile(name: string, patch: Partial<ProfileData>): void;
|
|
56
|
+
export declare function getSecret(name: string): string | undefined;
|
|
57
|
+
export declare function setSecret(name: string, value: string): void;
|
|
58
|
+
export declare function deleteSecret(name: string): void;
|
|
59
|
+
export declare function encodeSegment(value: string): string;
|
|
60
|
+
export declare function redact(value: unknown, secrets?: string[]): unknown;
|
|
61
|
+
export declare function secretValues(value: unknown): string[];
|
|
62
|
+
export declare function writePrivate(file: string, value: unknown): void;
|
|
63
|
+
/** Reserve private output before a remote write, retaining its exact file handle. */
|
|
64
|
+
export declare function reservePrivateOutput(file: string): number;
|
|
65
|
+
export type Request = {
|
|
66
|
+
method: string;
|
|
67
|
+
path: string;
|
|
68
|
+
query?: Record<string, unknown>;
|
|
69
|
+
body?: Record<string, unknown>;
|
|
70
|
+
multipart?: boolean;
|
|
71
|
+
files?: Record<string, Blob>;
|
|
72
|
+
appId?: string;
|
|
73
|
+
allowEmpty?: boolean;
|
|
74
|
+
/** Permit an explicit JSON null, while still rejecting an empty response. */
|
|
75
|
+
allowNull?: boolean;
|
|
76
|
+
};
|
|
77
|
+
export type Transport = {
|
|
78
|
+
origin: string;
|
|
79
|
+
env: "prod" | "staging";
|
|
80
|
+
bearer?: string | (() => Promise<string>);
|
|
81
|
+
timeout?: number;
|
|
82
|
+
fetch?: typeof fetch;
|
|
83
|
+
};
|
|
84
|
+
export declare function request(t: Transport, r: Request): Promise<unknown>;
|
|
85
|
+
export declare function parse<T>(schema: z.ZodType<T>, value: unknown): T;
|
|
86
|
+
export {};
|
package/dist/core.js
ADDED
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
import { windowsCredential, windowsPrivateFile } from "./windows.js";
|
|
2
|
+
import { VERSION } from "./version.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { mkdirSync, readFileSync, writeFileSync, renameSync, chmodSync, unlinkSync, existsSync, lstatSync, fstatSync, openSync, closeSync, } from "node:fs";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { join, resolve } from "node:path";
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
8
|
+
export class CliError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
exitCode;
|
|
11
|
+
details;
|
|
12
|
+
mutationState;
|
|
13
|
+
recoverySnapshot;
|
|
14
|
+
constructor(code, message, exitCode = 1, details) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.exitCode = exitCode;
|
|
18
|
+
this.details = details;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export const origins = {
|
|
22
|
+
prod: "https://gate.sendbird.com",
|
|
23
|
+
staging: "https://gate.stg.sendbirdtest.com",
|
|
24
|
+
};
|
|
25
|
+
const Profile = z.object({
|
|
26
|
+
env: z.enum(["prod", "staging"]),
|
|
27
|
+
orgId: z.string().optional(),
|
|
28
|
+
appId: z.string().optional(),
|
|
29
|
+
region: z.string().optional(),
|
|
30
|
+
});
|
|
31
|
+
const Config = z.object({
|
|
32
|
+
active: z.string().default("prod"),
|
|
33
|
+
profiles: z.record(z.string(), Profile).default({ prod: { env: "prod" } }),
|
|
34
|
+
});
|
|
35
|
+
export function configDir() {
|
|
36
|
+
return resolve(process.env.SENDBIRD_CONFIG_DIR ?? join(homedir(), ".config", "sendbird"));
|
|
37
|
+
}
|
|
38
|
+
function safeDir() {
|
|
39
|
+
const dir = configDir();
|
|
40
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
41
|
+
if (lstatSync(dir).isSymbolicLink())
|
|
42
|
+
throw new CliError("E_CONFIG", "Config directory must not be a symlink", 2);
|
|
43
|
+
chmodSync(dir, 0o700);
|
|
44
|
+
return dir;
|
|
45
|
+
}
|
|
46
|
+
export function config() {
|
|
47
|
+
const file = join(configDir(), "config.json");
|
|
48
|
+
return Config.parse(existsSync(file) ? JSON.parse(readFileSync(file, "utf8")) : {});
|
|
49
|
+
}
|
|
50
|
+
export function saveConfig(value) {
|
|
51
|
+
const dir = safeDir();
|
|
52
|
+
const tmp = join(dir, `config.${process.pid}.tmp`);
|
|
53
|
+
writeFileSync(tmp, JSON.stringify(Config.parse(value), null, 2), {
|
|
54
|
+
mode: 0o600,
|
|
55
|
+
flag: "wx",
|
|
56
|
+
});
|
|
57
|
+
renameSync(tmp, join(dir, "config.json"));
|
|
58
|
+
}
|
|
59
|
+
export function profile(name) {
|
|
60
|
+
const c = config();
|
|
61
|
+
const key = name ?? process.env.SENDBIRD_PROFILE ?? c.active;
|
|
62
|
+
if (!Object.hasOwn(c.profiles, key))
|
|
63
|
+
throw new CliError("E_PROFILE", "Unknown profile; run sendbird profile create --name NAME --env staging", 2);
|
|
64
|
+
return { name: key, ...c.profiles[key] };
|
|
65
|
+
}
|
|
66
|
+
export function updateProfile(name, patch) {
|
|
67
|
+
const c = config();
|
|
68
|
+
c.profiles[name] = { ...c.profiles[name], ...patch };
|
|
69
|
+
saveConfig(c);
|
|
70
|
+
}
|
|
71
|
+
// Compatibility guard only: never write credentials to this path.
|
|
72
|
+
function legacySecretFile(name) {
|
|
73
|
+
return join(safeDir(), `session-${Buffer.from(name).toString("hex")}.json`);
|
|
74
|
+
}
|
|
75
|
+
const service = "com.sendbird.cli";
|
|
76
|
+
// macOS security -i parses newline-delimited commands. Quote escaping alone
|
|
77
|
+
// cannot protect an account identity containing line breaks or NUL characters.
|
|
78
|
+
function validateSecretIdentity(name) {
|
|
79
|
+
if (/[\r\n\0]/.test(name) || /[\r\n\0]/.test(configDir()))
|
|
80
|
+
throw new CliError("E_SECRET_STORE", "Credential storage requires a profile name and config path without line breaks or NUL characters", 4);
|
|
81
|
+
}
|
|
82
|
+
export function getSecret(name) {
|
|
83
|
+
validateSecretIdentity(name);
|
|
84
|
+
if (process.env.SENDBIRD_SESSION_FILE)
|
|
85
|
+
throw new CliError("E_SECRET_STORE", "SENDBIRD_SESSION_FILE is no longer supported; use browser OAuth login", 4);
|
|
86
|
+
if (process.platform === "darwin") {
|
|
87
|
+
try {
|
|
88
|
+
return execFileSync("/usr/bin/security", [
|
|
89
|
+
"find-generic-password",
|
|
90
|
+
"-s",
|
|
91
|
+
service,
|
|
92
|
+
"-a",
|
|
93
|
+
`${configDir()}:${name}`,
|
|
94
|
+
"-w",
|
|
95
|
+
], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (process.platform === "win32") {
|
|
102
|
+
try {
|
|
103
|
+
return windowsCredential("get", configDir(), name);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
throw new CliError("E_SECRET_STORE", "Windows Credential Manager is unavailable; login was not read. No local credential fallback is available", 4);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (process.platform !== "linux")
|
|
110
|
+
throw new CliError("E_SECRET_STORE", "No supported OS credential store is available", 4);
|
|
111
|
+
if (existsSync(legacySecretFile(name)))
|
|
112
|
+
throw new CliError("E_SECRET_STORE", "Legacy plaintext credentials found. Remove the old session file and log in again", 4);
|
|
113
|
+
try {
|
|
114
|
+
return (execFileSync("secret-tool", ["lookup", "service", service, "account", `${configDir()}:${name}`], {
|
|
115
|
+
encoding: "utf8",
|
|
116
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
117
|
+
}).trim() || undefined);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error.status === 1)
|
|
121
|
+
return undefined;
|
|
122
|
+
throw new CliError("E_SECRET_STORE", "Cannot use CLI login: Linux Secret Service is unavailable. Session cannot be saved; no local credential file will be used", 4);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function setSecret(name, value) {
|
|
126
|
+
validateSecretIdentity(name);
|
|
127
|
+
if (process.platform === "win32") {
|
|
128
|
+
let committed = false;
|
|
129
|
+
try {
|
|
130
|
+
windowsCredential("set", configDir(), name, value);
|
|
131
|
+
committed = true;
|
|
132
|
+
if (getSecret(name) !== value)
|
|
133
|
+
throw Error("Credential readback mismatch");
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
if (committed) {
|
|
138
|
+
try {
|
|
139
|
+
windowsCredential("delete", configDir(), name);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
/* Caller revokes the new grant. */
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
throw new CliError("E_SECRET_STORE", "Cannot save CLI login in Windows Credential Manager. Login was not saved; no local credential file was created", 4);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (process.platform === "darwin") {
|
|
149
|
+
// security interactive mode keeps the value out of process arguments.
|
|
150
|
+
if (/[\r\n\0]/.test(value))
|
|
151
|
+
throw new CliError("E_AUTH", "Invalid session", 4);
|
|
152
|
+
const quote = (s) => '"' + s.replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"';
|
|
153
|
+
try {
|
|
154
|
+
execFileSync("/usr/bin/security", ["-i"], {
|
|
155
|
+
input: `add-generic-password -U -s ${quote(service)} -a ${quote(`${configDir()}:${name}`)} -w ${quote(value)}\n`,
|
|
156
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
throw new CliError("E_SECRET_STORE", "Could not store session in Keychain", 4);
|
|
161
|
+
}
|
|
162
|
+
// Interactive security may return zero when a subcommand failed.
|
|
163
|
+
if (getSecret(name) !== value)
|
|
164
|
+
throw new CliError("E_SECRET_STORE", "Keychain write could not be verified", 4);
|
|
165
|
+
}
|
|
166
|
+
else if (process.platform === "linux") {
|
|
167
|
+
try {
|
|
168
|
+
execFileSync("secret-tool", [
|
|
169
|
+
"store",
|
|
170
|
+
"--label=Sendbird CLI",
|
|
171
|
+
"service",
|
|
172
|
+
service,
|
|
173
|
+
"account",
|
|
174
|
+
`${configDir()}:${name}`,
|
|
175
|
+
], {
|
|
176
|
+
input: value,
|
|
177
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
throw new CliError("E_SECRET_STORE", "Cannot save CLI login: Linux Secret Service is unavailable or locked. Login was not saved; no local credential file was created", 4);
|
|
182
|
+
}
|
|
183
|
+
// Older releases wrote a 0600 JSON file. Never read it again.
|
|
184
|
+
const old = legacySecretFile(name);
|
|
185
|
+
if (existsSync(old))
|
|
186
|
+
unlinkSync(old);
|
|
187
|
+
try {
|
|
188
|
+
if (getSecret(name) !== value)
|
|
189
|
+
throw Error("Keyring readback mismatch");
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
deleteSecret(name);
|
|
193
|
+
throw new CliError("E_SECRET_STORE", "Cannot verify CLI login in Linux Secret Service. The new grant will be revoked; no local credential fallback is available", 4);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
throw new CliError("E_SECRET_STORE", "No supported OS credential store is available", 4);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export function deleteSecret(name) {
|
|
201
|
+
validateSecretIdentity(name);
|
|
202
|
+
if (process.platform === "win32") {
|
|
203
|
+
try {
|
|
204
|
+
windowsCredential("delete", configDir(), name);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
throw new CliError("E_SECRET_STORE", "Cannot remove CLI login from Windows Credential Manager", 4);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (process.platform === "darwin") {
|
|
212
|
+
try {
|
|
213
|
+
execFileSync("/usr/bin/security", [
|
|
214
|
+
"delete-generic-password",
|
|
215
|
+
"-s",
|
|
216
|
+
service,
|
|
217
|
+
"-a",
|
|
218
|
+
`${configDir()}:${name}`,
|
|
219
|
+
], { stdio: "ignore" });
|
|
220
|
+
}
|
|
221
|
+
catch { }
|
|
222
|
+
}
|
|
223
|
+
else if (process.platform === "linux") {
|
|
224
|
+
try {
|
|
225
|
+
execFileSync("secret-tool", ["clear", "service", service, "account", `${configDir()}:${name}`], { stdio: "ignore" });
|
|
226
|
+
}
|
|
227
|
+
catch { }
|
|
228
|
+
const file = legacySecretFile(name);
|
|
229
|
+
if (existsSync(file))
|
|
230
|
+
unlinkSync(file);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const sensitive = /^(?:(?:(?:access|api|session|refresh|id|master|secondary)[_-]?)?token|(?:(?:current|new|old)[_-]?)?password|authorization|cookie|session|session_key|secret|client_secret|credentials|[a-z]*api[_-]?key|secret[_-]?key|access_code|apns_cert|apns_cert_password|service_account_key|private_key|huawei_app_secret|huawei_app_secret_masked|device[_-]?tokens?|push[_-]?token|bot[_-]?token|e[_-]?key)$/i;
|
|
234
|
+
export function encodeSegment(value) {
|
|
235
|
+
if (value === "." || value === "..")
|
|
236
|
+
throw new CliError("E_INPUT", "Dot path segments are not resource IDs", 2);
|
|
237
|
+
return encodeURIComponent(value).replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
238
|
+
}
|
|
239
|
+
function credentialUrl(value) {
|
|
240
|
+
if (!/^https?:\/\//i.test(value))
|
|
241
|
+
return false;
|
|
242
|
+
try {
|
|
243
|
+
const url = new URL(value);
|
|
244
|
+
return (Boolean(url.username || url.password) ||
|
|
245
|
+
[...url.searchParams].some(([key, v]) => Boolean(v) &&
|
|
246
|
+
/^(token|access_token|session_token|api_key|e_key|ekey|signature|x-amz-signature|x-amz-credential|x-amz-security-token|x-goog-signature|x-goog-credential)$/i.test(key)));
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
export function redact(value, secrets = []) {
|
|
253
|
+
if (typeof value === "string" && credentialUrl(value))
|
|
254
|
+
return "[REDACTED]";
|
|
255
|
+
if (typeof value === "string")
|
|
256
|
+
return secrets
|
|
257
|
+
.filter(Boolean)
|
|
258
|
+
.flatMap((s) => [
|
|
259
|
+
s,
|
|
260
|
+
encodeURIComponent(s),
|
|
261
|
+
encodeURIComponent(s).replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`),
|
|
262
|
+
])
|
|
263
|
+
.reduce((s, v) => s.split(v).join("[REDACTED]"), value);
|
|
264
|
+
if (Array.isArray(value))
|
|
265
|
+
return value.map((v) => redact(v, secrets));
|
|
266
|
+
if (value && typeof value === "object") {
|
|
267
|
+
// Message meta arrays encode a field name in `key`, not as an object key.
|
|
268
|
+
const pair = value;
|
|
269
|
+
const privatePair = typeof pair.key === "string" && sensitive.test(pair.key);
|
|
270
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [
|
|
271
|
+
k,
|
|
272
|
+
sensitive.test(k)
|
|
273
|
+
? "[REDACTED]"
|
|
274
|
+
: privatePair && k === "value"
|
|
275
|
+
? Array.isArray(v)
|
|
276
|
+
? v.map(() => "[REDACTED]")
|
|
277
|
+
: "[REDACTED]"
|
|
278
|
+
: redact(v, secrets),
|
|
279
|
+
]));
|
|
280
|
+
}
|
|
281
|
+
return value;
|
|
282
|
+
}
|
|
283
|
+
export function secretValues(value) {
|
|
284
|
+
if (typeof value === "string")
|
|
285
|
+
return credentialUrl(value) ? [value] : [];
|
|
286
|
+
if (!value || typeof value !== "object")
|
|
287
|
+
return [];
|
|
288
|
+
const pair = value;
|
|
289
|
+
const pairValues = typeof pair.key === "string" && sensitive.test(pair.key)
|
|
290
|
+
? Array.isArray(pair.value)
|
|
291
|
+
? pair.value.filter((v) => typeof v === "string")
|
|
292
|
+
: typeof pair.value === "string"
|
|
293
|
+
? [pair.value]
|
|
294
|
+
: []
|
|
295
|
+
: [];
|
|
296
|
+
return [
|
|
297
|
+
...pairValues,
|
|
298
|
+
...Object.entries(value).flatMap(([k, v]) => sensitive.test(k)
|
|
299
|
+
? typeof v === "string"
|
|
300
|
+
? [v]
|
|
301
|
+
: Array.isArray(v)
|
|
302
|
+
? v.flatMap((item) => typeof item === "string" ? [item] : secretValues(item))
|
|
303
|
+
: secretValues(v)
|
|
304
|
+
: secretValues(v)),
|
|
305
|
+
];
|
|
306
|
+
}
|
|
307
|
+
export function writePrivate(file, value) {
|
|
308
|
+
if (process.platform === "win32") {
|
|
309
|
+
try {
|
|
310
|
+
windowsPrivateFile(file, JSON.stringify(value, null, 2) + "\n");
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
throw new CliError("E_OUTPUT", "Cannot create a private Windows file; choose a new file in an accessible local directory", 2);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
writeFileSync(file, JSON.stringify(value, null, 2) + "\n", {
|
|
318
|
+
mode: 0o600,
|
|
319
|
+
flag: "wx",
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/** Reserve private output before a remote write, retaining its exact file handle. */
|
|
323
|
+
export function reservePrivateOutput(file) {
|
|
324
|
+
if (process.platform !== "win32")
|
|
325
|
+
return openSync(file, "wx", 0o600);
|
|
326
|
+
// POSIX mode bits do not create a private Windows DACL. Create the empty
|
|
327
|
+
// reservation with its final ACL, then verify the reopened handle's file ID.
|
|
328
|
+
const identity = windowsPrivateFile(file, "", true);
|
|
329
|
+
if (!/^\d+:\d+$/.test(identity) || BigInt(identity.split(":")[1]) === 0n)
|
|
330
|
+
throw new CliError("E_OUTPUT", "Cannot verify private Windows output", 2);
|
|
331
|
+
const [device, inode] = identity.split(":").map(BigInt);
|
|
332
|
+
let fd;
|
|
333
|
+
try {
|
|
334
|
+
fd = openSync(file, "r+");
|
|
335
|
+
const info = fstatSync(fd, { bigint: true });
|
|
336
|
+
if (!info.isFile() || info.dev !== device || info.ino !== inode)
|
|
337
|
+
throw new CliError("E_OUTPUT", "Private output changed; no mutation was sent", 2);
|
|
338
|
+
return fd;
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
try {
|
|
342
|
+
if (fd !== undefined)
|
|
343
|
+
closeSync(fd);
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
/* Preserve the original failure; no request or secret write ran. */
|
|
347
|
+
}
|
|
348
|
+
try {
|
|
349
|
+
// Never delete a different file that replaced the reservation.
|
|
350
|
+
const info = lstatSync(file, { bigint: true });
|
|
351
|
+
if (info.isFile() && info.dev === device && info.ino === inode)
|
|
352
|
+
unlinkSync(file);
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
/* Cleanup must not replace the original preflight error. */
|
|
356
|
+
}
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
export async function request(t, r) {
|
|
361
|
+
if (!r.path.startsWith("/") || r.path.startsWith("//"))
|
|
362
|
+
throw new CliError("E_PATH", "Invalid API path", 2);
|
|
363
|
+
const url = new URL(r.path, t.origin);
|
|
364
|
+
for (const [k, v] of Object.entries(r.query ?? {}))
|
|
365
|
+
if (v !== undefined)
|
|
366
|
+
url.searchParams.set(k, String(v));
|
|
367
|
+
const headers = {
|
|
368
|
+
Accept: "application/json",
|
|
369
|
+
"User-Agent": `sendbird-cli/${VERSION}`,
|
|
370
|
+
};
|
|
371
|
+
if (r.appId)
|
|
372
|
+
headers["App-Id"] = r.appId;
|
|
373
|
+
if (t.bearer) {
|
|
374
|
+
const token = typeof t.bearer === "string" ? t.bearer : await t.bearer();
|
|
375
|
+
if (!token || /[\r\n]/.test(token))
|
|
376
|
+
throw new CliError("E_AUTH", "Invalid OAuth access token", 4);
|
|
377
|
+
headers.Authorization = `Bearer ${token}`;
|
|
378
|
+
}
|
|
379
|
+
let body;
|
|
380
|
+
if (r.body) {
|
|
381
|
+
if (r.multipart) {
|
|
382
|
+
const form = new FormData();
|
|
383
|
+
for (const [k, v] of Object.entries(r.body))
|
|
384
|
+
if (v !== undefined)
|
|
385
|
+
form.append(k, typeof v === "object" && !Array.isArray(v)
|
|
386
|
+
? JSON.stringify(v)
|
|
387
|
+
: String(v));
|
|
388
|
+
for (const [key, file] of Object.entries(r.files ?? {}))
|
|
389
|
+
form.append(key, file);
|
|
390
|
+
body = form;
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
headers["Content-Type"] = "application/json";
|
|
394
|
+
body = JSON.stringify(r.body);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// No mutation retries, including network failures with unknown server outcome.
|
|
398
|
+
let response;
|
|
399
|
+
try {
|
|
400
|
+
response = await (t.fetch ?? fetch)(url, {
|
|
401
|
+
method: r.method,
|
|
402
|
+
headers,
|
|
403
|
+
body,
|
|
404
|
+
redirect: "error",
|
|
405
|
+
signal: AbortSignal.timeout(t.timeout ?? 30000),
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
throw new CliError("E_NETWORK", r.method === "GET"
|
|
410
|
+
? "Request failed or timed out"
|
|
411
|
+
: "Request failed; outcome unknown. Read the resource before retrying.", 7);
|
|
412
|
+
}
|
|
413
|
+
let raw;
|
|
414
|
+
try {
|
|
415
|
+
raw = await response.text();
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
throw new CliError("E_NETWORK", r.method === "GET"
|
|
419
|
+
? "Response interrupted"
|
|
420
|
+
: "Response interrupted; outcome unknown. Read the resource before retrying.", 7);
|
|
421
|
+
}
|
|
422
|
+
let data;
|
|
423
|
+
try {
|
|
424
|
+
data = raw ? JSON.parse(raw) : null;
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
if (response.ok)
|
|
428
|
+
throw new CliError("E_SCHEMA", "Server returned non-JSON data", 8);
|
|
429
|
+
}
|
|
430
|
+
if (!response.ok) {
|
|
431
|
+
const status = response.status;
|
|
432
|
+
const noCallsVoucher = status === 400 &&
|
|
433
|
+
r.method === "GET" &&
|
|
434
|
+
/^\/dashboard_api\/(?:organizations\/[^/]+\/voice_video_usage|applications\/[^/]+\/voice_video_usage_with_org_usages)\/?$/.test(r.path) &&
|
|
435
|
+
data !== null &&
|
|
436
|
+
typeof data === "object" &&
|
|
437
|
+
"detail" in data &&
|
|
438
|
+
["No voucher found", "No voucher data found."].includes(String(data.detail));
|
|
439
|
+
if (noCallsVoucher)
|
|
440
|
+
throw new CliError("E_CALLS_NO_VOUCHER", "Current Calls voucher summary is unavailable; inspect calls credits list for status and expiry. An upstream lookup failure can also cause this response", 3, { status, request_id: response.headers.get("x-request-id") });
|
|
441
|
+
// Gate can include an application in a list while its detail endpoint
|
|
442
|
+
// reports that the application no longer exists. Keep this distinct from
|
|
443
|
+
// malformed requests so callers can skip only that stale list entry.
|
|
444
|
+
const missingApplication = status === 400 &&
|
|
445
|
+
r.method === "GET" &&
|
|
446
|
+
/^\/dashboard\/applications\/[^/]+\/get_detail\/$/.test(r.path) &&
|
|
447
|
+
data !== null &&
|
|
448
|
+
typeof data === "object" &&
|
|
449
|
+
"message" in data &&
|
|
450
|
+
data.message === "Application does not exist.";
|
|
451
|
+
const originatingSessionLoggedOut = status === 403 &&
|
|
452
|
+
data !== null &&
|
|
453
|
+
typeof data === "object" &&
|
|
454
|
+
"detail" in data &&
|
|
455
|
+
data.detail === "Originating session was logged out.";
|
|
456
|
+
const callsRegionUnavailable = status === 400 &&
|
|
457
|
+
/^\/dashboard_api\/v2oip\//.test(r.path) &&
|
|
458
|
+
data !== null &&
|
|
459
|
+
typeof data === "object" &&
|
|
460
|
+
"message" in data &&
|
|
461
|
+
data.message === "Calls service is not available for this region.";
|
|
462
|
+
const upstreamCode = data &&
|
|
463
|
+
typeof data === "object" &&
|
|
464
|
+
"code" in data &&
|
|
465
|
+
typeof data.code === "number"
|
|
466
|
+
? data.code
|
|
467
|
+
: undefined;
|
|
468
|
+
// 400108 is contextual, not a universal 'feature unavailable' code.
|
|
469
|
+
// Do not expose the upstream message, which can contain private input.
|
|
470
|
+
const supergroupDenied = status === 400 &&
|
|
471
|
+
upstreamCode === 400108 &&
|
|
472
|
+
r.method === "POST" &&
|
|
473
|
+
/^\/platform\/v3\/supergroup_channels\/?$/.test(r.path);
|
|
474
|
+
const code = originatingSessionLoggedOut
|
|
475
|
+
? "E_AUTH"
|
|
476
|
+
: callsRegionUnavailable
|
|
477
|
+
? "E_CAPABILITY"
|
|
478
|
+
: upstreamCode === 400201 || missingApplication
|
|
479
|
+
? "E_NOT_FOUND"
|
|
480
|
+
: status === 400
|
|
481
|
+
? "E_VALIDATION"
|
|
482
|
+
: status === 401
|
|
483
|
+
? "E_AUTH"
|
|
484
|
+
: status === 403
|
|
485
|
+
? "E_PERMISSION"
|
|
486
|
+
: status === 404
|
|
487
|
+
? "E_NOT_FOUND"
|
|
488
|
+
: status === 409
|
|
489
|
+
? "E_CONFLICT"
|
|
490
|
+
: status === 429
|
|
491
|
+
? "E_RATE_LIMIT"
|
|
492
|
+
: "E_UPSTREAM";
|
|
493
|
+
throw new CliError(code, originatingSessionLoggedOut
|
|
494
|
+
? "The Dashboard session that approved CLI access was logged out; log in again"
|
|
495
|
+
: callsRegionUnavailable
|
|
496
|
+
? "Calls service is unavailable for this application region; choose an authorized Calls-supported test app"
|
|
497
|
+
: supergroupDenied
|
|
498
|
+
? "Supergroup creation was rejected (400108). Check this app's plan/feature eligibility and caller permissions with doctor; the code alone does not identify which condition failed."
|
|
499
|
+
: `API request failed (${status})`, callsRegionUnavailable
|
|
500
|
+
? 5
|
|
501
|
+
: upstreamCode === 400201 || missingApplication || status === 404
|
|
502
|
+
? 3
|
|
503
|
+
: status === 400
|
|
504
|
+
? 2
|
|
505
|
+
: status === 401 || status === 403
|
|
506
|
+
? 4
|
|
507
|
+
: status === 409
|
|
508
|
+
? 5
|
|
509
|
+
: status === 429
|
|
510
|
+
? 6
|
|
511
|
+
: 8, {
|
|
512
|
+
status,
|
|
513
|
+
upstream_code: upstreamCode,
|
|
514
|
+
...(callsRegionUnavailable
|
|
515
|
+
? { reason: "calls_region_unavailable" }
|
|
516
|
+
: {}),
|
|
517
|
+
request_id: response.headers.get("x-request-id"),
|
|
518
|
+
retry_after: response.headers.get("retry-after"),
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
if (data === null && !r.allowEmpty && !(r.allowNull && raw.trim() === "null"))
|
|
522
|
+
throw new CliError("E_SCHEMA", "Expected a JSON response", 8);
|
|
523
|
+
return data;
|
|
524
|
+
}
|
|
525
|
+
export function parse(schema, value) {
|
|
526
|
+
const p = schema.safeParse(value);
|
|
527
|
+
if (!p.success)
|
|
528
|
+
throw new CliError("E_VALIDATION", "Invalid command input", 2, p.error.issues.map((i) => ({ path: i.path, message: i.message })));
|
|
529
|
+
return p.data;
|
|
530
|
+
}
|
|
531
|
+
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|