@numa-tech/numa 1.14.7 → 1.14.8

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.
Files changed (38) hide show
  1. package/README.md +20 -29
  2. package/dist/chatgpt-desktop.d.ts +4 -29
  3. package/dist/chatgpt-desktop.js +18 -376
  4. package/dist/chatgpt-desktop.js.map +1 -1
  5. package/dist/cli.js +20 -7
  6. package/dist/cli.js.map +1 -1
  7. package/dist/codex-module.js +2 -6
  8. package/dist/codex-module.js.map +1 -1
  9. package/dist/command-catalog.js +126 -6
  10. package/dist/command-catalog.js.map +1 -1
  11. package/dist/integration-bootstrap/client.d.ts +31 -4
  12. package/dist/integration-bootstrap/client.js +161 -35
  13. package/dist/integration-bootstrap/client.js.map +1 -1
  14. package/dist/integration-bootstrap/commands.d.ts +28 -5
  15. package/dist/integration-bootstrap/commands.js +399 -47
  16. package/dist/integration-bootstrap/commands.js.map +1 -1
  17. package/dist/integration-bootstrap/schemas.d.ts +408 -43
  18. package/dist/integration-bootstrap/schemas.js +373 -93
  19. package/dist/integration-bootstrap/schemas.js.map +1 -1
  20. package/dist/teams/client.d.ts +119 -0
  21. package/dist/teams/client.js +177 -0
  22. package/dist/teams/client.js.map +1 -0
  23. package/dist/teams/commands.d.ts +6 -0
  24. package/dist/teams/commands.js +190 -0
  25. package/dist/teams/commands.js.map +1 -0
  26. package/dist/teams/errors.d.ts +10 -0
  27. package/dist/teams/errors.js +56 -0
  28. package/dist/teams/errors.js.map +1 -0
  29. package/dist/teams/schemas.d.ts +171 -0
  30. package/dist/teams/schemas.js +81 -0
  31. package/dist/teams/schemas.js.map +1 -0
  32. package/package.json +4 -4
  33. package/skills/numa-cli/SKILL.md +2 -1
  34. package/skills/numa-cli/references/pipeline-release.md +2 -0
  35. package/skills/numa-local-flux-deploy/SKILL.md +24 -0
  36. package/skills/numa-local-flux-deploy/agents/openai.yaml +4 -0
  37. package/skills/numa-local-flux-deploy/evals/evals.json +35 -0
  38. package/skills/numa-local-flux-deploy/references/local-flux-release.md +172 -0
