@serve.zone/interfaces 24.2.0 → 25.1.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/changelog.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-08-07 - 25.1.0
4
+
5
+ ### Features
6
+
7
+ - add shared hosted-app authorization RPC contracts (hostedapp)
8
+ - Export Cloudly's access configuration, role assignment, platform OIDC enablement, and authorization completion contracts with full `IIdentity` context.
9
+
10
+ ### Maintenance
11
+
12
+ - refresh release and test tooling
13
+ - Update tstest to 4.0.0; retain mature pnpm and Node.js type versions under the configured minimum-release-age policy.
14
+
15
+ ## 2026-08-01 - 25.0.0
16
+
17
+ ### Breaking Changes
18
+
19
+ - require canonical organization authority for service creation (service)
20
+ - Add a required top-level `organizationId` to the `createService` request.
21
+ - Keep organization ownership excluded from caller-writable service data.
22
+ - Export canonical organization identifier validation and contract coverage.
23
+
3
24
  ## 2026-08-01 - 24.2.0
4
25
 
5
26
  ### Features
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '24.2.0',
6
+ version: '25.1.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
@@ -22,6 +22,8 @@ export interface IServiceVolume {
22
22
  /** Driver-specific options forwarded to Docker's VolumeDriver.Create request. */
23
23
  options?: Record<string, string>;
24
24
  }
