@crewspaceai/shared 2026.419.0-canary.1 → 2026.423.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.
- package/dist/agent-url-key.test.d.ts +2 -0
- package/dist/agent-url-key.test.d.ts.map +1 -0
- package/dist/agent-url-key.test.js +102 -0
- package/dist/agent-url-key.test.js.map +1 -0
- package/dist/config-schema.test.d.ts +2 -0
- package/dist/config-schema.test.d.ts.map +1 -0
- package/dist/config-schema.test.js +132 -0
- package/dist/config-schema.test.js.map +1 -0
- package/dist/project-url-key.test.d.ts +2 -0
- package/dist/project-url-key.test.d.ts.map +1 -0
- package/dist/project-url-key.test.js +98 -0
- package/dist/project-url-key.test.js.map +1 -0
- package/dist/validators/access.test.d.ts +2 -0
- package/dist/validators/access.test.d.ts.map +1 -0
- package/dist/validators/access.test.js +145 -0
- package/dist/validators/access.test.js.map +1 -0
- package/dist/validators/adapter-skills.d.ts +6 -6
- package/dist/validators/agent.test.d.ts +2 -0
- package/dist/validators/agent.test.d.ts.map +1 -0
- package/dist/validators/agent.test.js +144 -0
- package/dist/validators/agent.test.js.map +1 -0
- package/dist/validators/budget.test.d.ts +2 -0
- package/dist/validators/budget.test.d.ts.map +1 -0
- package/dist/validators/budget.test.js +71 -0
- package/dist/validators/budget.test.js.map +1 -0
- package/dist/validators/company-portability.d.ts +52 -52
- package/dist/validators/company-skill.d.ts +20 -20
- package/dist/validators/company.test.d.ts +2 -0
- package/dist/validators/company.test.d.ts.map +1 -0
- package/dist/validators/company.test.js +77 -0
- package/dist/validators/company.test.js.map +1 -0
- package/dist/validators/goal.test.d.ts +2 -0
- package/dist/validators/goal.test.d.ts.map +1 -0
- package/dist/validators/goal.test.js +56 -0
- package/dist/validators/goal.test.js.map +1 -0
- package/dist/validators/issue.d.ts +6 -6
- package/dist/validators/issue.test.d.ts +2 -0
- package/dist/validators/issue.test.d.ts.map +1 -0
- package/dist/validators/issue.test.js +128 -0
- package/dist/validators/issue.test.js.map +1 -0
- package/dist/validators/routine.test.d.ts +2 -0
- package/dist/validators/routine.test.d.ts.map +1 -0
- package/dist/validators/routine.test.js +121 -0
- package/dist/validators/routine.test.js.map +1 -0
- package/dist/validators/secret.test.d.ts +2 -0
- package/dist/validators/secret.test.d.ts.map +1 -0
- package/dist/validators/secret.test.js +112 -0
- package/dist/validators/secret.test.js.map +1 -0
- package/dist/validators/work-product.test.d.ts +2 -0
- package/dist/validators/work-product.test.d.ts.map +1 -0
- package/dist/validators/work-product.test.js +77 -0
- package/dist/validators/work-product.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.d.ts","sourceRoot":"","sources":["../../src/validators/agent.test.ts"],"names":[],"mappings":""}
|