@crewspaceai/shared 2026.419.0-canary.0 → 2026.422.0-canary.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.
Files changed (53) hide show
  1. package/dist/agent-url-key.test.d.ts +2 -0
  2. package/dist/agent-url-key.test.d.ts.map +1 -0
  3. package/dist/agent-url-key.test.js +102 -0
  4. package/dist/agent-url-key.test.js.map +1 -0
  5. package/dist/config-schema.test.d.ts +2 -0
  6. package/dist/config-schema.test.d.ts.map +1 -0
  7. package/dist/config-schema.test.js +132 -0
  8. package/dist/config-schema.test.js.map +1 -0
  9. package/dist/project-url-key.test.d.ts +2 -0
  10. package/dist/project-url-key.test.d.ts.map +1 -0
  11. package/dist/project-url-key.test.js +98 -0
  12. package/dist/project-url-key.test.js.map +1 -0
  13. package/dist/validators/access.test.d.ts +2 -0
  14. package/dist/validators/access.test.d.ts.map +1 -0
  15. package/dist/validators/access.test.js +145 -0
  16. package/dist/validators/access.test.js.map +1 -0
  17. package/dist/validators/adapter-skills.d.ts +6 -6
  18. package/dist/validators/agent.test.d.ts +2 -0
  19. package/dist/validators/agent.test.d.ts.map +1 -0
  20. package/dist/validators/agent.test.js +144 -0
  21. package/dist/validators/agent.test.js.map +1 -0
  22. package/dist/validators/budget.test.d.ts +2 -0
  23. package/dist/validators/budget.test.d.ts.map +1 -0
  24. package/dist/validators/budget.test.js +71 -0
  25. package/dist/validators/budget.test.js.map +1 -0
  26. package/dist/validators/company-portability.d.ts +52 -52
  27. package/dist/validators/company-skill.d.ts +20 -20
  28. package/dist/validators/company.test.d.ts +2 -0
  29. package/dist/validators/company.test.d.ts.map +1 -0
  30. package/dist/validators/company.test.js +77 -0
  31. package/dist/validators/company.test.js.map +1 -0
  32. package/dist/validators/goal.test.d.ts +2 -0
  33. package/dist/validators/goal.test.d.ts.map +1 -0
  34. package/dist/validators/goal.test.js +56 -0
  35. package/dist/validators/goal.test.js.map +1 -0
  36. package/dist/validators/issue.d.ts +6 -6
  37. package/dist/validators/issue.test.d.ts +2 -0
  38. package/dist/validators/issue.test.d.ts.map +1 -0
  39. package/dist/validators/issue.test.js +128 -0
  40. package/dist/validators/issue.test.js.map +1 -0
  41. package/dist/validators/routine.test.d.ts +2 -0
  42. package/dist/validators/routine.test.d.ts.map +1 -0
  43. package/dist/validators/routine.test.js +121 -0
  44. package/dist/validators/routine.test.js.map +1 -0
  45. package/dist/validators/secret.test.d.ts +2 -0
  46. package/dist/validators/secret.test.d.ts.map +1 -0
  47. package/dist/validators/secret.test.js +112 -0
  48. package/dist/validators/secret.test.js.map +1 -0
  49. package/dist/validators/work-product.test.d.ts +2 -0
  50. package/dist/validators/work-product.test.d.ts.map +1 -0
  51. package/dist/validators/work-product.test.js +77 -0
  52. package/dist/validators/work-product.test.js.map +1 -0
  53. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-url-key.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-url-key.test.d.ts","sourceRoot":"","sources":["../src/agent-url-key.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { deriveAgentUrlKey, isUuidLike, normalizeAgentUrlKey } from "./agent-url-key.js";