25
+ /** Validates the canonical organization authority used by service operations. */
26
+ export declare const validateOrganizationId: (valueArg: unknown) => string[];
25
27
  export declare const serviceContainerArgLimits: {
26
28
  readonly maximumArgs: 64;
27
29
  readonly maximumArgBytes: 4096;
@@ -1,3 +1,11 @@
1
+ const organizationIdRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
2
+ /** Validates the canonical organization authority used by service operations. */
3
+ export const validateOrganizationId = (valueArg) => {
4
+ if (typeof valueArg !== 'string' || !organizationIdRegex.test(valueArg)) {
5
+ return ['organizationId must be a canonical 1-200 character identifier'];
6
+ }
7
+ return [];
8
+ };
1
9
  export const serviceContainerArgLimits = {
2
10
  maximumArgs: 64,
3
11
  maximumArgBytes: 4096,
@@ -57,4 +65,4 @@ export const validateServiceContainerArgs = (containerArgsArg) => {
57
65
  }
58
66
  return [];
59
67
  };
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQ0EsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDdkMsV0FBVyxFQUFFLEVBQUU7SUFDZixlQUFlLEVBQUUsSUFBSTtJQUNyQixpQkFBaUIsRUFBRSxFQUFFLEdBQUcsSUFBSTtDQUNwQixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxPQUFlLEVBQXNCLEVBQUU7SUFDbEYsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1dBQzFCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7V0FDeEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7V0FDdEIsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUMxQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBQzlCLEtBQUssTUFBTSxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLEdBQUc7WUFBRSxTQUFTO1FBQzFDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3JCLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQzVDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNmLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6RCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ2xDLENBQUMsQ0FBQztBQUVGLHVGQUF1RjtBQUN2RixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLGdCQUF5QixFQUFZLEVBQUU7SUFDbEYsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFBRSxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNoRixJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcseUJBQXlCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEUsT0FBTyxDQUFDLHNDQUFzQyx5QkFBeUIsQ0FBQyxXQUFXLFVBQVUsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFDRCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDM0QsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPLENBQUMsaUJBQWlCLEtBQUssOEJBQThCLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxPQUFPLENBQUMsaUJBQWlCLEtBQUssdUNBQXVDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ3BFLElBQUksYUFBYSxHQUFHLHlCQUF5QixDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzlELE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxVQUFVLElBQUksYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdELE9BQU8sQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUMsQ0FBQyJ9
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQ0EsTUFBTSxtQkFBbUIsR0FBRyxxQ0FBcUMsQ0FBQztBQUVsRSxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxRQUFpQixFQUFZLEVBQUU7SUFDcEUsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN4RSxPQUFPLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRztJQUN2QyxXQUFXLEVBQUUsRUFBRTtJQUNmLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGlCQUFpQixFQUFFLEVBQUUsR0FBRyxJQUFJO0NBQ3BCLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLE9BQWUsRUFBc0IsRUFBRTtJQUNsRixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7V0FDMUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztXQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztXQUN0QixPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsS0FBSyxNQUFNLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLEtBQUssR0FBRztZQUFFLFNBQVM7UUFDMUMsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDNUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2YsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNELE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsZ0JBQXlCLEVBQVksRUFBRTtJQUNsRixJQUFJLGdCQUFnQixLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ2hGLElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRSxPQUFPLENBQUMsc0NBQXNDLHlCQUF5QixDQUFDLFdBQVcsVUFBVSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUNELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUMzRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFELE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDcEUsSUFBSSxhQUFhLEdBQUcseUJBQXlCLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDOUQsT0FBTyxDQUFDLGlCQUFpQixLQUFLLG9DQUFvQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELFVBQVUsSUFBSSxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksVUFBVSxHQUFHLHlCQUF5QixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0QsT0FBTyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyxDQUFDIn0=
@@ -1,6 +1,86 @@
1
1
  import * as plugins from '../plugins.js';
2
+ import type * as data from '../data/index.js';
2
3
  import type { IIdentity, IIdentityCredential } from '../data/user.js';
3
4
  import type { IHostedAppBootstrapAction, IHostedAppBootstrapActionRequest, IHostedAppLifecycleReport, IHostedAppLifecycleState, IHostedAppUpgradeState } from '../data/hostedapp.js';
5
+ export interface IReq_GetHostedAppAccessConfiguration extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetHostedAppAccessConfiguration> {
6
+ method: 'getHostedAppAccessConfiguration';
7
+ request: {
8
+ identity: data.IIdentity;
9
+ };
10
+ response: {
11
+ users: Array<{
12
+ userId: string;
13
+ username: string;
14
+ role: 'admin' | 'user';
15
+ platformOidcIssuer?: string;
16
+ }>;
17
+ assignments: data.IHostedAppRoleAssignment[];
18
+ apps: Array<{
19
+ serviceId: string;
20
+ appInstanceId: string;
21
+ displayName: string;
22
+ roles: data.IHostedAppRoleDefinition[];
23
+ platformOidcSupported: boolean;
24
+ platformOidcRegistration?: data.IHostedAppPlatformOidcRegistration;
25
+ }>;
26
+ };
27
+ }
28
+ export interface IReq_SetHostedAppRoleAssignment extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_SetHostedAppRoleAssignment> {
29
+ method: 'setHostedAppRoleAssignment';
30
+ request: {
31
+ identity: data.IIdentity;
32
+ userId: string;
33
+ appInstanceId: string;
34
+ roleIds: string[];
35
+ };
36
+ response: {
37
+ assignment: data.IHostedAppRoleAssignment | null;
38
+ };
39
+ }
40
+ export interface IReq_SetHostedAppPlatformOidc extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_SetHostedAppPlatformOidc> {
41
+ method: 'setHostedAppPlatformOidc';
42
+ request: {
43
+ identity: data.IIdentity;
44
+ appInstanceId: string;
45
+ enabled: boolean;
46
+ };
47
+ response: {
48
+ registration: data.IHostedAppPlatformOidcRegistration;
49
+ };
50
+ }
51
+ export interface IReq_GetHostedAppOidcAuthorization extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetHostedAppOidcAuthorization> {
52
+ method: 'getHostedAppOidcAuthorization';
53
+ request: {
54
+ identity: data.IIdentity;
55
+ requestId: string;
56
+ };
57
+ response: {
58
+ appInstanceId: string;
59
+ appName: string;
60
+ roleIds: string[];
61
+ expiresAt: number;
62
+ };
63
+ }
64
+ export interface IReq_CompleteHostedAppOidcAuthorization extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_CompleteHostedAppOidcAuthorization> {
65
+ method: 'completeHostedAppOidcAuthorization';
66
+ request: {
67
+ identity: data.IIdentity;
68
+ requestId: string;
69
+ };
70
+ response: {
71
+ redirectUrl: string;
72
+ };
73
+ }
74
+ export interface IReq_CancelHostedAppOidcAuthorization extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_CancelHostedAppOidcAuthorization> {
75
+ method: 'cancelHostedAppOidcAuthorization';
76
+ request: {
77
+ identity: data.IIdentity;
78
+ requestId: string;
79
+ };
80
+ response: {
81
+ redirectUrl: string;
82
+ };
83
+ }
4
84
  export interface IReq_HostedApp_ReportLifecycleState extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_HostedApp_ReportLifecycleState> {
5
85
  method: 'hostedAppReportLifecycleState';
6
86
  request: {
@@ -36,4 +36,4 @@ export const validateHostedAppCompleteBootstrapActionRequest = (requestArg) => {
36
36
  }
37
37
  return errors;
38
38
  };
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdGVkYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvcmVxdWVzdHMvaG9zdGVkYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBcUV6QyxNQUFNLENBQUMsTUFBTSwrQ0FBK0MsR0FBRyxDQUM3RCxVQUFtQixFQUNULEVBQUU7SUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDL0UsT0FBTyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLFVBQXFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQzFCLFVBQVU7UUFDVixVQUFVO1FBQ1Ysd0JBQXdCO1FBQ3hCLHNCQUFzQjtRQUN0QixTQUFTO0tBQ1YsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRO1dBQ3hELE9BQVEsT0FBTyxDQUFDLFFBQW9DLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUTtXQUNuQyxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztXQUNuRCxPQUFPLENBQUMsc0JBQWlDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTO1dBQzVCLENBQUMsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDIn0=
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdGVkYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvcmVxdWVzdHMvaG9zdGVkYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBNkt6QyxNQUFNLENBQUMsTUFBTSwrQ0FBK0MsR0FBRyxDQUM3RCxVQUFtQixFQUNULEVBQUU7SUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDL0UsT0FBTyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLFVBQXFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQzFCLFVBQVU7UUFDVixVQUFVO1FBQ1Ysd0JBQXdCO1FBQ3hCLHNCQUFzQjtRQUN0QixTQUFTO0tBQ1YsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRO1dBQ3hELE9BQVEsT0FBTyxDQUFDLFFBQW9DLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUTtXQUNuQyxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztXQUNuRCxPQUFPLENBQUMsc0JBQWlDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTO1dBQzVCLENBQUMsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDIn0=
@@ -202,6 +202,8 @@ export interface IRequest_Any_Cloudly_CreateService extends plugins.typedrequest
202
202
  method: 'createService';
203
203
  request: {
204
204
  identity: IIdentity;
205
+ /** Canonical organization authority assigned by Cloudly to the new service. */
206
+ organizationId: string;
205
207
  serviceData: TServiceWritableData;
206
208
  };
207
209
  response: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "24.2.0",
3
+ "version": "25.1.0",
4
4
  "private": false,
5
5
  "description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
6
6
  "exports": {
@@ -26,7 +26,7 @@
26
26
  "@git.zone/tsbuild": "^4.4.2",
27
27
  "@git.zone/tsdoc": "^2.1.1",
28
28
  "@git.zone/tsrun": "^2.0.6",
29
- "@git.zone/tstest": "^3.6.7",
29
+ "@git.zone/tstest": "^4.0.0",
30
30
  "@types/node": "^26.1.1"
31
31
  },
32
32
  "files": [
package/readme.md CHANGED
@@ -30,6 +30,13 @@ import { appstore, data, platform, platformservice, requests } from '@serve.zone
30
30
 
31
31
  This package intentionally has no service implementation logic. It is a stable vocabulary for services that need to agree on payload shape, method names, and response types.
32
32
 
33
+ Service creation carries canonical ownership separately from caller-writable
34
+ service data. `requests.service.IRequest_Any_Cloudly_CreateService` requires a
35
+ top-level `organizationId`, while `data.TServiceWritableData` excludes the
36
+ server-managed ownership field. Consumers should use
37
+ `data.validateOrganizationId()` to validate the identifier shape and verify
38
+ the request's ownership authorization separately before persistence.
39
+
33
40
  ## Secrets v24 Pre-Cutover Contract
34
41
 
35
42
  Version 24 retains the value-free v23 architecture while replacing the remaining
@@ -515,6 +522,8 @@ const config: appstore.IAppStoreVersionConfig = {
515
522
 
516
523
  `data.IHostedAppRoleAssignment` binds a stable user subject to an immutable `appInstanceId`. That same app instance is the OIDC `client_id`, the ID-token `aud`, and the `servezone_app_instance_id` claim. Tokens include only the assigned roles for that audience; `preferred_username` is display metadata and must not be treated as identity authority.
517
524
 
525
+ `requests.hostedapp` exports the shared authorization RPCs used by a host dashboard. `getHostedAppAccessConfiguration` returns human user summaries, role assignments, and hosted-app summaries. `setHostedAppRoleAssignment` returns the assignment or `null` when it is removed, while `setHostedAppPlatformOidc` returns the current registration state. `getHostedAppOidcAuthorization` returns the app and role summary for a pending request; `completeHostedAppOidcAuthorization` and `cancelHostedAppOidcAuthorization` return the redirect URL. All six requests require a full `data.IIdentity`.
526
+
518
527
  Validate untrusted manifests, registrations, and claims with:
519
528
 
520
529
  - `data.validateHostedAppRoleDefinitions`
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '24.2.0',
6
+ version: '25.1.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  }
@@ -34,6 +34,16 @@ export interface IServiceVolume {
34
34
  options?: Record<string, string>;
35
35
  }
36
36
 
37
+ const organizationIdRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
38
+
39
+ /** Validates the canonical organization authority used by service operations. */
40
+ export const validateOrganizationId = (valueArg: unknown): string[] => {
41
+ if (typeof valueArg !== 'string' || !organizationIdRegex.test(valueArg)) {
42
+ return ['organizationId must be a canonical 1-200 character identifier'];
43
+ }
44
+ return [];
45
+ };
46
+
37
47
  export const serviceContainerArgLimits = {
38
48
  maximumArgs: 64,
39
49
  maximumArgBytes: 4096,
@@ -1,4 +1,5 @@
1
1
  import * as plugins from '../plugins.js';
2
+ import type * as data from '../data/index.js';
2
3
  import type { IIdentity, IIdentityCredential } from '../data/user.js';
3
4
  import type {
4
5
  IHostedAppBootstrapAction,
@@ -8,6 +9,109 @@ import type {
8
9
  IHostedAppUpgradeState,
9
10
  } from '../data/hostedapp.js';
10
11
 
12
+ export interface IReq_GetHostedAppAccessConfiguration extends plugins.typedrequestInterfaces.implementsTR<
13
+ plugins.typedrequestInterfaces.ITypedRequest,
14
+ IReq_GetHostedAppAccessConfiguration
15
+ > {
16
+ method: 'getHostedAppAccessConfiguration';
17
+ request: {
18
+ identity: data.IIdentity;
19
+ };
20
+ response: {
21
+ users: Array<{
22
+ userId: string;
23
+ username: string;
24
+ role: 'admin' | 'user';
25
+ platformOidcIssuer?: string;
26
+ }>;
27
+ assignments: data.IHostedAppRoleAssignment[];
28
+ apps: Array<{
29
+ serviceId: string;
30
+ appInstanceId: string;
31
+ displayName: string;
32
+ roles: data.IHostedAppRoleDefinition[];
33
+ platformOidcSupported: boolean;
34
+ platformOidcRegistration?: data.IHostedAppPlatformOidcRegistration;
35
+ }>;
36
+ };
37
+ }
38
+
39
+ export interface IReq_SetHostedAppRoleAssignment extends plugins.typedrequestInterfaces.implementsTR<
40
+ plugins.typedrequestInterfaces.ITypedRequest,
41
+ IReq_SetHostedAppRoleAssignment
42
+ > {
43
+ method: 'setHostedAppRoleAssignment';
44
+ request: {
45
+ identity: data.IIdentity;
46
+ userId: string;
47
+ appInstanceId: string;
48
+ roleIds: string[];
49
+ };
50
+ response: {
51
+ assignment: data.IHostedAppRoleAssignment | null;
52
+ };
53
+ }
54
+
55
+ export interface IReq_SetHostedAppPlatformOidc extends plugins.typedrequestInterfaces.implementsTR<
56
+ plugins.typedrequestInterfaces.ITypedRequest,
57
+ IReq_SetHostedAppPlatformOidc
58
+ > {
59
+ method: 'setHostedAppPlatformOidc';
60
+ request: {
61
+ identity: data.IIdentity;
62
+ appInstanceId: string;
63
+ enabled: boolean;
64
+ };
65
+ response: {
66
+ registration: data.IHostedAppPlatformOidcRegistration;
67
+ };
68
+ }
69
+
70
+ export interface IReq_GetHostedAppOidcAuthorization extends plugins.typedrequestInterfaces.implementsTR<
71
+ plugins.typedrequestInterfaces.ITypedRequest,
72
+ IReq_GetHostedAppOidcAuthorization
73
+ > {
74
+ method: 'getHostedAppOidcAuthorization';
75
+ request: {
76
+ identity: data.IIdentity;
77
+ requestId: string;
78
+ };
79
+ response: {
80
+ appInstanceId: string;
81
+ appName: string;
82
+ roleIds: string[];
83
+ expiresAt: number;
84
+ };
85
+ }
86
+
87
+ export interface IReq_CompleteHostedAppOidcAuthorization extends plugins.typedrequestInterfaces.implementsTR<
88
+ plugins.typedrequestInterfaces.ITypedRequest,
89
+ IReq_CompleteHostedAppOidcAuthorization
90
+ > {
91
+ method: 'completeHostedAppOidcAuthorization';
92
+ request: {
93
+ identity: data.IIdentity;
94
+ requestId: string;
95
+ };
96
+ response: {
97
+ redirectUrl: string;
98
+ };
99
+ }
100
+
101
+ export interface IReq_CancelHostedAppOidcAuthorization extends plugins.typedrequestInterfaces.implementsTR<
102
+ plugins.typedrequestInterfaces.ITypedRequest,
103
+ IReq_CancelHostedAppOidcAuthorization
104
+ > {
105
+ method: 'cancelHostedAppOidcAuthorization';
106
+ request: {
107
+ identity: data.IIdentity;
108
+ requestId: string;
109
+ };
110
+ response: {
111
+ redirectUrl: string;
112
+ };
113
+ }
114
+
11
115
  export interface IReq_HostedApp_ReportLifecycleState extends plugins.typedrequestInterfaces.implementsTR<
12
116
  plugins.typedrequestInterfaces.ITypedRequest,
13
117
  IReq_HostedApp_ReportLifecycleState
@@ -304,6 +304,8 @@ extends plugins.typedrequestInterfaces.implementsTR<
304
304
  method: 'createService';
305
305
  request: {
306
306
  identity: IIdentity;
307
+ /** Canonical organization authority assigned by Cloudly to the new service. */
308
+ organizationId: string;
307
309
  serviceData: TServiceWritableData;
308
310
  };
309
311
  response: {