@@ -0,0 +1,119 @@
1
+ import type { AuthConfig } from "../config.js";
2
+ import { type KeycloakTokenProvider } from "../oauth.js";
3
+ import { type CreateTeamRequest, type SaveTeamMemberRequest, type UpdateTeamRequest } from "./schemas.js";
4
+ export declare const TEAM_ADMIN_API_ROOT = "/api/v1/admin/teams";
5
+ export interface TeamClientDependencies {
6
+ fetch?: typeof fetch;
7
+ tokenProvider?: KeycloakTokenProvider;
8
+ }
9
+ export interface TeamListOptions {
10
+ search?: string;
11
+ status?: string;
12
+ page?: number;
13
+ size?: number;
14
+ }
15
+ export declare class TeamClient {
16
+ private readonly config;
17
+ private readonly fetchImpl;
18
+ private readonly tokenProvider;
19
+ constructor(config: AuthConfig, dependencies?: TeamClientDependencies);
20
+ private authenticatedFetch;
21
+ private json;
22
+ private mutation;
23
+ listTeams(options?: TeamListOptions): Promise<{
24
+ items: {
25
+ id: string;
26
+ code: string;
27
+ name: string;
28
+ description?: string | null | undefined;
29
+ ownerUsername?: string | null | undefined;
30
+ status: "ACTIVE" | "ARCHIVED";
31
+ version: number;
32
+ activeMemberCount: number;
33
+ createdDate?: string | null | undefined;
34
+ lastModifiedDate?: string | null | undefined;
35
+ }[];
36
+ total: number;
37
+ page: number;
38
+ size: number;
39
+ }>;
40
+ listUsers(options?: TeamListOptions): Promise<{
41
+ items: {
42
+ id: string;
43
+ username: string;
44
+ displayName?: string | null | undefined;
45
+ email?: string | null | undefined;
46
+ status: "ACTIVE" | "ARCHIVED" | "DISABLED" | "INACTIVE";
47
+ createdDate?: string | null | undefined;
48
+ lastModifiedDate?: string | null | undefined;
49
+ }[];
50
+ total: number;
51
+ page: number;
52
+ size: number;
53
+ }>;
54
+ getTeam(teamId: string): Promise<{
55
+ id: string;
56
+ code: string;
57
+ name: string;
58
+ description?: string | null | undefined;
59
+ ownerUsername?: string | null | undefined;
60
+ status: "ACTIVE" | "ARCHIVED";
61
+ version: number;
62
+ activeMemberCount: number;
63
+ createdDate?: string | null | undefined;
64
+ lastModifiedDate?: string | null | undefined;
65
+ }>;
66
+ createTeam(input: CreateTeamRequest, key: string): Promise<{
67
+ id: string;
68
+ code: string;
69
+ name: string;
70
+ description?: string | null | undefined;
71
+ ownerUsername?: string | null | undefined;
72
+ status: "ACTIVE" | "ARCHIVED";
73
+ version: number;
74
+ activeMemberCount: number;
75
+ createdDate?: string | null | undefined;
76
+ lastModifiedDate?: string | null | undefined;
77
+ }>;
78
+ updateTeam(teamId: string, input: UpdateTeamRequest, key: string): Promise<{
79
+ id: string;
80
+ code: string;
81
+ name: string;
82
+ description?: string | null | undefined;
83
+ ownerUsername?: string | null | undefined;
84
+ status: "ACTIVE" | "ARCHIVED";
85
+ version: number;
86
+ activeMemberCount: number;
87
+ createdDate?: string | null | undefined;
88
+ lastModifiedDate?: string | null | undefined;
89
+ }>;
90
+ listMembers(teamId: string): Promise<{
91
+ membershipId: string;
92
+ teamId: string;
93
+ userId: string;
94
+ username: string;
95
+ displayName?: string | null | undefined;
96
+ email?: string | null | undefined;
97
+ keycloakSubject?: string | null | undefined;
98
+ role: "ADMIN" | "MAINTAINER" | "MEMBER" | "OWNER" | "VIEWER";
99
+ status: "ACTIVE" | "INACTIVE";
100
+ addedBy?: string | null | undefined;
101
+ createdDate?: string | null | undefined;
102
+ lastModifiedDate?: string | null | undefined;
103
+ }[]>;
104
+ saveMember(teamId: string, input: SaveTeamMemberRequest, key: string): Promise<{
105
+ membershipId: string;
106
+ teamId: string;
107
+ userId: string;
108
+ username: string;
109
+ displayName?: string | null | undefined;
110
+ email?: string | null | undefined;
111
+ keycloakSubject?: string | null | undefined;
112
+ role: "ADMIN" | "MAINTAINER" | "MEMBER" | "OWNER" | "VIEWER";
113
+ status: "ACTIVE" | "INACTIVE";
114
+ addedBy?: string | null | undefined;
115
+ createdDate?: string | null | undefined;
116
+ lastModifiedDate?: string | null | undefined;
117
+ }>;
118
+ removeMember(teamId: string, userId: string, key: string): Promise<void>;
119
+ }
@@ -0,0 +1,177 @@
1
+ import { resolveBackendUrl } from "../backend.js";
2
+ import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
3
+ import { TeamError } from "./errors.js";
4
+ import { CreateTeamRequestSchema, PlatformUserPageSchema, SaveTeamMemberRequestSchema, TeamApiErrorSchema, TeamMemberListSchema, TeamMemberViewSchema, TeamPageSchema, TeamViewSchema, UpdateTeamRequestSchema } from "./schemas.js";
5
+ export const TEAM_ADMIN_API_ROOT = "/api/v1/admin/teams";
6
+ function positiveId(value, label) {
7
+ const trimmed = value.trim();
8
+ if (!/^[1-9]\d*$/u.test(trimmed)) {
9
+ throw new TeamError(`${label} must be a positive platform ID.`, "TEAM_INPUT_INVALID");
10
+ }
11
+ return trimmed;
12
+ }
13
+ function idempotencyKey(value) {
14
+ const trimmed = value.trim();
15
+ if (!trimmed || trimmed.length > 200 || !/^[A-Za-z0-9][A-Za-z0-9._:/+-]*$/u.test(trimmed)) {
16
+ throw new TeamError("idempotency-key must be 1-200 safe opaque characters.", "TEAM_IDEMPOTENCY_INVALID");
17
+ }
18
+ return trimmed;
19
+ }
20
+ function pageValue(value, label, maximum) {
21
+ if (value == null)
22
+ return undefined;
23
+ if (!Number.isInteger(value) || value < 1 || value > maximum) {
24
+ throw new TeamError(`${label} must be an integer between 1 and ${maximum}.`, "TEAM_INPUT_INVALID");
25
+ }
26
+ return value;
27
+ }
28
+ function queryPath(path, values) {
29
+ const query = new URLSearchParams();
30
+ for (const [key, value] of Object.entries(values)) {
31
+ if (value != null && value !== "")
32
+ query.set(key, String(value));
33
+ }
34
+ return query.size ? `${path}?${query.toString()}` : path;
35
+ }
36
+ async function responseBody(response) {
37
+ const text = await response.text();
38
+ if (Buffer.byteLength(text) > 1024 * 1024) {
39
+ throw new TeamError("Team API response exceeds the 1 MiB safety limit.", "TEAM_INVALID_RESPONSE", response.status);
40
+ }
41
+ if (!text)
42
+ return {};
43
+ try {
44
+ return JSON.parse(text);
45
+ }
46
+ catch {
47
+ return text;
48
+ }
49
+ }
50
+ function requestIdFrom(response, body) {
51
+ if (body && typeof body === "object" && "requestId" in body && typeof body.requestId === "string")
52
+ return body.requestId;
53
+ return response.headers.get("x-request-id") ?? undefined;
54
+ }
55
+ function apiFailure(response, body) {
56
+ const parsed = TeamApiErrorSchema.safeParse(body);
57
+ const message = parsed.success
58
+ ? parsed.data.message ?? parsed.data.detail
59
+ : typeof body === "string" ? body : undefined;
60
+ return new TeamError(message ? `Team API HTTP ${response.status}: ${message}` : `Team API request failed with HTTP ${response.status}.`, parsed.success ? parsed.data.code ?? "TEAM_API_ERROR" : "TEAM_API_ERROR", response.status, requestIdFrom(response, body), parsed.success ? parsed.data.details : undefined);
61
+ }
62
+ function resultUnknown(error) {
63
+ if (error instanceof TeamError)
64
+ return [502, 503, 504].includes(error.status ?? 0);
65
+ return error instanceof TypeError || (error instanceof Error && error.name === "AbortError");
66
+ }
67
+ export class TeamClient {
68
+ config;
69
+ fetchImpl;
70
+ tokenProvider;
71
+ constructor(config, dependencies = {}) {
72
+ this.config = config;
73
+ this.fetchImpl = dependencies.fetch ?? fetch;
74
+ this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
75
+ }
76
+ async authenticatedFetch(path, init = {}) {
77
+ const method = String(init.method ?? "GET").toUpperCase();
78
+ const url = resolveBackendUrl(this.config, { method, path });
79
+ const headers = new Headers(init.headers);
80
+ headers.set("Accept", "application/json");
81
+ if (init.body != null)
82
+ headers.set("Content-Type", "application/json");
83
+ return fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), {
84
+ fetch: this.fetchImpl,
85
+ tokenProvider: this.tokenProvider
86
+ });
87
+ }
88
+ async json(path, schema, init = {}, expectedStatuses = [200]) {
89
+ const response = await this.authenticatedFetch(path, init);
90
+ const body = await responseBody(response);
91
+ if (!response.ok)
92
+ throw apiFailure(response, body);
93
+ if (!expectedStatuses.includes(response.status)) {
94
+ throw new TeamError(`Team API returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "TEAM_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
95
+ }
96
+ const parsed = schema.safeParse(body);
97
+ if (!parsed.success) {
98
+ throw new TeamError(`Team API returned an invalid response: ${parsed.error.message}`, "TEAM_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
99
+ }
100
+ return parsed.data;
101
+ }
102
+ async mutation(path, method, schema, body, key, expectedStatuses) {
103
+ const stableKey = idempotencyKey(key);
104
+ try {
105
+ return await this.json(path, schema, {
106
+ method,
107
+ headers: { "Idempotency-Key": stableKey },
108
+ body: JSON.stringify(body)
109
+ }, expectedStatuses);
110
+ }
111
+ catch (error) {
112
+ if (!resultUnknown(error))
113
+ throw error;
114
+ throw new TeamError("Team mutation result is unknown. Inspect current team state before retrying with the same Idempotency-Key and unchanged input.", "TEAM_RESULT_UNKNOWN", error instanceof TeamError ? error.status : undefined, error instanceof TeamError ? error.requestId : undefined);
115
+ }
116
+ }
117
+ listTeams(options = {}) {
118
+ return this.json(queryPath(TEAM_ADMIN_API_ROOT, {
119
+ search: options.search?.trim(), status: options.status,
120
+ page: pageValue(options.page, "page", 1_000_000),
121
+ size: pageValue(options.size, "size", 100)
122
+ }), TeamPageSchema);
123
+ }
124
+ listUsers(options = {}) {
125
+ return this.json(queryPath(`${TEAM_ADMIN_API_ROOT}/users`, {
126
+ search: options.search?.trim(), status: options.status,
127
+ page: pageValue(options.page, "page", 1_000_000),
128
+ size: pageValue(options.size, "size", 100)
129
+ }), PlatformUserPageSchema);
130
+ }
131
+ getTeam(teamId) {
132
+ return this.json(`${TEAM_ADMIN_API_ROOT}/${positiveId(teamId, "team-id")}`, TeamViewSchema);
133
+ }
134
+ createTeam(input, key) {
135
+ const parsed = CreateTeamRequestSchema.safeParse(input);
136
+ if (!parsed.success)
137
+ throw new TeamError(`Team input is invalid: ${parsed.error.message}`, "TEAM_INPUT_INVALID");
138
+ return this.mutation(TEAM_ADMIN_API_ROOT, "POST", TeamViewSchema, parsed.data, key, [201]);
139
+ }
140
+ updateTeam(teamId, input, key) {
141
+ const parsed = UpdateTeamRequestSchema.safeParse(input);
142
+ if (!parsed.success)
143
+ throw new TeamError(`Team update is invalid: ${parsed.error.message}`, "TEAM_INPUT_INVALID");
144
+ return this.mutation(`${TEAM_ADMIN_API_ROOT}/${positiveId(teamId, "team-id")}`, "PUT", TeamViewSchema, parsed.data, key, [200]);
145
+ }
146
+ listMembers(teamId) {
147
+ return this.json(`${TEAM_ADMIN_API_ROOT}/${positiveId(teamId, "team-id")}/members`, TeamMemberListSchema);
148
+ }
149
+ saveMember(teamId, input, key) {
150
+ const parsed = SaveTeamMemberRequestSchema.safeParse(input);
151
+ if (!parsed.success)
152
+ throw new TeamError(`Team member input is invalid: ${parsed.error.message}`, "TEAM_INPUT_INVALID");
153
+ return this.mutation(`${TEAM_ADMIN_API_ROOT}/${positiveId(teamId, "team-id")}/members`, "PUT", TeamMemberViewSchema, parsed.data, key, [200]);
154
+ }
155
+ async removeMember(teamId, userId, key) {
156
+ const stableKey = idempotencyKey(key);
157
+ const path = `${TEAM_ADMIN_API_ROOT}/${positiveId(teamId, "team-id")}/members/${positiveId(userId, "user-id")}`;
158
+ try {
159
+ const response = await this.authenticatedFetch(path, {
160
+ method: "DELETE",
161
+ headers: { "Idempotency-Key": stableKey }
162
+ });
163
+ const body = await responseBody(response);
164
+ if (!response.ok)
165
+ throw apiFailure(response, body);
166
+ if (response.status !== 204) {
167
+ throw new TeamError(`Team API returned HTTP ${response.status}; expected 204.`, "TEAM_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
168
+ }
169
+ }
170
+ catch (error) {
171
+ if (!resultUnknown(error))
172
+ throw error;
173
+ throw new TeamError("Team member removal result is unknown. Inspect the member list before retrying with the same Idempotency-Key.", "TEAM_RESULT_UNKNOWN", error instanceof TeamError ? error.status : undefined, error instanceof TeamError ? error.requestId : undefined);
174
+ }
175
+ }
176
+ }
177
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/teams/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Command } from "commander";
2
+ import { TeamClient } from "./client.js";
3
+ export interface TeamCommandDependencies {
4
+ clientFactory?: () => TeamClient;
5
+ }
6
+ export declare function registerTeamCommands(program: Command, dependencies?: TeamCommandDependencies): void;
@@ -0,0 +1,190 @@
1
+ import process from "node:process";
2
+ import { loadAppConfig } from "../app-config.js";
3
+ import { loadConfig } from "../config.js";
4
+ import { TeamClient } from "./client.js";
5
+ import { TeamError, sanitizeTeamOutput } from "./errors.js";
6
+ function snakeCase(key) {
7
+ return key.replace(/([a-z0-9])([A-Z])/gu, "$1_$2").toLowerCase();
8
+ }
9
+ function stableOutput(value) {
10
+ const safe = sanitizeTeamOutput(value);
11
+ if (Array.isArray(safe))
12
+ return safe.map(stableOutput);
13
+ if (safe && typeof safe === "object") {
14
+ return Object.fromEntries(Object.entries(safe).map(([key, item]) => [snakeCase(key), stableOutput(item)]));
15
+ }
16
+ return safe;
17
+ }
18
+ async function output(command, payload, textValue) {
19
+ const config = await loadAppConfig();
20
+ const json = Boolean(command.optsWithGlobals().json || config.output === "json");
21
+ process.stdout.write(json
22
+ ? `${JSON.stringify(stableOutput(payload), null, 2)}\n`
23
+ : `${String(sanitizeTeamOutput(textValue))}\n`);
24
+ }
25
+ function addExamples(command, examples) {
26
+ return command.addHelpText("after", `\nExamples:\n${examples.map((item) => ` ${item}`).join("\n")}\n`);
27
+ }
28
+ function requireYes(value) {
29
+ if (!value)
30
+ throw new TeamError("Mutation requires --yes after reviewing the target and input.", "TEAM_CONFIRMATION_REQUIRED");
31
+ }
32
+ function positiveInteger(value, label, minimum = 1, maximum = Number.MAX_SAFE_INTEGER) {
33
+ const parsed = Number(value);
34
+ if (value == null || !Number.isSafeInteger(parsed) || parsed < minimum || parsed > maximum) {
35
+ throw new TeamError(`${label} must be an integer between ${minimum} and ${maximum}.`, "TEAM_INPUT_INVALID");
36
+ }
37
+ return parsed;
38
+ }
39
+ function optionalInteger(value, label, maximum) {
40
+ return value == null ? undefined : positiveInteger(value, label, 1, maximum);
41
+ }
42
+ function nonnegativeInteger(value, label) {
43
+ const parsed = Number(value);
44
+ if (value == null || !Number.isSafeInteger(parsed) || parsed < 0) {
45
+ throw new TeamError(`${label} must be a non-negative integer.`, "TEAM_INPUT_INVALID");
46
+ }
47
+ return parsed;
48
+ }
49
+ function status(value) {
50
+ if (value == null)
51
+ return undefined;
52
+ const normalized = value.trim().toUpperCase();
53
+ if (normalized !== "ACTIVE" && normalized !== "ARCHIVED") {
54
+ throw new TeamError("status must be active or archived.", "TEAM_INPUT_INVALID");
55
+ }
56
+ return normalized;
57
+ }
58
+ function userStatus(value) {
59
+ if (value == null)
60
+ return undefined;
61
+ const normalized = value.trim().toUpperCase();
62
+ if (!["ACTIVE", "ARCHIVED", "INACTIVE", "DISABLED"].includes(normalized)) {
63
+ throw new TeamError("status must be active, archived, inactive, or disabled.", "TEAM_INPUT_INVALID");
64
+ }
65
+ return normalized;
66
+ }
67
+ function role(value) {
68
+ const normalized = value.trim().toUpperCase();
69
+ if (!["OWNER", "ADMIN", "MAINTAINER", "MEMBER", "VIEWER"].includes(normalized)) {
70
+ throw new TeamError("role must be owner, admin, maintainer, member, or viewer.", "TEAM_INPUT_INVALID");
71
+ }
72
+ return normalized;
73
+ }
74
+ function teamLine(team) {
75
+ return `${team.id}\t${team.code}\t${team.name}\t${team.status}\tv${team.version}\t${team.activeMemberCount} member(s)`;
76
+ }
77
+ export function registerTeamCommands(program, dependencies = {}) {
78
+ const client = () => dependencies.clientFactory?.() ?? new TeamClient(loadConfig());
79
+ const team = program.command("team").description("管理平台 Team、可选用户和成员关系(服务端要求 ops-admin)");
80
+ addExamples(team.command("list").description("列出 Team")
81
+ .option("--search <text>", "按 code/name 搜索")
82
+ .option("--status <status>", "active 或 archived")
83
+ .option("--page <number>", "页码")
84
+ .option("--size <number>", "每页 1-100")
85
+ .action(async (options, command) => {
86
+ const result = await client().listTeams({
87
+ search: options.search,
88
+ status: status(options.status),
89
+ page: optionalInteger(options.page, "page", 1_000_000),
90
+ size: optionalInteger(options.size, "size", 100)
91
+ });
92
+ await output(command, result, result.items.map(teamLine).join("\n") || "No teams found.");
93
+ }), ["numa team list --status active --json"]);
94
+ addExamples(team.command("get <team-id>").description("查看 Team 详情")
95
+ .action(async (teamId, _options, command) => {
96
+ const result = await client().getTeam(teamId);
97
+ await output(command, result, teamLine(result));
98
+ }), ["numa team get 41 --json"]);
99
+ addExamples(team.command("users").description("列出可作为 Team 成员的平台用户")
100
+ .option("--search <text>", "按用户名、姓名或邮箱搜索")
101
+ .option("--status <status>", "用户状态")
102
+ .option("--page <number>", "页码")
103
+ .option("--size <number>", "每页 1-100")
104
+ .action(async (options, command) => {
105
+ const result = await client().listUsers({
106
+ search: options.search,
107
+ status: userStatus(options.status),
108
+ page: optionalInteger(options.page, "page", 1_000_000),
109
+ size: optionalInteger(options.size, "size", 100)
110
+ });
111
+ const lines = result.items.map((item) => `${item.id}\t${item.username}\t${item.displayName ?? "-"}\t${item.status}`);
112
+ await output(command, result, lines.join("\n") || "No users found.");
113
+ }), ["numa team users --search chang --status active --json"]);
114
+ addExamples(team.command("create").description("原子创建 Team 并设置首位 OWNER")
115
+ .requiredOption("--code <code>", "稳定 lowercase-kebab code")
116
+ .requiredOption("--name <name>", "Team 名称")
117
+ .option("--description <text>", "Team 描述")
118
+ .requiredOption("--owner-user-id <id>", "首位 OWNER 的平台用户 ID")
119
+ .requiredOption("--idempotency-key <key>", "稳定幂等键")
120
+ .option("--yes", "确认创建")
121
+ .action(async (options, command) => {
122
+ requireYes(options.yes);
123
+ const result = await client().createTeam({
124
+ code: options.code,
125
+ name: options.name,
126
+ description: options.description?.trim() || null,
127
+ ownerUserId: positiveInteger(options.ownerUserId, "owner-user-id")
128
+ }, options.idempotencyKey);
129
+ await output(command, result, teamLine(result));
130
+ }), ["numa team create --code ai-agent --name 'AI Agent Team' --owner-user-id 9 --idempotency-key team-ai-agent-v1 --yes --json"]);
131
+ addExamples(team.command("update <team-id>").description("使用乐观锁更新 Team")
132
+ .requiredOption("--expected-version <number>", "当前 Team version")
133
+ .option("--name <name>", "新名称")
134
+ .option("--description <text>", "新描述")
135
+ .option("--clear-description", "清空描述")
136
+ .option("--status <status>", "active 或 archived")
137
+ .requiredOption("--idempotency-key <key>", "稳定幂等键")
138
+ .option("--yes", "确认更新")
139
+ .action(async (teamId, options, command) => {
140
+ requireYes(options.yes);
141
+ if (options.description != null && options.clearDescription) {
142
+ throw new TeamError("Choose only one of --description or --clear-description.", "TEAM_INPUT_INVALID");
143
+ }
144
+ if (options.name == null && options.description == null && !options.clearDescription && options.status == null) {
145
+ throw new TeamError("Team update requires at least one changed field.", "TEAM_INPUT_INVALID");
146
+ }
147
+ const api = client();
148
+ const current = await api.getTeam(teamId);
149
+ const expectedVersion = nonnegativeInteger(options.expectedVersion, "expected-version");
150
+ if (current.version !== expectedVersion) {
151
+ throw new TeamError("expected-version does not match the current Team; review it before retrying.", "TEAM_VERSION_MISMATCH", 412);
152
+ }
153
+ const result = await api.updateTeam(teamId, {
154
+ name: options.name ?? current.name,
155
+ description: options.clearDescription ? null : options.description?.trim() ?? current.description ?? null,
156
+ status: status(options.status) ?? current.status,
157
+ expectedVersion
158
+ }, options.idempotencyKey);
159
+ await output(command, result, teamLine(result));
160
+ }), ["numa team update 41 --expected-version 0 --status archived --idempotency-key team-41-v1 --yes --json"]);
161
+ const member = team.command("member").description("管理 Team 成员");
162
+ addExamples(member.command("list <team-id>").description("列出 ACTIVE Team 成员")
163
+ .action(async (teamId, _options, command) => {
164
+ const result = await client().listMembers(teamId);
165
+ const lines = result.map((item) => `${item.userId}\t${item.username}\t${item.role}\t${item.status}`);
166
+ await output(command, result, lines.join("\n") || "No active members found.");
167
+ }), ["numa team member list 41 --json"]);
168
+ addExamples(member.command("set <team-id>").description("新增成员或更新成员角色")
169
+ .requiredOption("--user-id <id>", "平台用户 ID")
170
+ .requiredOption("--role <role>", "owner/admin/maintainer/member/viewer")
171
+ .requiredOption("--idempotency-key <key>", "稳定幂等键")
172
+ .option("--yes", "确认写入")
173
+ .action(async (teamId, options, command) => {
174
+ requireYes(options.yes);
175
+ const result = await client().saveMember(teamId, {
176
+ userId: positiveInteger(options.userId, "user-id"), role: role(options.role)
177
+ }, options.idempotencyKey);
178
+ await output(command, result, `${result.userId}\t${result.username}\t${result.role}\t${result.status}`);
179
+ }), ["numa team member set 41 --user-id 12 --role member --idempotency-key team-41-user-12-v1 --yes --json"]);
180
+ addExamples(member.command("remove <team-id>").description("移除成员;不能移除最后一位 ACTIVE OWNER")
181
+ .requiredOption("--user-id <id>", "平台用户 ID")
182
+ .requiredOption("--idempotency-key <key>", "稳定幂等键")
183
+ .option("--yes", "确认移除")
184
+ .action(async (teamId, options, command) => {
185
+ requireYes(options.yes);
186
+ await client().removeMember(teamId, String(positiveInteger(options.userId, "user-id")), options.idempotencyKey);
187
+ await output(command, { removed: true, teamId, userId: options.userId }, `Removed user ${options.userId} from Team ${teamId}.`);
188
+ }), ["numa team member remove 41 --user-id 12 --idempotency-key team-41-user-12-remove-v1 --yes --json"]);
189
+ }
190
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/teams/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function redactTeamText(value: string): string;
2
+ export declare function sanitizeTeamOutput(value: unknown, key?: string): unknown;
3
+ export declare class TeamError extends Error {
4
+ readonly code: string;
5
+ readonly status?: number | undefined;
6
+ readonly requestId?: string | undefined;
7
+ readonly details?: unknown;
8
+ constructor(message: string, code: string, status?: number | undefined, requestId?: string | undefined, details?: unknown);
9
+ }
10
+ export declare function teamExitCode(error: TeamError): number;
@@ -0,0 +1,56 @@
1
+ const SENSITIVE_KEY_PARTS = [
2
+ "token", "secret", "password", "credential", "privatekey", "apikey", "accesskey"
3
+ ];
4
+ function sensitiveKey(key) {
5
+ const normalized = key.replace(/[^A-Za-z0-9]/gu, "").toLowerCase();
6
+ return SENSITIVE_KEY_PARTS.some((part) => normalized.includes(part));
7
+ }
8
+ export function redactTeamText(value) {
9
+ return value
10
+ .replace(/\b(Bearer|Basic)\s+[^\s,;]+/giu, "$1 [REDACTED]")
11
+ .replace(/([?&](?:access_token|refresh_token|token|signature|credential|api[_-]?key)=)[^&#\s]+/giu, "$1[REDACTED]")
12
+ .replace(/\b((?:password|passwd|token|api[_-]?key|secret|credential)\s*[=:]\s*)[^\s,;]+/giu, "$1[REDACTED]")
13
+ .replace(/(https?:\/\/)[^\s/@:]+:[^\s/@]+@/giu, "$1[REDACTED]@")
14
+ .replace(/(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}(?![A-Za-z0-9_-])/gu, "[REDACTED_JWT]");
15
+ }
16
+ export function sanitizeTeamOutput(value, key = "") {
17
+ if (sensitiveKey(key))
18
+ return "[REDACTED]";
19
+ if (typeof value === "string")
20
+ return redactTeamText(value);
21
+ if (Array.isArray(value))
22
+ return value.map((item) => sanitizeTeamOutput(item));
23
+ if (value && typeof value === "object") {
24
+ return Object.fromEntries(Object.entries(value)
25
+ .map(([name, item]) => [name, sanitizeTeamOutput(item, name)]));
26
+ }
27
+ return value;
28
+ }
29
+ export class TeamError extends Error {
30
+ code;
31
+ status;
32
+ requestId;
33
+ details;
34
+ constructor(message, code, status, requestId, details) {
35
+ super(redactTeamText(message));
36
+ this.code = code;
37
+ this.status = status;
38
+ this.requestId = requestId;
39
+ this.name = "TeamError";
40
+ this.details = details == null ? undefined : sanitizeTeamOutput(details);
41
+ }
42
+ }
43
+ export function teamExitCode(error) {
44
+ if (error.status === 401)
45
+ return 3;
46
+ if (error.status === 403 || /(?:FORBIDDEN|ROLE_REQUIRED)/u.test(error.code))
47
+ return 4;
48
+ if (error.status === 409 || error.status === 412 || /(?:CONFLICT|VERSION_MISMATCH)/u.test(error.code))
49
+ return 5;
50
+ if ((error.status ?? 0) >= 500 || /(?:UNAVAILABLE|RESULT_UNKNOWN)/u.test(error.code))
51
+ return 6;
52
+ if (/(?:INPUT|IDEMPOTENCY|CONFIRMATION)/u.test(error.code))
53
+ return 2;
54
+ return 1;
55
+ }
56
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/teams/errors.ts"],"names":[],"mappings":"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"}