3
+ describe("isUuidLike", () => {
4
+ it("returns true for a valid v4 UUID", () => {
5
+ expect(isUuidLike("550e8400-e29b-41d4-a716-446655440000")).toBe(true);
6
+ });
7
+ it("returns true for a valid v1 UUID", () => {
8
+ expect(isUuidLike("6ba7b810-9dad-11d1-80b4-00c04fd430c8")).toBe(true);
9
+ });
10
+ it("returns true for a UUID with surrounding whitespace", () => {
11
+ expect(isUuidLike(" 550e8400-e29b-41d4-a716-446655440000 ")).toBe(true);
12
+ });
13
+ it("returns true for uppercase UUID", () => {
14
+ expect(isUuidLike("550E8400-E29B-41D4-A716-446655440000")).toBe(true);
15
+ });
16
+ it("returns false for a plain string", () => {
17
+ expect(isUuidLike("not-a-uuid")).toBe(false);
18
+ });
19
+ it("returns false for null", () => {
20
+ expect(isUuidLike(null)).toBe(false);
21
+ });
22
+ it("returns false for undefined", () => {
23
+ expect(isUuidLike(undefined)).toBe(false);
24
+ });
25
+ it("returns false for empty string", () => {
26
+ expect(isUuidLike("")).toBe(false);
27
+ });
28
+ it("returns false for UUID without dashes", () => {
29
+ expect(isUuidLike("550e8400e29b41d4a716446655440000")).toBe(false);
30
+ });
31
+ it("returns false for a UUID with invalid version digit (0)", () => {
32
+ expect(isUuidLike("550e8400-e29b-01d4-a716-446655440000")).toBe(false);
33
+ });
34
+ it("returns false for a UUID with invalid variant bits", () => {
35
+ expect(isUuidLike("550e8400-e29b-41d4-0716-446655440000")).toBe(false);
36
+ });
37
+ });
38
+ describe("normalizeAgentUrlKey", () => {
39
+ it("lowercases an ASCII name", () => {
40
+ expect(normalizeAgentUrlKey("MyAgent")).toBe("myagent");
41
+ });
42
+ it("replaces spaces with dashes", () => {
43
+ expect(normalizeAgentUrlKey("my agent")).toBe("my-agent");
44
+ });
45
+ it("collapses multiple special characters to one dash", () => {
46
+ expect(normalizeAgentUrlKey("my--agent!!name")).toBe("my-agent-name");
47
+ });
48
+ it("trims leading and trailing dashes", () => {
49
+ expect(normalizeAgentUrlKey("--my-agent--")).toBe("my-agent");
50
+ });
51
+ it("trims leading and trailing whitespace before normalizing", () => {
52
+ expect(normalizeAgentUrlKey(" hello world ")).toBe("hello-world");
53
+ });
54
+ it("returns null for null input", () => {
55
+ expect(normalizeAgentUrlKey(null)).toBe(null);
56
+ });
57
+ it("returns null for undefined input", () => {
58
+ expect(normalizeAgentUrlKey(undefined)).toBe(null);
59
+ });
60
+ it("returns null for empty string", () => {
61
+ expect(normalizeAgentUrlKey("")).toBe(null);
62
+ });
63
+ it("returns null for whitespace-only string", () => {
64
+ expect(normalizeAgentUrlKey(" ")).toBe(null);
65
+ });
66
+ it("returns null for string that normalizes to empty (all special chars)", () => {
67
+ expect(normalizeAgentUrlKey("!!!")).toBe(null);
68
+ });
69
+ it("preserves digits", () => {
70
+ expect(normalizeAgentUrlKey("Agent007")).toBe("agent007");
71
+ });
72
+ it("replaces underscores with dashes", () => {
73
+ expect(normalizeAgentUrlKey("my_agent_name")).toBe("my-agent-name");
74
+ });
75
+ });
76
+ describe("deriveAgentUrlKey", () => {
77
+ it("uses normalized name when name is valid", () => {
78
+ expect(deriveAgentUrlKey("My Agent")).toBe("my-agent");
79
+ });
80
+ it("falls back to fallback when name is null", () => {
81
+ expect(deriveAgentUrlKey(null, "fallback-agent")).toBe("fallback-agent");
82
+ });
83
+ it("falls back to fallback when name is undefined", () => {
84
+ expect(deriveAgentUrlKey(undefined, "fallback-agent")).toBe("fallback-agent");
85
+ });
86
+ it("falls back to fallback when name normalizes to null", () => {
87
+ expect(deriveAgentUrlKey("!!!", "fallback")).toBe("fallback");
88
+ });
89
+ it("returns 'agent' when both name and fallback are null", () => {
90
+ expect(deriveAgentUrlKey(null, null)).toBe("agent");
91
+ });
92
+ it("returns 'agent' when both name and fallback are undefined", () => {
93
+ expect(deriveAgentUrlKey(undefined, undefined)).toBe("agent");
94
+ });
95
+ it("returns 'agent' when both name and fallback normalize to null", () => {
96
+ expect(deriveAgentUrlKey("!", "!")).toBe("agent");
97
+ });
98
+ it("prefers name over fallback when both are provided", () => {
99
+ expect(deriveAgentUrlKey("Primary", "Secondary")).toBe("primary");
100
+ });
101
+ });
102
+ //# sourceMappingURL=agent-url-key.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-url-key.test.js","sourceRoot":"","sources":["../src/agent-url-key.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.test.d.ts","sourceRoot":"","sources":["../src/config-schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { crewspaceConfigSchema, databaseBackupConfigSchema, serverConfigSchema, authConfigSchema } from "./config-schema.js";
3
+ const validConfig = {
4
+ $meta: { version: 1, updatedAt: "2024-01-01T00:00:00Z", source: "onboard" },
5
+ database: {
6
+ mode: "embedded-postgres",
7
+ embeddedPostgresDataDir: "~/.crewspace/instances/default/db",
8
+ embeddedPostgresPort: 54329,
9
+ backup: {
10
+ enabled: true,
11
+ intervalMinutes: 60,
12
+ retentionDays: 30,
13
+ dir: "~/.crewspace/instances/default/data/backups",
14
+ },
15
+ },
16
+ logging: { mode: "file", logDir: "~/.crewspace/instances/default/logs" },
17
+ server: {
18
+ deploymentMode: "local_trusted",
19
+ exposure: "private",
20
+ host: "127.0.0.1",
21
+ port: 3100,
22
+ allowedHostnames: [],
23
+ serveUi: true,
24
+ },
25
+ };
26
+ describe("databaseBackupConfigSchema", () => {
27
+ it("accepts valid backup config", () => {
28
+ const result = databaseBackupConfigSchema.safeParse({
29
+ enabled: true,
30
+ intervalMinutes: 60,
31
+ retentionDays: 30,
32
+ dir: "/backups",
33
+ });
34
+ expect(result.success).toBe(true);
35
+ });
36
+ it("rejects intervalMinutes below minimum (0)", () => {
37
+ const result = databaseBackupConfigSchema.safeParse({ intervalMinutes: 0, retentionDays: 30, dir: "/x" });
38
+ expect(result.success).toBe(false);
39
+ });
40
+ it("rejects retentionDays above maximum", () => {
41
+ const result = databaseBackupConfigSchema.safeParse({ intervalMinutes: 60, retentionDays: 9999, dir: "/x" });
42
+ expect(result.success).toBe(false);
43
+ });
44
+ it("applies defaults when fields are omitted", () => {
45
+ const result = databaseBackupConfigSchema.parse({});
46
+ expect(result.enabled).toBe(true);
47
+ expect(result.intervalMinutes).toBe(60);
48
+ expect(result.retentionDays).toBe(30);
49
+ });
50
+ });
51
+ describe("serverConfigSchema", () => {
52
+ it("accepts valid server config", () => {
53
+ const result = serverConfigSchema.safeParse({
54
+ deploymentMode: "local_trusted",
55
+ exposure: "private",
56
+ host: "0.0.0.0",
57
+ port: 8080,
58
+ allowedHostnames: ["example.com"],
59
+ serveUi: false,
60
+ });
61
+ expect(result.success).toBe(true);
62
+ });
63
+ it("rejects port 0", () => {
64
+ const result = serverConfigSchema.safeParse({ port: 0 });
65
+ expect(result.success).toBe(false);
66
+ });
67
+ it("rejects port above 65535", () => {
68
+ const result = serverConfigSchema.safeParse({ port: 65536 });
69
+ expect(result.success).toBe(false);
70
+ });
71
+ it("applies defaults", () => {
72
+ const result = serverConfigSchema.parse({});
73
+ expect(result.deploymentMode).toBe("local_trusted");
74
+ expect(result.exposure).toBe("private");
75
+ expect(result.port).toBe(3100);
76
+ });
77
+ });
78
+ describe("authConfigSchema", () => {
79
+ it("accepts auto mode without publicBaseUrl", () => {
80
+ const result = authConfigSchema.safeParse({ baseUrlMode: "auto" });
81
+ expect(result.success).toBe(true);
82
+ });
83
+ it("applies defaults", () => {
84
+ const result = authConfigSchema.parse({});
85
+ expect(result.baseUrlMode).toBe("auto");
86
+ expect(result.disableSignUp).toBe(false);
87
+ });
88
+ });
89
+ describe("crewspaceConfigSchema cross-field validation", () => {
90
+ it("accepts a valid local_trusted config", () => {
91
+ const result = crewspaceConfigSchema.safeParse(validConfig);
92
+ expect(result.success).toBe(true);
93
+ });
94
+ it("rejects local_trusted with public exposure", () => {
95
+ const result = crewspaceConfigSchema.safeParse({
96
+ ...validConfig,
97
+ server: { ...validConfig.server, deploymentMode: "local_trusted", exposure: "public" },
98
+ });
99
+ expect(result.success).toBe(false);
100
+ if (!result.success) {
101
+ expect(result.error.issues.some((i) => i.path.includes("exposure"))).toBe(true);
102
+ }
103
+ });
104
+ it("rejects authenticated+public exposure without publicBaseUrl", () => {
105
+ const result = crewspaceConfigSchema.safeParse({
106
+ ...validConfig,
107
+ server: { ...validConfig.server, deploymentMode: "authenticated", exposure: "public" },
108
+ auth: { baseUrlMode: "explicit", disableSignUp: false },
109
+ });
110
+ expect(result.success).toBe(false);
111
+ });
112
+ it("accepts authenticated+public when publicBaseUrl is provided", () => {
113
+ const result = crewspaceConfigSchema.safeParse({
114
+ ...validConfig,
115
+ server: { ...validConfig.server, deploymentMode: "authenticated", exposure: "public" },
116
+ auth: { baseUrlMode: "explicit", publicBaseUrl: "https://crewspace.example.com", disableSignUp: false },
117
+ });
118
+ expect(result.success).toBe(true);
119
+ });
120
+ it("rejects authenticated mode with explicit baseUrlMode but missing publicBaseUrl", () => {
121
+ const result = crewspaceConfigSchema.safeParse({
122
+ ...validConfig,
123
+ server: { ...validConfig.server, deploymentMode: "authenticated", exposure: "private" },
124
+ auth: { baseUrlMode: "explicit", disableSignUp: false },
125
+ });
126
+ expect(result.success).toBe(false);
127
+ if (!result.success) {
128
+ expect(result.error.issues.some((i) => i.message.includes("publicBaseUrl"))).toBe(true);
129
+ }
130
+ });
131
+ });
132
+ //# sourceMappingURL=config-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.test.js","sourceRoot":"","sources":["../src/config-schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project-url-key.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-url-key.test.d.ts","sourceRoot":"","sources":["../src/project-url-key.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { deriveProjectUrlKey, hasNonAsciiContent, normalizeProjectUrlKey, } from "./project-url-key.js";
3
+ const VALID_UUID = "550e8400-e29b-41d4-a716-446655440000";
4
+ describe("normalizeProjectUrlKey", () => {
5
+ it("lowercases an ASCII name", () => {
6
+ expect(normalizeProjectUrlKey("MyProject")).toBe("myproject");
7
+ });
8
+ it("replaces spaces with dashes", () => {
9
+ expect(normalizeProjectUrlKey("my project")).toBe("my-project");
10
+ });
11
+ it("collapses multiple special characters to one dash", () => {
12
+ expect(normalizeProjectUrlKey("my--project!!name")).toBe("my-project-name");
13
+ });
14
+ it("trims leading and trailing dashes", () => {
15
+ expect(normalizeProjectUrlKey("--my-project--")).toBe("my-project");
16
+ });
17
+ it("trims whitespace before normalizing", () => {
18
+ expect(normalizeProjectUrlKey(" hello world ")).toBe("hello-world");
19
+ });
20
+ it("replaces underscores with dashes", () => {
21
+ expect(normalizeProjectUrlKey("my_project_name")).toBe("my-project-name");
22
+ });
23
+ it("preserves digits", () => {
24
+ expect(normalizeProjectUrlKey("Project42")).toBe("project42");
25
+ });
26
+ it("returns null for null", () => {
27
+ expect(normalizeProjectUrlKey(null)).toBe(null);
28
+ });
29
+ it("returns null for undefined", () => {
30
+ expect(normalizeProjectUrlKey(undefined)).toBe(null);
31
+ });
32
+ it("returns null for empty string", () => {
33
+ expect(normalizeProjectUrlKey("")).toBe(null);
34
+ });
35
+ it("returns null for whitespace-only string", () => {
36
+ expect(normalizeProjectUrlKey(" ")).toBe(null);
37
+ });
38
+ it("returns null for all-special-char string", () => {
39
+ expect(normalizeProjectUrlKey("!!!")).toBe(null);
40
+ });
41
+ });
42
+ describe("hasNonAsciiContent", () => {
43
+ it("returns false for pure ASCII string", () => {
44
+ expect(hasNonAsciiContent("hello-world")).toBe(false);
45
+ });
46
+ it("returns true for string with emoji", () => {
47
+ expect(hasNonAsciiContent("project 🚀")).toBe(true);
48
+ });
49
+ it("returns true for string with accented characters", () => {
50
+ expect(hasNonAsciiContent("Façade")).toBe(true);
51
+ });
52
+ it("returns true for CJK characters", () => {
53
+ expect(hasNonAsciiContent("项目")).toBe(true);
54
+ });
55
+ it("returns false for null", () => {
56
+ expect(hasNonAsciiContent(null)).toBe(false);
57
+ });
58
+ it("returns false for undefined", () => {
59
+ expect(hasNonAsciiContent(undefined)).toBe(false);
60
+ });
61
+ it("returns false for empty string", () => {
62
+ expect(hasNonAsciiContent("")).toBe(false);
63
+ });
64
+ });
65
+ describe("deriveProjectUrlKey", () => {
66
+ it("uses normalized name when name is pure ASCII", () => {
67
+ expect(deriveProjectUrlKey("My Project")).toBe("my-project");
68
+ });
69
+ it("falls back to fallback UUID short-id when name is null", () => {
70
+ const result = deriveProjectUrlKey(null, VALID_UUID);
71
+ expect(result).toMatch(/^[0-9a-f]{8}$/);
72
+ });
73
+ it("falls back to fallback when name normalizes to null", () => {
74
+ const result = deriveProjectUrlKey("!!!", VALID_UUID);
75
+ expect(result).toMatch(/^[0-9a-f]{8}$/);
76
+ });
77
+ it("appends UUID short-id when name has non-ASCII content", () => {
78
+ const result = deriveProjectUrlKey("项目名称", VALID_UUID);
79
+ expect(result).toMatch(/^[0-9a-f]{8}$/);
80
+ });
81
+ it("appends UUID suffix when name has mixed ASCII + non-ASCII", () => {
82
+ const result = deriveProjectUrlKey("my-项目", VALID_UUID);
83
+ expect(result).toMatch(/^my-[0-9a-f]{8}$/);
84
+ });
85
+ it("returns 'project' when both name and fallback are null", () => {
86
+ expect(deriveProjectUrlKey(null, null)).toBe("project");
87
+ });
88
+ it("returns 'project' when both name and fallback are undefined", () => {
89
+ expect(deriveProjectUrlKey(undefined, undefined)).toBe("project");
90
+ });
91
+ it("prefers name over fallback for clean ASCII name", () => {
92
+ expect(deriveProjectUrlKey("Primary", VALID_UUID)).toBe("primary");
93
+ });
94
+ it("uses fallback string when name is null and fallback is not a UUID", () => {
95
+ expect(deriveProjectUrlKey(null, "backup-project")).toBe("backup-project");
96
+ });
97
+ });
98
+ //# sourceMappingURL=project-url-key.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-url-key.test.js","sourceRoot":"","sources":["../src/project-url-key.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=access.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.test.d.ts","sourceRoot":"","sources":["../../src/validators/access.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,145 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { acceptInviteSchema, boardCliAuthAccessLevelSchema, claimJoinRequestApiKeySchema, createCliAuthChallengeSchema, createCompanyInviteSchema, createOpenClawInvitePromptSchema, listJoinRequestsQuerySchema, resolveCliAuthChallengeSchema, updateMemberPermissionsSchema, updateUserCompanyAccessSchema, } from "./access.js";
3
+ const VALID_UUID = "550e8400-e29b-41d4-a716-446655440000";
4
+ describe("createCompanyInviteSchema", () => {
5
+ it("applies default allowedJoinTypes=both", () => {
6
+ const result = createCompanyInviteSchema.parse({});
7
+ expect(result.allowedJoinTypes).toBe("both");
8
+ });
9
+ it("accepts agent_only join type", () => {
10
+ expect(createCompanyInviteSchema.safeParse({ allowedJoinTypes: "agent_only" }).success).toBe(true);
11
+ });
12
+ it("rejects invalid joinType", () => {
13
+ expect(createCompanyInviteSchema.safeParse({ allowedJoinTypes: "admin_only" }).success).toBe(false);
14
+ });
15
+ it("accepts agentMessage up to 4000 chars", () => {
16
+ expect(createCompanyInviteSchema.safeParse({ agentMessage: "a".repeat(4000) }).success).toBe(true);
17
+ });
18
+ it("rejects agentMessage over 4000 chars", () => {
19
+ expect(createCompanyInviteSchema.safeParse({ agentMessage: "a".repeat(4001) }).success).toBe(false);
20
+ });
21
+ });
22
+ describe("acceptInviteSchema", () => {
23
+ it("accepts a valid agent join request", () => {
24
+ const result = acceptInviteSchema.safeParse({ requestType: "agent" });
25
+ expect(result.success).toBe(true);
26
+ });
27
+ it("rejects missing requestType", () => {
28
+ expect(acceptInviteSchema.safeParse({}).success).toBe(false);
29
+ });
30
+ it("rejects invalid requestType", () => {
31
+ expect(acceptInviteSchema.safeParse({ requestType: "superadmin" }).success).toBe(false);
32
+ });
33
+ it("rejects agentName longer than 120 chars", () => {
34
+ expect(acceptInviteSchema.safeParse({ requestType: "agent", agentName: "x".repeat(121) }).success).toBe(false);
35
+ });
36
+ it("rejects capabilities longer than 4000 chars", () => {
37
+ expect(acceptInviteSchema.safeParse({ requestType: "agent", capabilities: "x".repeat(4001) }).success).toBe(false);
38
+ });
39
+ });
40
+ describe("claimJoinRequestApiKeySchema", () => {
41
+ it("accepts a valid claim secret (16 chars)", () => {
42
+ expect(claimJoinRequestApiKeySchema.safeParse({ claimSecret: "a".repeat(16) }).success).toBe(true);
43
+ });
44
+ it("rejects claim secret shorter than 16 chars", () => {
45
+ expect(claimJoinRequestApiKeySchema.safeParse({ claimSecret: "a".repeat(15) }).success).toBe(false);
46
+ });
47
+ it("rejects claim secret longer than 256 chars", () => {
48
+ expect(claimJoinRequestApiKeySchema.safeParse({ claimSecret: "a".repeat(257) }).success).toBe(false);
49
+ });
50
+ });
51
+ describe("boardCliAuthAccessLevelSchema", () => {
52
+ it("accepts board", () => {
53
+ expect(boardCliAuthAccessLevelSchema.safeParse("board").success).toBe(true);
54
+ });
55
+ it("accepts instance_admin_required", () => {
56
+ expect(boardCliAuthAccessLevelSchema.safeParse("instance_admin_required").success).toBe(true);
57
+ });
58
+ it("rejects invalid level", () => {
59
+ expect(boardCliAuthAccessLevelSchema.safeParse("superadmin").success).toBe(false);
60
+ });
61
+ });
62
+ describe("createCliAuthChallengeSchema", () => {
63
+ it("accepts a valid challenge", () => {
64
+ const result = createCliAuthChallengeSchema.safeParse({ command: "crewspaceai run" });
65
+ expect(result.success).toBe(true);
66
+ if (result.success) {
67
+ expect(result.data.requestedAccess).toBe("board");
68
+ }
69
+ });
70
+ it("rejects empty command", () => {
71
+ expect(createCliAuthChallengeSchema.safeParse({ command: "" }).success).toBe(false);
72
+ });
73
+ it("rejects command over 240 chars", () => {
74
+ expect(createCliAuthChallengeSchema.safeParse({ command: "x".repeat(241) }).success).toBe(false);
75
+ });
76
+ it("accepts requestedCompanyId UUID", () => {
77
+ expect(createCliAuthChallengeSchema.safeParse({ command: "cmd", requestedCompanyId: VALID_UUID }).success).toBe(true);
78
+ });
79
+ it("rejects non-UUID requestedCompanyId", () => {
80
+ expect(createCliAuthChallengeSchema.safeParse({ command: "cmd", requestedCompanyId: "bad" }).success).toBe(false);
81
+ });
82
+ });
83
+ describe("resolveCliAuthChallengeSchema", () => {
84
+ it("accepts a valid token (16 chars)", () => {
85
+ expect(resolveCliAuthChallengeSchema.safeParse({ token: "a".repeat(16) }).success).toBe(true);
86
+ });
87
+ it("rejects token shorter than 16 chars", () => {
88
+ expect(resolveCliAuthChallengeSchema.safeParse({ token: "short" }).success).toBe(false);
89
+ });
90
+ it("rejects token longer than 256 chars", () => {
91
+ expect(resolveCliAuthChallengeSchema.safeParse({ token: "a".repeat(257) }).success).toBe(false);
92
+ });
93
+ });
94
+ describe("updateMemberPermissionsSchema", () => {
95
+ it("accepts empty grants array", () => {
96
+ expect(updateMemberPermissionsSchema.safeParse({ grants: [] }).success).toBe(true);
97
+ });
98
+ it("accepts a valid grant", () => {
99
+ const result = updateMemberPermissionsSchema.safeParse({
100
+ grants: [{ permissionKey: "manage_agents" }],
101
+ });
102
+ expect(result.success).toBe(true);
103
+ });
104
+ it("rejects invalid permissionKey", () => {
105
+ expect(updateMemberPermissionsSchema.safeParse({ grants: [{ permissionKey: "do_everything" }] }).success).toBe(false);
106
+ });
107
+ it("rejects missing grants field", () => {
108
+ expect(updateMemberPermissionsSchema.safeParse({}).success).toBe(false);
109
+ });
110
+ });
111
+ describe("updateUserCompanyAccessSchema", () => {
112
+ it("defaults to empty companyIds array", () => {
113
+ const result = updateUserCompanyAccessSchema.parse({});
114
+ expect(result.companyIds).toEqual([]);
115
+ });
116
+ it("accepts array of UUIDs", () => {
117
+ expect(updateUserCompanyAccessSchema.safeParse({ companyIds: [VALID_UUID] }).success).toBe(true);
118
+ });
119
+ it("rejects non-UUID in companyIds", () => {
120
+ expect(updateUserCompanyAccessSchema.safeParse({ companyIds: ["not-a-uuid"] }).success).toBe(false);
121
+ });
122
+ });
123
+ describe("listJoinRequestsQuerySchema", () => {
124
+ it("accepts empty query", () => {
125
+ expect(listJoinRequestsQuerySchema.safeParse({}).success).toBe(true);
126
+ });
127
+ it("accepts valid status filter", () => {
128
+ expect(listJoinRequestsQuerySchema.safeParse({ status: "pending" }).success).toBe(true);
129
+ });
130
+ it("rejects invalid status", () => {
131
+ expect(listJoinRequestsQuerySchema.safeParse({ status: "unknown" }).success).toBe(false);
132
+ });
133
+ });
134
+ describe("createOpenClawInvitePromptSchema", () => {
135
+ it("accepts empty", () => {
136
+ expect(createOpenClawInvitePromptSchema.safeParse({}).success).toBe(true);
137
+ });
138
+ it("accepts agentMessage", () => {
139
+ expect(createOpenClawInvitePromptSchema.safeParse({ agentMessage: "Hello!" }).success).toBe(true);
140
+ });
141
+ it("rejects agentMessage over 4000 chars", () => {
142
+ expect(createOpenClawInvitePromptSchema.safeParse({ agentMessage: "x".repeat(4001) }).success).toBe(false);
143
+ });
144
+ });
145
+ //# sourceMappingURL=access.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.test.js","sourceRoot":"","sources":["../../src/validators/access.test.ts"],"names":[],"mappings":"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"}
@@ -18,8 +18,8 @@ export declare const agentSkillEntrySchema: z.ZodObject<{
18
18
  targetPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
19
19
  detail: z.ZodOptional<z.ZodNullable<z.ZodString>>;
20
20
  }, "strip", z.ZodTypeAny, {
21
- managed: boolean;
22
21
  key: string;
22
+ managed: boolean;
23
23
  desired: boolean;
24
24
  runtimeName: string | null;
25
25
  state: "installed" | "external" | "available" | "configured" | "missing" | "stale";
@@ -33,8 +33,8 @@ export declare const agentSkillEntrySchema: z.ZodObject<{
33
33
  targetPath?: string | null | undefined;
34
34
  detail?: string | null | undefined;
35
35
  }, {
36
- managed: boolean;
37
36
  key: string;
37
+ managed: boolean;
38
38
  desired: boolean;
39
39
  runtimeName: string | null;
40
40
  state: "installed" | "external" | "available" | "configured" | "missing" | "stale";
@@ -69,8 +69,8 @@ export declare const agentSkillSnapshotSchema: z.ZodObject<{
69
69
  targetPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
70
70
  detail: z.ZodOptional<z.ZodNullable<z.ZodString>>;
71
71
  }, "strip", z.ZodTypeAny, {
72
- managed: boolean;
73
72
  key: string;
73
+ managed: boolean;
74
74
  desired: boolean;
75
75
  runtimeName: string | null;
76
76
  state: "installed" | "external" | "available" | "configured" | "missing" | "stale";
@@ -84,8 +84,8 @@ export declare const agentSkillSnapshotSchema: z.ZodObject<{
84
84
  targetPath?: string | null | undefined;
85
85
  detail?: string | null | undefined;
86
86
  }, {
87
- managed: boolean;
88
87
  key: string;
88
+ managed: boolean;
89
89
  desired: boolean;
90
90
  runtimeName: string | null;
91
91
  state: "installed" | "external" | "available" | "configured" | "missing" | "stale";
@@ -102,8 +102,8 @@ export declare const agentSkillSnapshotSchema: z.ZodObject<{
102
102
  warnings: z.ZodArray<z.ZodString, "many">;
103
103
  }, "strip", z.ZodTypeAny, {
104
104
  entries: {
105
- managed: boolean;
106
105
  key: string;
106
+ managed: boolean;
107
107
  desired: boolean;
108
108
  runtimeName: string | null;
109
109
  state: "installed" | "external" | "available" | "configured" | "missing" | "stale";
@@ -124,8 +124,8 @@ export declare const agentSkillSnapshotSchema: z.ZodObject<{
124
124
  desiredSkills: string[];
125
125
  }, {
126
126
  entries: {
127
- managed: boolean;
128
127
  key: string;
128
+ managed: boolean;
129
129
  desired: boolean;
130
130
  runtimeName: string | null;
131
131
  state: "installed" | "external" | "available" | "configured" | "missing" | "stale";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.test.d.ts","sourceRoot":"","sources":["../../src/validators/agent.test.ts"],"names":[],"mappings":""}