@openvtc/trust-tasks 0.21.3 → 0.21.5
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 +72 -0
- package/dist/_shared/components.d.ts +210 -2
- package/dist/_shared/components.d.ts.map +1 -1
- package/dist/auth/_shared/0.1/passkey-invite.d.ts +16 -0
- package/dist/auth/_shared/0.1/passkey-invite.d.ts.map +1 -0
- package/dist/auth/_shared/0.1/passkey-invite.js +6 -0
- package/dist/auth/_shared/0.1/passkey-invite.js.map +1 -0
- package/dist/auth/passkey/admin-list/0.1/payload.d.ts +484 -0
- package/dist/auth/passkey/admin-list/0.1/payload.d.ts.map +1 -0
- package/dist/auth/passkey/admin-list/0.1/payload.js +257 -0
- package/dist/auth/passkey/admin-list/0.1/payload.js.map +1 -0
- package/dist/auth/passkey/enroll/invite/list/0.1/payload.d.ts +393 -0
- package/dist/auth/passkey/enroll/invite/list/0.1/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/invite/list/0.1/payload.js +234 -0
- package/dist/auth/passkey/enroll/invite/list/0.1/payload.js.map +1 -0
- package/dist/auth/passkey/enroll/invite/revoke/0.1/payload.d.ts +228 -0
- package/dist/auth/passkey/enroll/invite/revoke/0.1/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/invite/revoke/0.1/payload.js +138 -0
- package/dist/auth/passkey/enroll/invite/revoke/0.1/payload.js.map +1 -0
- package/dist/auth/passkey/enroll/invite/update/0.1/payload.d.ts +459 -0
- package/dist/auth/passkey/enroll/invite/update/0.1/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/invite/update/0.1/payload.js +286 -0
- package/dist/auth/passkey/enroll/invite/update/0.1/payload.js.map +1 -0
- package/dist/auth/step-up/start/0.1/payload.d.ts +420 -0
- package/dist/auth/step-up/start/0.1/payload.d.ts.map +1 -0
- package/dist/auth/step-up/start/0.1/payload.js +232 -0
- package/dist/auth/step-up/start/0.1/payload.js.map +1 -0
- package/dist/did-management/_shared/0.1/service-instance.d.ts +1 -1
- package/dist/did-management/_shared/0.1/service-instance.d.ts.map +1 -1
- package/dist/did-management/_shared/0.2/metrics-snapshot.d.ts +16 -0
- package/dist/did-management/_shared/0.2/metrics-snapshot.d.ts.map +1 -0
- package/dist/did-management/_shared/0.2/metrics-snapshot.js +6 -0
- package/dist/did-management/_shared/0.2/metrics-snapshot.js.map +1 -0
- package/dist/did-management/_shared/0.2/service-instance.d.ts +16 -0
- package/dist/did-management/_shared/0.2/service-instance.d.ts.map +1 -0
- package/dist/did-management/_shared/0.2/service-instance.js +6 -0
- package/dist/did-management/_shared/0.2/service-instance.js.map +1 -0
- package/dist/did-management/agent-name/resolve/0.1/payload.d.ts +318 -0
- package/dist/did-management/agent-name/resolve/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/agent-name/resolve/0.1/payload.js +179 -0
- package/dist/did-management/agent-name/resolve/0.1/payload.js.map +1 -0
- package/dist/did-management/did/log/0.1/payload.d.ts +436 -0
- package/dist/did-management/did/log/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/did/log/0.1/payload.js +228 -0
- package/dist/did-management/did/log/0.1/payload.js.map +1 -0
- package/dist/did-management/domain/list/0.1/payload.d.ts +423 -0
- package/dist/did-management/domain/list/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/domain/list/0.1/payload.js +244 -0
- package/dist/did-management/domain/list/0.1/payload.js.map +1 -0
- package/dist/did-management/identity/list/0.1/payload.d.ts +494 -0
- package/dist/did-management/identity/list/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/identity/list/0.1/payload.js +274 -0
- package/dist/did-management/identity/list/0.1/payload.js.map +1 -0
- package/dist/did-management/identity/retire/0.1/payload.d.ts +242 -0
- package/dist/did-management/identity/retire/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/identity/retire/0.1/payload.js +142 -0
- package/dist/did-management/identity/retire/0.1/payload.js.map +1 -0
- package/dist/did-management/registry/admin-register/0.1/payload.d.ts +1 -1
- package/dist/did-management/registry/admin-register/0.1/payload.d.ts.map +1 -1
- package/dist/did-management/registry/check/0.1/payload.d.ts +639 -0
- package/dist/did-management/registry/check/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/registry/check/0.1/payload.js +383 -0
- package/dist/did-management/registry/check/0.1/payload.js.map +1 -0
- package/dist/did-management/registry/get/0.1/payload.d.ts +632 -0
- package/dist/did-management/registry/get/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/registry/get/0.1/payload.js +381 -0
- package/dist/did-management/registry/get/0.1/payload.js.map +1 -0
- package/dist/did-management/registry/list/0.1/payload.d.ts +661 -0
- package/dist/did-management/registry/list/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/registry/list/0.1/payload.js +398 -0
- package/dist/did-management/registry/list/0.1/payload.js.map +1 -0
- package/dist/did-management/registry/purge-domain/0.1/payload.d.ts +269 -0
- package/dist/did-management/registry/purge-domain/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/registry/purge-domain/0.1/payload.js +160 -0
- package/dist/did-management/registry/purge-domain/0.1/payload.js.map +1 -0
- package/dist/did-management/replica/domain/assign/0.1/payload.d.ts +233 -0
- package/dist/did-management/replica/domain/assign/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/replica/domain/assign/0.1/payload.js +143 -0
- package/dist/did-management/replica/domain/assign/0.1/payload.js.map +1 -0
- package/dist/did-management/replica/domain/purge/0.1/payload.d.ts +257 -0
- package/dist/did-management/replica/domain/purge/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/replica/domain/purge/0.1/payload.js +155 -0
- package/dist/did-management/replica/domain/purge/0.1/payload.js.map +1 -0
- package/dist/did-management/replica/domain/unassign/0.1/payload.d.ts +257 -0
- package/dist/did-management/replica/domain/unassign/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/replica/domain/unassign/0.1/payload.js +155 -0
- package/dist/did-management/replica/domain/unassign/0.1/payload.js.map +1 -0
- package/dist/did-management/replica/domain/upsert/0.1/payload.d.ts +401 -0
- package/dist/did-management/replica/domain/upsert/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/replica/domain/upsert/0.1/payload.js +241 -0
- package/dist/did-management/replica/domain/upsert/0.1/payload.js.map +1 -0
- package/dist/did-management/server/config/0.1/payload.d.ts +838 -0
- package/dist/did-management/server/config/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/server/config/0.1/payload.js +444 -0
- package/dist/did-management/server/config/0.1/payload.js.map +1 -0
- package/dist/did-management/server/info/0.1/payload.d.ts +285 -0
- package/dist/did-management/server/info/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/server/info/0.1/payload.js +160 -0
- package/dist/did-management/server/info/0.1/payload.js.map +1 -0
- package/dist/did-management/server/metrics/0.1/payload.d.ts +674 -0
- package/dist/did-management/server/metrics/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/server/metrics/0.1/payload.js +387 -0
- package/dist/did-management/server/metrics/0.1/payload.js.map +1 -0
- package/dist/did-management/stats/get/0.1/payload.d.ts +349 -0
- package/dist/did-management/stats/get/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/stats/get/0.1/payload.js +187 -0
- package/dist/did-management/stats/get/0.1/payload.js.map +1 -0
- package/dist/did-management/stats/timeseries/0.1/payload.d.ts +381 -0
- package/dist/did-management/stats/timeseries/0.1/payload.d.ts.map +1 -0
- package/dist/did-management/stats/timeseries/0.1/payload.js +227 -0
- package/dist/did-management/stats/timeseries/0.1/payload.js.map +1 -0
- package/dist/git-ns/namespace/list/0.1/payload.d.ts +1343 -0
- package/dist/git-ns/namespace/list/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/namespace/list/0.1/payload.js +704 -0
- package/dist/git-ns/namespace/list/0.1/payload.js.map +1 -0
- package/dist/git-ns/repo/list/0.1/payload.d.ts +1377 -0
- package/dist/git-ns/repo/list/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/repo/list/0.1/payload.js +744 -0
- package/dist/git-ns/repo/list/0.1/payload.js.map +1 -0
- package/dist/git-ns/view/0.5/payload.d.ts +1722 -0
- package/dist/git-ns/view/0.5/payload.d.ts.map +1 -0
- package/dist/git-ns/view/0.5/payload.js +1024 -0
- package/dist/git-ns/view/0.5/payload.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -1
- package/dist/vtc/_shared/0.1/invite.d.ts +1 -1
- package/dist/vtc/_shared/0.1/invite.d.ts.map +1 -1
- package/dist/vtc/admin/invites/list/0.1/payload.d.ts +1 -1
- package/dist/vtc/admin/invites/list/0.1/payload.d.ts.map +1 -1
- package/dist/webvh/_shared/0.1/sync-update.d.ts +16 -0
- package/dist/webvh/_shared/0.1/sync-update.d.ts.map +1 -0
- package/dist/webvh/_shared/0.1/sync-update.js +6 -0
- package/dist/webvh/_shared/0.1/sync-update.js.map +1 -0
- package/dist/webvh/_shared/0.1/witness-key.d.ts +16 -0
- package/dist/webvh/_shared/0.1/witness-key.d.ts.map +1 -0
- package/dist/webvh/_shared/0.1/witness-key.js +6 -0
- package/dist/webvh/_shared/0.1/witness-key.js.map +1 -0
- package/dist/webvh/sync/batch/0.1/payload.d.ts +503 -0
- package/dist/webvh/sync/batch/0.1/payload.d.ts.map +1 -0
- package/dist/webvh/sync/batch/0.1/payload.js +290 -0
- package/dist/webvh/sync/batch/0.1/payload.js.map +1 -0
- package/dist/webvh/sync/delete/0.2/payload.d.ts +242 -0
- package/dist/webvh/sync/delete/0.2/payload.d.ts.map +1 -0
- package/dist/webvh/sync/delete/0.2/payload.js +148 -0
- package/dist/webvh/sync/delete/0.2/payload.js.map +1 -0
- package/dist/webvh/sync/update/0.2/payload.d.ts +315 -0
- package/dist/webvh/sync/update/0.2/payload.d.ts.map +1 -0
- package/dist/webvh/sync/update/0.2/payload.js +177 -0
- package/dist/webvh/sync/update/0.2/payload.js.map +1 -0
- package/dist/webvh/witness/key/create/0.1/payload.d.ts +346 -0
- package/dist/webvh/witness/key/create/0.1/payload.d.ts.map +1 -0
- package/dist/webvh/witness/key/create/0.1/payload.js +202 -0
- package/dist/webvh/witness/key/create/0.1/payload.js.map +1 -0
- package/dist/webvh/witness/key/delete/0.1/payload.d.ts +237 -0
- package/dist/webvh/witness/key/delete/0.1/payload.d.ts.map +1 -0
- package/dist/webvh/witness/key/delete/0.1/payload.js +141 -0
- package/dist/webvh/witness/key/delete/0.1/payload.js.map +1 -0
- package/dist/webvh/witness/key/list/0.1/payload.d.ts +349 -0
- package/dist/webvh/witness/key/list/0.1/payload.d.ts.map +1 -0
- package/dist/webvh/witness/key/list/0.1/payload.js +204 -0
- package/dist/webvh/witness/key/list/0.1/payload.js.map +1 -0
- package/dist/webvh/witness/sign/0.1/payload.d.ts +401 -0
- package/dist/webvh/witness/sign/0.1/payload.d.ts.map +1 -0
- package/dist/webvh/witness/sign/0.1/payload.js +229 -0
- package/dist/webvh/witness/sign/0.1/payload.js.map +1 -0
- package/package.json +1 -1
- package/src/_shared/components.ts +210 -2
- package/src/auth/_shared/0.1/passkey-invite.ts +17 -0
- package/src/auth/passkey/admin-list/0.1/payload.ts +338 -0
- package/src/auth/passkey/enroll/invite/list/0.1/payload.ts +266 -0
- package/src/auth/passkey/enroll/invite/revoke/0.1/payload.ts +165 -0
- package/src/auth/passkey/enroll/invite/update/0.1/payload.ts +327 -0
- package/src/auth/step-up/start/0.1/payload.ts +287 -0
- package/src/did-management/_shared/0.1/service-instance.ts +1 -1
- package/src/did-management/_shared/0.2/metrics-snapshot.ts +17 -0
- package/src/did-management/_shared/0.2/service-instance.ts +17 -0
- package/src/did-management/agent-name/resolve/0.1/payload.ts +222 -0
- package/src/did-management/did/log/0.1/payload.ts +295 -0
- package/src/did-management/domain/list/0.1/payload.ts +280 -0
- package/src/did-management/identity/list/0.1/payload.ts +335 -0
- package/src/did-management/identity/retire/0.1/payload.ts +175 -0
- package/src/did-management/registry/admin-register/0.1/payload.ts +1 -1
- package/src/did-management/registry/check/0.1/payload.ts +415 -0
- package/src/did-management/registry/get/0.1/payload.ts +410 -0
- package/src/did-management/registry/list/0.1/payload.ts +434 -0
- package/src/did-management/registry/purge-domain/0.1/payload.ts +198 -0
- package/src/did-management/replica/domain/assign/0.1/payload.ts +173 -0
- package/src/did-management/replica/domain/purge/0.1/payload.ts +189 -0
- package/src/did-management/replica/domain/unassign/0.1/payload.ts +189 -0
- package/src/did-management/replica/domain/upsert/0.1/payload.ts +271 -0
- package/src/did-management/server/config/0.1/payload.ts +545 -0
- package/src/did-management/server/info/0.1/payload.ts +200 -0
- package/src/did-management/server/metrics/0.1/payload.ts +418 -0
- package/src/did-management/stats/get/0.1/payload.ts +237 -0
- package/src/did-management/stats/timeseries/0.1/payload.ts +279 -0
- package/src/git-ns/namespace/list/0.1/payload.ts +883 -0
- package/src/git-ns/repo/list/0.1/payload.ts +909 -0
- package/src/git-ns/view/0.5/payload.ts +1095 -0
- package/src/index.ts +38 -0
- package/src/vtc/_shared/0.1/invite.ts +1 -1
- package/src/vtc/admin/invites/list/0.1/payload.ts +1 -1
- package/src/webvh/_shared/0.1/sync-update.ts +17 -0
- package/src/webvh/_shared/0.1/witness-key.ts +17 -0
- package/src/webvh/sync/batch/0.1/payload.ts +336 -0
- package/src/webvh/sync/delete/0.2/payload.ts +181 -0
- package/src/webvh/sync/update/0.2/payload.ts +233 -0
- package/src/webvh/witness/key/create/0.1/payload.ts +231 -0
- package/src/webvh/witness/key/delete/0.1/payload.ts +171 -0
- package/src/webvh/witness/key/list/0.1/payload.ts +232 -0
- package/src/webvh/witness/sign/0.1/payload.ts +279 -0
|
@@ -0,0 +1,1722 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
|
|
3
|
+
* Source: specs/git-ns/view/0.5/payload.schema.json
|
|
4
|
+
*/
|
|
5
|
+
import type { Bootstrap, BreakGlass, Did_GitNsV0_3 as Did, DriftItem, Ext, ForgeAccount, ForgeHost, ForgeId, GitNamespace, NamespaceId, RepoResource, RepoSummary_GitNsV0_3 as RepoSummary, RepoVisibility, Resource, Right, RightRecord_GitNsV0_4 as RightRecord, Segment, Sync } from "../../../_shared/components.js";
|
|
6
|
+
/**
|
|
7
|
+
* A member reads the namespaces, repositories and rights they are entitled to see, optionally narrowed to one resource, together with the forge accounts linked to their own DID. An administrator may instead ask for everything in the namespaces they administer, and either may narrow the rights to break-glass records.
|
|
8
|
+
*/
|
|
9
|
+
export interface GitNamespacesViewPayload {
|
|
10
|
+
/**
|
|
11
|
+
* Narrow the answer to this resource and everything inside it. Absent: everything the caller may see.
|
|
12
|
+
*/
|
|
13
|
+
resource?: Resource;
|
|
14
|
+
/**
|
|
15
|
+
* `member` (the default) — what the caller may see through their own git rights, exactly as in 0.4. `administrator` — everything in the namespaces the caller administers (every namespace, for a holder of the community-administrator capability; those they hold `git.ns.admin` on, for anyone else), reasons included. Refused with `git-ns/view:notAdministrator` when the caller administers no namespace within `resource`. Absent means `"member"`; this carries no schema-level default, so a producer that omits it is not normalised into sending it.
|
|
16
|
+
*/
|
|
17
|
+
scope?: "member" | "administrator";
|
|
18
|
+
/**
|
|
19
|
+
* `true` narrows `rights` to the records carrying `breakGlass` — ratified ones included — and `namespaces` and `repos` to those that contain such a record. `false` or absent: no narrowing. Absent means `false`; this carries no schema-level default, so a producer that omits it is not normalised into sending it.
|
|
20
|
+
*/
|
|
21
|
+
breakGlass?: boolean;
|
|
22
|
+
ext?: Ext;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* What the caller may see — or, with `scope: administrator`, everything in the namespaces they administer — and the caller's own linked forge accounts.
|
|
26
|
+
*/
|
|
27
|
+
export interface GitNamespacesViewResponsePayload {
|
|
28
|
+
/**
|
|
29
|
+
* Namespaces bound to this VTC that contain, or are contained by, `resource`. With `scope: administrator`, only those the caller administers. With `breakGlass: true`, only those containing a returned record.
|
|
30
|
+
*/
|
|
31
|
+
namespaces: GitNamespace[];
|
|
32
|
+
/**
|
|
33
|
+
* Repositories within `resource`. `unmanaged` repositories are included only for callers holding `git.ns.admin` over them, or with `scope: administrator`. With `breakGlass: true`, only those carrying a returned record.
|
|
34
|
+
*/
|
|
35
|
+
repos: RepoSummary[];
|
|
36
|
+
/**
|
|
37
|
+
* Rights within `resource` the caller may see: always the caller's own; every right on a resource the caller owns or administers; every unratified break-glass record in a namespace they administer or on a resource they own. With `scope: administrator`, every recorded right in the namespaces the caller administers. `reason` is omitted except on resources the caller owns or administers. With `breakGlass: true`, only records carrying `breakGlass`.
|
|
38
|
+
*/
|
|
39
|
+
rights: RightRecord[];
|
|
40
|
+
/**
|
|
41
|
+
* The forge accounts linked to the caller's own DID — never another member's — at most one per forge. With `resource`, only the account on that resource's forge. Empty when the caller has linked none.
|
|
42
|
+
*/
|
|
43
|
+
accounts: LinkedAccount[];
|
|
44
|
+
ext?: Ext;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A forge account linked to the caller's DID with git-ns/account/link, and when the link completed.
|
|
48
|
+
*/
|
|
49
|
+
export interface LinkedAccount {
|
|
50
|
+
/**
|
|
51
|
+
* The linked account. `id` is authoritative; `login` is as the forge last reported it.
|
|
52
|
+
*/
|
|
53
|
+
account: ForgeAccount;
|
|
54
|
+
/**
|
|
55
|
+
* When the link completed: when the VTC recorded the account against the caller's DID.
|
|
56
|
+
*/
|
|
57
|
+
linkedAt: string;
|
|
58
|
+
}
|
|
59
|
+
/** Shared definitions this specification references, re-exported under the names it used to declare them with. */
|
|
60
|
+
export type { Bootstrap, BreakGlass, Did, DriftItem, Ext, ForgeAccount, ForgeHost, ForgeId, GitNamespace, NamespaceId, RepoResource, RepoSummary, RepoVisibility, Resource, Right, RightRecord, Segment, Sync };
|
|
61
|
+
/** Trust Task type URI. */
|
|
62
|
+
export declare const TYPE_URI: "https://trusttasks.org/spec/git-ns/view/0.5";
|
|
63
|
+
/** Stable alias for this specification's request payload shape. */
|
|
64
|
+
export type Payload = GitNamespacesViewPayload;
|
|
65
|
+
/** Trust Task response type URI (request type URI + "#response"). */
|
|
66
|
+
export declare const RESPONSE_TYPE_URI: "https://trusttasks.org/spec/git-ns/view/0.5#response";
|
|
67
|
+
/** Stable alias for this specification's success-response payload shape. */
|
|
68
|
+
export type Response = GitNamespacesViewResponsePayload;
|
|
69
|
+
/**
|
|
70
|
+
* This specification's payload schema, as a value.
|
|
71
|
+
*
|
|
72
|
+
* SPEC.md §7.2 item 2 is performed against this. It is shipped as data
|
|
73
|
+
* rather than only as a `.json` file because TypeScript types are erased
|
|
74
|
+
* at runtime: without a schema a consumer has nothing to validate, and
|
|
75
|
+
* every REQUIRED payload member is optional in practice. Cross-file
|
|
76
|
+
* `$ref`s are already inlined, so it needs no resolver.
|
|
77
|
+
*/
|
|
78
|
+
export declare const PAYLOAD_SCHEMA: {
|
|
79
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
80
|
+
readonly $id: "https://trusttasks.org/spec/git-ns/view/0.5";
|
|
81
|
+
readonly title: "Git Namespaces — View — payload";
|
|
82
|
+
readonly description: "A member reads the namespaces, repositories and rights they are entitled to see, optionally narrowed to one resource, together with the forge accounts linked to their own DID. An administrator may instead ask for everything in the namespaces they administer, and either may narrow the rights to break-glass records.";
|
|
83
|
+
readonly type: "object";
|
|
84
|
+
readonly additionalProperties: false;
|
|
85
|
+
readonly required: readonly [];
|
|
86
|
+
readonly properties: {
|
|
87
|
+
readonly resource: {
|
|
88
|
+
readonly $ref: "#/$defs/Resource";
|
|
89
|
+
readonly description: "Narrow the answer to this resource and everything inside it. Absent: everything the caller may see.";
|
|
90
|
+
};
|
|
91
|
+
readonly scope: {
|
|
92
|
+
readonly type: "string";
|
|
93
|
+
readonly enum: readonly ["member", "administrator"];
|
|
94
|
+
readonly description: "`member` (the default) — what the caller may see through their own git rights, exactly as in 0.4. `administrator` — everything in the namespaces the caller administers (every namespace, for a holder of the community-administrator capability; those they hold `git.ns.admin` on, for anyone else), reasons included. Refused with `git-ns/view:notAdministrator` when the caller administers no namespace within `resource`. Absent means `\"member\"`; this carries no schema-level default, so a producer that omits it is not normalised into sending it.";
|
|
95
|
+
};
|
|
96
|
+
readonly breakGlass: {
|
|
97
|
+
readonly type: "boolean";
|
|
98
|
+
readonly description: "`true` narrows `rights` to the records carrying `breakGlass` — ratified ones included — and `namespaces` and `repos` to those that contain such a record. `false` or absent: no narrowing. Absent means `false`; this carries no schema-level default, so a producer that omits it is not normalised into sending it.";
|
|
99
|
+
};
|
|
100
|
+
readonly ext: {
|
|
101
|
+
readonly $ref: "#/$defs/Ext";
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
readonly $defs: {
|
|
105
|
+
readonly LinkedAccount: {
|
|
106
|
+
readonly title: "LinkedAccount";
|
|
107
|
+
readonly description: "A forge account linked to the caller's DID with git-ns/account/link, and when the link completed.";
|
|
108
|
+
readonly type: "object";
|
|
109
|
+
readonly additionalProperties: false;
|
|
110
|
+
readonly required: readonly ["account", "linkedAt"];
|
|
111
|
+
readonly properties: {
|
|
112
|
+
readonly account: {
|
|
113
|
+
readonly $ref: "#/$defs/ForgeAccount";
|
|
114
|
+
readonly description: "The linked account. `id` is authoritative; `login` is as the forge last reported it.";
|
|
115
|
+
};
|
|
116
|
+
readonly linkedAt: {
|
|
117
|
+
readonly type: "string";
|
|
118
|
+
readonly format: "date-time";
|
|
119
|
+
readonly description: "When the link completed: when the VTC recorded the account against the caller's DID.";
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
readonly Response: {
|
|
124
|
+
readonly $anchor: "response";
|
|
125
|
+
readonly title: "Git Namespaces — View — response payload";
|
|
126
|
+
readonly description: "What the caller may see — or, with `scope: administrator`, everything in the namespaces they administer — and the caller's own linked forge accounts.";
|
|
127
|
+
readonly type: "object";
|
|
128
|
+
readonly additionalProperties: false;
|
|
129
|
+
readonly required: readonly ["namespaces", "repos", "rights", "accounts"];
|
|
130
|
+
readonly properties: {
|
|
131
|
+
readonly namespaces: {
|
|
132
|
+
readonly type: "array";
|
|
133
|
+
readonly items: {
|
|
134
|
+
readonly $ref: "#/$defs/GitNamespace";
|
|
135
|
+
};
|
|
136
|
+
readonly description: "Namespaces bound to this VTC that contain, or are contained by, `resource`. With `scope: administrator`, only those the caller administers. With `breakGlass: true`, only those containing a returned record.";
|
|
137
|
+
};
|
|
138
|
+
readonly repos: {
|
|
139
|
+
readonly type: "array";
|
|
140
|
+
readonly items: {
|
|
141
|
+
readonly $ref: "#/$defs/RepoSummary";
|
|
142
|
+
};
|
|
143
|
+
readonly description: "Repositories within `resource`. `unmanaged` repositories are included only for callers holding `git.ns.admin` over them, or with `scope: administrator`. With `breakGlass: true`, only those carrying a returned record.";
|
|
144
|
+
};
|
|
145
|
+
readonly rights: {
|
|
146
|
+
readonly type: "array";
|
|
147
|
+
readonly items: {
|
|
148
|
+
readonly $ref: "#/$defs/RightRecord";
|
|
149
|
+
};
|
|
150
|
+
readonly description: "Rights within `resource` the caller may see: always the caller's own; every right on a resource the caller owns or administers; every unratified break-glass record in a namespace they administer or on a resource they own. With `scope: administrator`, every recorded right in the namespaces the caller administers. `reason` is omitted except on resources the caller owns or administers. With `breakGlass: true`, only records carrying `breakGlass`.";
|
|
151
|
+
};
|
|
152
|
+
readonly accounts: {
|
|
153
|
+
readonly type: "array";
|
|
154
|
+
readonly items: {
|
|
155
|
+
readonly $ref: "#/$defs/LinkedAccount";
|
|
156
|
+
};
|
|
157
|
+
readonly description: "The forge accounts linked to the caller's own DID — never another member's — at most one per forge. With `resource`, only the account on that resource's forge. Empty when the caller has linked none.";
|
|
158
|
+
};
|
|
159
|
+
readonly ext: {
|
|
160
|
+
readonly $ref: "#/$defs/Ext";
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
readonly Ext: {
|
|
165
|
+
readonly title: "Ext";
|
|
166
|
+
readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
|
|
167
|
+
readonly type: "object";
|
|
168
|
+
readonly minProperties: 1;
|
|
169
|
+
readonly additionalProperties: true;
|
|
170
|
+
readonly propertyNames: {
|
|
171
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
readonly RightRecord: {
|
|
175
|
+
readonly title: "RightRecord";
|
|
176
|
+
readonly description: "One recorded right. Implied rights (§4.2 of the rights model: `own` implies `maintain` implies `commit.sign` on the same resource; `ns.admin` implies `repo.create` and `own` across its namespace) are not records and never appear as RightRecords. A record carrying `breakGlass` was given by its subject to themselves through git-ns/right/break-glass; it is a real right, published like any other, and is shown with that flag on every surface that shows the record.";
|
|
177
|
+
readonly type: "object";
|
|
178
|
+
readonly additionalProperties: false;
|
|
179
|
+
readonly required: readonly ["subject", "right", "resource", "grantedBy", "grantedAt"];
|
|
180
|
+
readonly properties: {
|
|
181
|
+
readonly subject: {
|
|
182
|
+
readonly $ref: "#/$defs/Did";
|
|
183
|
+
readonly description: "Who holds the right. For `git.commit.sign` this is the DID whose commit signatures the CI check accepts.";
|
|
184
|
+
};
|
|
185
|
+
readonly right: {
|
|
186
|
+
readonly $ref: "#/$defs/Right";
|
|
187
|
+
};
|
|
188
|
+
readonly resource: {
|
|
189
|
+
readonly $ref: "#/$defs/Resource";
|
|
190
|
+
};
|
|
191
|
+
readonly grantedBy: {
|
|
192
|
+
readonly $ref: "#/$defs/Did";
|
|
193
|
+
readonly description: "The actor whose task caused the right: the granter, the creator of a repository (for its first `own`), the adopting admin, the transferring owner, or the binding admin (for the first `git.ns.admin`). The VTC's own DID for a right it derives from its configuration.";
|
|
194
|
+
};
|
|
195
|
+
readonly grantedAt: {
|
|
196
|
+
readonly type: "string";
|
|
197
|
+
readonly format: "date-time";
|
|
198
|
+
};
|
|
199
|
+
readonly expiresAt: {
|
|
200
|
+
readonly type: "string";
|
|
201
|
+
readonly format: "date-time";
|
|
202
|
+
readonly description: "When the right lapses. Absent: no expiry.";
|
|
203
|
+
};
|
|
204
|
+
readonly reason: {
|
|
205
|
+
readonly type: "string";
|
|
206
|
+
readonly maxLength: 1024;
|
|
207
|
+
readonly description: "The granter's free-text reason. Disclosed only to holders of `git.repo.own` on the resource and of `git.ns.admin` over it.";
|
|
208
|
+
};
|
|
209
|
+
readonly breakGlass: {
|
|
210
|
+
readonly $ref: "#/$defs/BreakGlass";
|
|
211
|
+
readonly description: "Present exactly when the subject gave themselves this right through git-ns/right/break-glass. Absent for every other record.";
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
readonly BreakGlass: {
|
|
216
|
+
readonly title: "BreakGlass";
|
|
217
|
+
readonly description: "How a self-granted right came to be, and whether another administrator has since ratified it. A record whose `breakGlass` has no `ratifiedBy` is **unratified**: it is live and published like any other right, it does not count toward the last-owner or last-admin invariants, and any community administrator or namespace admin of its namespace may revoke it. Ratification (git-ns/right/ratify) sets `ratifiedBy` and `ratifiedAt`; from then on the record is an ordinary grant, and `breakGlass` stays as its history. Never published to the Trust Registry.";
|
|
218
|
+
readonly type: "object";
|
|
219
|
+
readonly additionalProperties: false;
|
|
220
|
+
readonly required: readonly ["by", "at", "justification"];
|
|
221
|
+
readonly properties: {
|
|
222
|
+
readonly by: {
|
|
223
|
+
readonly $ref: "#/$defs/Did";
|
|
224
|
+
readonly description: "Who broke the glass: always the record's `subject`, restated so the flag reads on its own.";
|
|
225
|
+
};
|
|
226
|
+
readonly at: {
|
|
227
|
+
readonly type: "string";
|
|
228
|
+
readonly format: "date-time";
|
|
229
|
+
readonly description: "When the VTC recorded the break-glass.";
|
|
230
|
+
};
|
|
231
|
+
readonly justification: {
|
|
232
|
+
readonly type: "string";
|
|
233
|
+
readonly minLength: 1;
|
|
234
|
+
readonly maxLength: 2048;
|
|
235
|
+
readonly pattern: "\\S";
|
|
236
|
+
readonly description: "The actor's statement of why nobody else could grant this right. Shown to every community administrator, every namespace admin of the namespace and every owner of the resource; kept in the audit record; never published.";
|
|
237
|
+
};
|
|
238
|
+
readonly effectiveAt: {
|
|
239
|
+
readonly type: "string";
|
|
240
|
+
readonly format: "date-time";
|
|
241
|
+
readonly description: "When the right takes effect, where the community's policy imposed a delay. Absent: it took effect at `at`. Until this instant the record confers nothing and is not published, and any administrator who may revoke it may do so.";
|
|
242
|
+
};
|
|
243
|
+
readonly ratifiedBy: {
|
|
244
|
+
readonly $ref: "#/$defs/Did";
|
|
245
|
+
readonly description: "The administrator who ratified the record — never its subject. Absent while unratified.";
|
|
246
|
+
};
|
|
247
|
+
readonly ratifiedAt: {
|
|
248
|
+
readonly type: "string";
|
|
249
|
+
readonly format: "date-time";
|
|
250
|
+
readonly description: "When it was ratified. Present exactly when `ratifiedBy` is.";
|
|
251
|
+
};
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
readonly Did: {
|
|
255
|
+
readonly title: "Did";
|
|
256
|
+
readonly description: "A bare DID in the W3C DID Core syntax (§3.1): `did:`, a method name of lowercase letters and digits, `:`, and a method-specific id of colon-separated segments drawn from `A-Z a-z 0-9 . - _` and percent-encoded octets, the last segment non-empty. A DID URL is not a DID: no path, query or fragment (`/`, `?`, `#`), so a verification-method id such as `did:key:z6Mk…#z6Mk…` is refused. Compared by exact string equality — no case folding or percent-decoding. A consumer MUST still treat the value as data: the pattern keeps shell metacharacters, whitespace and quotes out of the wire form, but it does not make a DID safe to splice into a command or markup.";
|
|
257
|
+
readonly type: "string";
|
|
258
|
+
readonly maxLength: 2048;
|
|
259
|
+
readonly pattern: "^did:[a-z0-9]+:(?:(?:[A-Za-z0-9._-]|%[0-9A-Fa-f]{2})*:)*(?:[A-Za-z0-9._-]|%[0-9A-Fa-f]{2})+$";
|
|
260
|
+
};
|
|
261
|
+
readonly Resource: {
|
|
262
|
+
readonly title: "Resource";
|
|
263
|
+
readonly description: "A forge-qualified resource: `<forge-host>/<owner>` for a namespace, or `<forge-host>/<owner>/<repo>` for one repository, all lowercase — `github.com/acme`, `github.com/acme/widgets`, `codeberg.org/acme`. The forge is never implied: `acme/widgets` alone is not a resource. Containment is by whole segment: `github.com/acme` contains `github.com/acme/widgets` and does not contain `github.com/acme-labs/x` or `codeberg.org/acme/widgets`.";
|
|
264
|
+
readonly type: "string";
|
|
265
|
+
readonly maxLength: 455;
|
|
266
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+(?:/[a-z0-9_-][a-z0-9._-]{0,99}){1,2}$";
|
|
267
|
+
};
|
|
268
|
+
readonly Right: {
|
|
269
|
+
readonly title: "Right";
|
|
270
|
+
readonly description: "One of the five git rights. Each string is also the TRQP `action` the VTC publishes the right under in its Trust Registry, so it is carried verbatim. `git.ns.admin` and `git.repo.create` apply to a namespace resource; `git.repo.own` and `git.repo.maintain` to a repository resource; `git.commit.sign` to either.";
|
|
271
|
+
readonly type: "string";
|
|
272
|
+
readonly enum: readonly ["git.ns.admin", "git.repo.create", "git.repo.own", "git.repo.maintain", "git.commit.sign"];
|
|
273
|
+
};
|
|
274
|
+
readonly RepoSummary: {
|
|
275
|
+
readonly title: "RepoSummary";
|
|
276
|
+
readonly description: "One repository as the VTC records it.";
|
|
277
|
+
readonly type: "object";
|
|
278
|
+
readonly additionalProperties: false;
|
|
279
|
+
readonly required: readonly ["resource", "visibility", "state", "owners", "bootstrap", "sync"];
|
|
280
|
+
readonly properties: {
|
|
281
|
+
readonly resource: {
|
|
282
|
+
readonly $ref: "#/$defs/RepoResource";
|
|
283
|
+
};
|
|
284
|
+
readonly forgeId: {
|
|
285
|
+
readonly $ref: "#/$defs/ForgeId";
|
|
286
|
+
readonly description: "The forge's repository id. Absent until the forge has confirmed the repository exists (a `pendingCreate` repository, or one adopted in bridge mode before the first inspection).";
|
|
287
|
+
};
|
|
288
|
+
readonly visibility: {
|
|
289
|
+
readonly $ref: "#/$defs/RepoVisibility";
|
|
290
|
+
};
|
|
291
|
+
readonly state: {
|
|
292
|
+
readonly type: "string";
|
|
293
|
+
readonly enum: readonly ["pendingCreate", "active", "archived", "detached", "orphaned", "unmanaged"];
|
|
294
|
+
readonly description: "`pendingCreate` — the name is reserved and the repository is not yet confirmed on the forge. `active` — managed. `archived` — archived through git-ns/repo/archive; commit rights on it are revoked. `detached` — no longer governed: its namespace was unbound, or it moved outside the namespace. `orphaned` — its last owner left the community and ownership passed to the namespace admins, who have not yet named a new owner. `unmanaged` — it exists on the forge inside a bound namespace but was never created or adopted through the VTC.";
|
|
295
|
+
};
|
|
296
|
+
readonly owners: {
|
|
297
|
+
readonly type: "array";
|
|
298
|
+
readonly uniqueItems: true;
|
|
299
|
+
readonly items: {
|
|
300
|
+
readonly $ref: "#/$defs/Did";
|
|
301
|
+
};
|
|
302
|
+
readonly description: "The DIDs holding `git.repo.own` on this repository by an explicit grant. Empty only for an `unmanaged` repository, and for an `orphaned` one whose ownership rests with the namespace admins by implication.";
|
|
303
|
+
};
|
|
304
|
+
readonly bootstrap: {
|
|
305
|
+
readonly $ref: "#/$defs/Bootstrap";
|
|
306
|
+
};
|
|
307
|
+
readonly sync: {
|
|
308
|
+
readonly $ref: "#/$defs/Sync";
|
|
309
|
+
};
|
|
310
|
+
};
|
|
311
|
+
};
|
|
312
|
+
readonly Sync: {
|
|
313
|
+
readonly title: "Sync";
|
|
314
|
+
readonly description: "How the forge compares with the VTC's projection for one repository.";
|
|
315
|
+
readonly type: "object";
|
|
316
|
+
readonly additionalProperties: false;
|
|
317
|
+
readonly required: readonly ["state", "drift"];
|
|
318
|
+
readonly properties: {
|
|
319
|
+
readonly state: {
|
|
320
|
+
readonly type: "string";
|
|
321
|
+
readonly enum: readonly ["inSync", "drift", "pending", "unchecked"];
|
|
322
|
+
readonly description: "`inSync` — the last comparison found no drift. `drift` — it found some, listed in `drift`. `pending` — a change has been sent to the forge and not yet confirmed. `unchecked` — nothing compares this repository (a manual-mode namespace).";
|
|
323
|
+
};
|
|
324
|
+
readonly checkedAt: {
|
|
325
|
+
readonly type: "string";
|
|
326
|
+
readonly format: "date-time";
|
|
327
|
+
readonly description: "When the forge was last compared. Absent if never.";
|
|
328
|
+
};
|
|
329
|
+
readonly drift: {
|
|
330
|
+
readonly type: "array";
|
|
331
|
+
readonly items: {
|
|
332
|
+
readonly $ref: "#/$defs/DriftItem";
|
|
333
|
+
};
|
|
334
|
+
readonly description: "Outstanding drift. Empty unless `state` is `drift`.";
|
|
335
|
+
};
|
|
336
|
+
};
|
|
337
|
+
};
|
|
338
|
+
readonly DriftItem: {
|
|
339
|
+
readonly title: "DriftItem";
|
|
340
|
+
readonly description: "One difference between the forge's observed state and the VTC's projection of a repository.";
|
|
341
|
+
readonly type: "object";
|
|
342
|
+
readonly additionalProperties: false;
|
|
343
|
+
readonly required: readonly ["type", "resource"];
|
|
344
|
+
readonly properties: {
|
|
345
|
+
readonly type: {
|
|
346
|
+
readonly type: "string";
|
|
347
|
+
readonly enum: readonly ["roleAdded", "roleRemoved", "roleChanged", "requiredCheckMissing", "protectionWeakened", "bootstrapMissing"];
|
|
348
|
+
readonly description: "`roleAdded` — someone holds a forge role the projection does not give them. `roleRemoved` — a projected role is missing. `roleChanged` — a projected role is present at another level. `requiredCheckMissing` — the verify-trust check is no longer required. `protectionWeakened` — branch protection or a ruleset is weaker than the projection in another way (force-push allowed, bypass actors added). `bootstrapMissing` — a bootstrap file or variable is gone.";
|
|
349
|
+
};
|
|
350
|
+
readonly resource: {
|
|
351
|
+
readonly $ref: "#/$defs/RepoResource";
|
|
352
|
+
};
|
|
353
|
+
readonly account: {
|
|
354
|
+
readonly $ref: "#/$defs/ForgeAccount";
|
|
355
|
+
readonly description: "Whose role differs, for the three role types.";
|
|
356
|
+
};
|
|
357
|
+
readonly observed: {
|
|
358
|
+
readonly type: "string";
|
|
359
|
+
readonly maxLength: 256;
|
|
360
|
+
readonly description: "What the forge shows, in the forge's own vocabulary (a role name such as `maintain`, a setting name). Absent when nothing is there.";
|
|
361
|
+
};
|
|
362
|
+
readonly expected: {
|
|
363
|
+
readonly type: "string";
|
|
364
|
+
readonly maxLength: 256;
|
|
365
|
+
readonly description: "What the projection calls for, in the forge's own vocabulary. Absent when the projection calls for nothing.";
|
|
366
|
+
};
|
|
367
|
+
};
|
|
368
|
+
};
|
|
369
|
+
readonly ForgeAccount: {
|
|
370
|
+
readonly title: "ForgeAccount";
|
|
371
|
+
readonly description: "A person's account on one forge. `id` is authoritative; `login` is for display only, because logins can be renamed and re-registered.";
|
|
372
|
+
readonly type: "object";
|
|
373
|
+
readonly additionalProperties: false;
|
|
374
|
+
readonly required: readonly ["forge", "id", "login"];
|
|
375
|
+
readonly properties: {
|
|
376
|
+
readonly forge: {
|
|
377
|
+
readonly $ref: "#/$defs/ForgeHost";
|
|
378
|
+
};
|
|
379
|
+
readonly id: {
|
|
380
|
+
readonly $ref: "#/$defs/ForgeId";
|
|
381
|
+
};
|
|
382
|
+
readonly login: {
|
|
383
|
+
readonly type: "string";
|
|
384
|
+
readonly minLength: 1;
|
|
385
|
+
readonly maxLength: 100;
|
|
386
|
+
readonly description: "The account's current login, as the forge reported it when last seen. Display only.";
|
|
387
|
+
};
|
|
388
|
+
};
|
|
389
|
+
};
|
|
390
|
+
readonly ForgeId: {
|
|
391
|
+
readonly title: "ForgeId";
|
|
392
|
+
readonly description: "An identifier the forge itself assigns — a repository id, a user or organisation id — carried as a string so a forge whose ids are not numbers needs no new version. GitHub and Forgejo ids are decimal integers written as strings (`\"812736451\"`). Unlike a name, it survives renames and transfers, which is why rights and bindings are keyed by it.";
|
|
393
|
+
readonly type: "string";
|
|
394
|
+
readonly minLength: 1;
|
|
395
|
+
readonly maxLength: 64;
|
|
396
|
+
};
|
|
397
|
+
readonly ForgeHost: {
|
|
398
|
+
readonly title: "ForgeHost";
|
|
399
|
+
readonly description: "The lowercased DNS host of a forge: `github.com`, a GitHub Enterprise Server host, `codeberg.org`, or a self-hosted Forgejo instance such as `git.example.org`. No scheme, no port, no path. The host is a segment of every resource, so a right never crosses forges.";
|
|
400
|
+
readonly type: "string";
|
|
401
|
+
readonly minLength: 3;
|
|
402
|
+
readonly maxLength: 253;
|
|
403
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$";
|
|
404
|
+
};
|
|
405
|
+
readonly RepoResource: {
|
|
406
|
+
readonly title: "RepoResource";
|
|
407
|
+
readonly description: "A forge-qualified resource naming exactly one repository: `<forge-host>/<owner>/<repo>`, lowercase.";
|
|
408
|
+
readonly type: "string";
|
|
409
|
+
readonly maxLength: 455;
|
|
410
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+/[a-z0-9_-][a-z0-9._-]{0,99}/[a-z0-9_-][a-z0-9._-]{0,99}$";
|
|
411
|
+
};
|
|
412
|
+
readonly Bootstrap: {
|
|
413
|
+
readonly title: "Bootstrap";
|
|
414
|
+
readonly description: "Whether each step that turns commit trust on for a repository is in place, as last reported. A step that this forge's plan does not need reads `true`.";
|
|
415
|
+
readonly type: "object";
|
|
416
|
+
readonly additionalProperties: false;
|
|
417
|
+
readonly required: readonly ["workflow", "keyring", "variables", "requiredCheck"];
|
|
418
|
+
readonly properties: {
|
|
419
|
+
readonly workflow: {
|
|
420
|
+
readonly type: "boolean";
|
|
421
|
+
readonly description: "The verify-trust check runs on the repository's pull requests — from a workflow committed to it, or, where the forge supports it, required on it from the namespace's own bridge-managed workflow repository at a pinned commit.";
|
|
422
|
+
};
|
|
423
|
+
readonly keyring: {
|
|
424
|
+
readonly type: "boolean";
|
|
425
|
+
readonly description: "The exempt platform keyring for forge-signed merge commits is committed, or the forge's plan does not need one.";
|
|
426
|
+
};
|
|
427
|
+
readonly variables: {
|
|
428
|
+
readonly type: "boolean";
|
|
429
|
+
readonly description: "The repository names the Trust Registry and this VTC as its trust anchors.";
|
|
430
|
+
};
|
|
431
|
+
readonly requiredCheck: {
|
|
432
|
+
readonly type: "boolean";
|
|
433
|
+
readonly description: "The forge refuses to merge into the default branch unless the verify-trust check passes, with no bypass, and a pull request cannot change what that check runs: an organisation-required workflow, code-owner review of workflow files, or protected workflow paths, as the forge allows.";
|
|
434
|
+
};
|
|
435
|
+
};
|
|
436
|
+
};
|
|
437
|
+
readonly RepoVisibility: {
|
|
438
|
+
readonly title: "RepoVisibility";
|
|
439
|
+
readonly type: "string";
|
|
440
|
+
readonly enum: readonly ["public", "private"];
|
|
441
|
+
readonly description: "Repository visibility on the forge.";
|
|
442
|
+
};
|
|
443
|
+
readonly GitNamespace: {
|
|
444
|
+
readonly title: "GitNamespace";
|
|
445
|
+
readonly description: "The VTC's binding to one owner on one forge.";
|
|
446
|
+
readonly type: "object";
|
|
447
|
+
readonly additionalProperties: false;
|
|
448
|
+
readonly required: readonly ["id", "forge", "owner", "mode", "state"];
|
|
449
|
+
readonly properties: {
|
|
450
|
+
readonly id: {
|
|
451
|
+
readonly $ref: "#/$defs/NamespaceId";
|
|
452
|
+
};
|
|
453
|
+
readonly forge: {
|
|
454
|
+
readonly $ref: "#/$defs/ForgeHost";
|
|
455
|
+
};
|
|
456
|
+
readonly owner: {
|
|
457
|
+
readonly $ref: "#/$defs/Segment";
|
|
458
|
+
readonly description: "The organisation or user on the forge, lowercased.";
|
|
459
|
+
};
|
|
460
|
+
readonly kind: {
|
|
461
|
+
readonly type: "string";
|
|
462
|
+
readonly enum: readonly ["organization", "user"];
|
|
463
|
+
readonly description: "Whether the owner is an organisation or a personal account, as the forge reports it. Present once known: a bridge-mode namespace learns it when binding completes, and a manual-mode namespace MAY never learn it.";
|
|
464
|
+
};
|
|
465
|
+
readonly mode: {
|
|
466
|
+
readonly type: "string";
|
|
467
|
+
readonly enum: readonly ["bridge", "manual"];
|
|
468
|
+
readonly description: "`bridge` — a bridge service acts on the forge for this namespace (creates repositories, projects roles, reports drift). `manual` — no automation; people with forge access carry out the steps the VTC names, and the VTC governs the rights alone.";
|
|
469
|
+
};
|
|
470
|
+
readonly state: {
|
|
471
|
+
readonly type: "string";
|
|
472
|
+
readonly enum: readonly ["pending", "bound"];
|
|
473
|
+
readonly description: "`pending` — binding has started and the forge-side proof has not arrived yet. `bound` — the VTC governs rights under this namespace.";
|
|
474
|
+
};
|
|
475
|
+
};
|
|
476
|
+
};
|
|
477
|
+
readonly Segment: {
|
|
478
|
+
readonly title: "Segment";
|
|
479
|
+
readonly description: "One lowercased owner or repository name. Forges compare these case-insensitively, so the wire form is always lowercase and a producer lowercases before sending. A leading `.` is refused, which rules out `.` and `..`.";
|
|
480
|
+
readonly type: "string";
|
|
481
|
+
readonly minLength: 1;
|
|
482
|
+
readonly maxLength: 100;
|
|
483
|
+
readonly pattern: "^[a-z0-9_-][a-z0-9._-]*$";
|
|
484
|
+
};
|
|
485
|
+
readonly NamespaceId: {
|
|
486
|
+
readonly title: "NamespaceId";
|
|
487
|
+
readonly description: "The VTC's opaque identifier for a namespace, assigned when it is bound. Stable for the life of the binding; never reused for another binding.";
|
|
488
|
+
readonly type: "string";
|
|
489
|
+
readonly minLength: 1;
|
|
490
|
+
readonly maxLength: 128;
|
|
491
|
+
};
|
|
492
|
+
};
|
|
493
|
+
};
|
|
494
|
+
/** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
|
|
495
|
+
export declare const RESPONSE_PAYLOAD_SCHEMA: {
|
|
496
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
497
|
+
readonly $ref: "#/$defs/Response";
|
|
498
|
+
readonly $defs: {
|
|
499
|
+
readonly LinkedAccount: {
|
|
500
|
+
readonly title: "LinkedAccount";
|
|
501
|
+
readonly description: "A forge account linked to the caller's DID with git-ns/account/link, and when the link completed.";
|
|
502
|
+
readonly type: "object";
|
|
503
|
+
readonly additionalProperties: false;
|
|
504
|
+
readonly required: readonly ["account", "linkedAt"];
|
|
505
|
+
readonly properties: {
|
|
506
|
+
readonly account: {
|
|
507
|
+
readonly $ref: "#/$defs/ForgeAccount";
|
|
508
|
+
readonly description: "The linked account. `id` is authoritative; `login` is as the forge last reported it.";
|
|
509
|
+
};
|
|
510
|
+
readonly linkedAt: {
|
|
511
|
+
readonly type: "string";
|
|
512
|
+
readonly format: "date-time";
|
|
513
|
+
readonly description: "When the link completed: when the VTC recorded the account against the caller's DID.";
|
|
514
|
+
};
|
|
515
|
+
};
|
|
516
|
+
};
|
|
517
|
+
readonly Response: {
|
|
518
|
+
readonly $anchor: "response";
|
|
519
|
+
readonly title: "Git Namespaces — View — response payload";
|
|
520
|
+
readonly description: "What the caller may see — or, with `scope: administrator`, everything in the namespaces they administer — and the caller's own linked forge accounts.";
|
|
521
|
+
readonly type: "object";
|
|
522
|
+
readonly additionalProperties: false;
|
|
523
|
+
readonly required: readonly ["namespaces", "repos", "rights", "accounts"];
|
|
524
|
+
readonly properties: {
|
|
525
|
+
readonly namespaces: {
|
|
526
|
+
readonly type: "array";
|
|
527
|
+
readonly items: {
|
|
528
|
+
readonly $ref: "#/$defs/GitNamespace";
|
|
529
|
+
};
|
|
530
|
+
readonly description: "Namespaces bound to this VTC that contain, or are contained by, `resource`. With `scope: administrator`, only those the caller administers. With `breakGlass: true`, only those containing a returned record.";
|
|
531
|
+
};
|
|
532
|
+
readonly repos: {
|
|
533
|
+
readonly type: "array";
|
|
534
|
+
readonly items: {
|
|
535
|
+
readonly $ref: "#/$defs/RepoSummary";
|
|
536
|
+
};
|
|
537
|
+
readonly description: "Repositories within `resource`. `unmanaged` repositories are included only for callers holding `git.ns.admin` over them, or with `scope: administrator`. With `breakGlass: true`, only those carrying a returned record.";
|
|
538
|
+
};
|
|
539
|
+
readonly rights: {
|
|
540
|
+
readonly type: "array";
|
|
541
|
+
readonly items: {
|
|
542
|
+
readonly $ref: "#/$defs/RightRecord";
|
|
543
|
+
};
|
|
544
|
+
readonly description: "Rights within `resource` the caller may see: always the caller's own; every right on a resource the caller owns or administers; every unratified break-glass record in a namespace they administer or on a resource they own. With `scope: administrator`, every recorded right in the namespaces the caller administers. `reason` is omitted except on resources the caller owns or administers. With `breakGlass: true`, only records carrying `breakGlass`.";
|
|
545
|
+
};
|
|
546
|
+
readonly accounts: {
|
|
547
|
+
readonly type: "array";
|
|
548
|
+
readonly items: {
|
|
549
|
+
readonly $ref: "#/$defs/LinkedAccount";
|
|
550
|
+
};
|
|
551
|
+
readonly description: "The forge accounts linked to the caller's own DID — never another member's — at most one per forge. With `resource`, only the account on that resource's forge. Empty when the caller has linked none.";
|
|
552
|
+
};
|
|
553
|
+
readonly ext: {
|
|
554
|
+
readonly $ref: "#/$defs/Ext";
|
|
555
|
+
};
|
|
556
|
+
};
|
|
557
|
+
};
|
|
558
|
+
readonly Ext: {
|
|
559
|
+
readonly title: "Ext";
|
|
560
|
+
readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
|
|
561
|
+
readonly type: "object";
|
|
562
|
+
readonly minProperties: 1;
|
|
563
|
+
readonly additionalProperties: true;
|
|
564
|
+
readonly propertyNames: {
|
|
565
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
566
|
+
};
|
|
567
|
+
};
|
|
568
|
+
readonly RightRecord: {
|
|
569
|
+
readonly title: "RightRecord";
|
|
570
|
+
readonly description: "One recorded right. Implied rights (§4.2 of the rights model: `own` implies `maintain` implies `commit.sign` on the same resource; `ns.admin` implies `repo.create` and `own` across its namespace) are not records and never appear as RightRecords. A record carrying `breakGlass` was given by its subject to themselves through git-ns/right/break-glass; it is a real right, published like any other, and is shown with that flag on every surface that shows the record.";
|
|
571
|
+
readonly type: "object";
|
|
572
|
+
readonly additionalProperties: false;
|
|
573
|
+
readonly required: readonly ["subject", "right", "resource", "grantedBy", "grantedAt"];
|
|
574
|
+
readonly properties: {
|
|
575
|
+
readonly subject: {
|
|
576
|
+
readonly $ref: "#/$defs/Did";
|
|
577
|
+
readonly description: "Who holds the right. For `git.commit.sign` this is the DID whose commit signatures the CI check accepts.";
|
|
578
|
+
};
|
|
579
|
+
readonly right: {
|
|
580
|
+
readonly $ref: "#/$defs/Right";
|
|
581
|
+
};
|
|
582
|
+
readonly resource: {
|
|
583
|
+
readonly $ref: "#/$defs/Resource";
|
|
584
|
+
};
|
|
585
|
+
readonly grantedBy: {
|
|
586
|
+
readonly $ref: "#/$defs/Did";
|
|
587
|
+
readonly description: "The actor whose task caused the right: the granter, the creator of a repository (for its first `own`), the adopting admin, the transferring owner, or the binding admin (for the first `git.ns.admin`). The VTC's own DID for a right it derives from its configuration.";
|
|
588
|
+
};
|
|
589
|
+
readonly grantedAt: {
|
|
590
|
+
readonly type: "string";
|
|
591
|
+
readonly format: "date-time";
|
|
592
|
+
};
|
|
593
|
+
readonly expiresAt: {
|
|
594
|
+
readonly type: "string";
|
|
595
|
+
readonly format: "date-time";
|
|
596
|
+
readonly description: "When the right lapses. Absent: no expiry.";
|
|
597
|
+
};
|
|
598
|
+
readonly reason: {
|
|
599
|
+
readonly type: "string";
|
|
600
|
+
readonly maxLength: 1024;
|
|
601
|
+
readonly description: "The granter's free-text reason. Disclosed only to holders of `git.repo.own` on the resource and of `git.ns.admin` over it.";
|
|
602
|
+
};
|
|
603
|
+
readonly breakGlass: {
|
|
604
|
+
readonly $ref: "#/$defs/BreakGlass";
|
|
605
|
+
readonly description: "Present exactly when the subject gave themselves this right through git-ns/right/break-glass. Absent for every other record.";
|
|
606
|
+
};
|
|
607
|
+
};
|
|
608
|
+
};
|
|
609
|
+
readonly BreakGlass: {
|
|
610
|
+
readonly title: "BreakGlass";
|
|
611
|
+
readonly description: "How a self-granted right came to be, and whether another administrator has since ratified it. A record whose `breakGlass` has no `ratifiedBy` is **unratified**: it is live and published like any other right, it does not count toward the last-owner or last-admin invariants, and any community administrator or namespace admin of its namespace may revoke it. Ratification (git-ns/right/ratify) sets `ratifiedBy` and `ratifiedAt`; from then on the record is an ordinary grant, and `breakGlass` stays as its history. Never published to the Trust Registry.";
|
|
612
|
+
readonly type: "object";
|
|
613
|
+
readonly additionalProperties: false;
|
|
614
|
+
readonly required: readonly ["by", "at", "justification"];
|
|
615
|
+
readonly properties: {
|
|
616
|
+
readonly by: {
|
|
617
|
+
readonly $ref: "#/$defs/Did";
|
|
618
|
+
readonly description: "Who broke the glass: always the record's `subject`, restated so the flag reads on its own.";
|
|
619
|
+
};
|
|
620
|
+
readonly at: {
|
|
621
|
+
readonly type: "string";
|
|
622
|
+
readonly format: "date-time";
|
|
623
|
+
readonly description: "When the VTC recorded the break-glass.";
|
|
624
|
+
};
|
|
625
|
+
readonly justification: {
|
|
626
|
+
readonly type: "string";
|
|
627
|
+
readonly minLength: 1;
|
|
628
|
+
readonly maxLength: 2048;
|
|
629
|
+
readonly pattern: "\\S";
|
|
630
|
+
readonly description: "The actor's statement of why nobody else could grant this right. Shown to every community administrator, every namespace admin of the namespace and every owner of the resource; kept in the audit record; never published.";
|
|
631
|
+
};
|
|
632
|
+
readonly effectiveAt: {
|
|
633
|
+
readonly type: "string";
|
|
634
|
+
readonly format: "date-time";
|
|
635
|
+
readonly description: "When the right takes effect, where the community's policy imposed a delay. Absent: it took effect at `at`. Until this instant the record confers nothing and is not published, and any administrator who may revoke it may do so.";
|
|
636
|
+
};
|
|
637
|
+
readonly ratifiedBy: {
|
|
638
|
+
readonly $ref: "#/$defs/Did";
|
|
639
|
+
readonly description: "The administrator who ratified the record — never its subject. Absent while unratified.";
|
|
640
|
+
};
|
|
641
|
+
readonly ratifiedAt: {
|
|
642
|
+
readonly type: "string";
|
|
643
|
+
readonly format: "date-time";
|
|
644
|
+
readonly description: "When it was ratified. Present exactly when `ratifiedBy` is.";
|
|
645
|
+
};
|
|
646
|
+
};
|
|
647
|
+
};
|
|
648
|
+
readonly Did: {
|
|
649
|
+
readonly title: "Did";
|
|
650
|
+
readonly description: "A bare DID in the W3C DID Core syntax (§3.1): `did:`, a method name of lowercase letters and digits, `:`, and a method-specific id of colon-separated segments drawn from `A-Z a-z 0-9 . - _` and percent-encoded octets, the last segment non-empty. A DID URL is not a DID: no path, query or fragment (`/`, `?`, `#`), so a verification-method id such as `did:key:z6Mk…#z6Mk…` is refused. Compared by exact string equality — no case folding or percent-decoding. A consumer MUST still treat the value as data: the pattern keeps shell metacharacters, whitespace and quotes out of the wire form, but it does not make a DID safe to splice into a command or markup.";
|
|
651
|
+
readonly type: "string";
|
|
652
|
+
readonly maxLength: 2048;
|
|
653
|
+
readonly pattern: "^did:[a-z0-9]+:(?:(?:[A-Za-z0-9._-]|%[0-9A-Fa-f]{2})*:)*(?:[A-Za-z0-9._-]|%[0-9A-Fa-f]{2})+$";
|
|
654
|
+
};
|
|
655
|
+
readonly Resource: {
|
|
656
|
+
readonly title: "Resource";
|
|
657
|
+
readonly description: "A forge-qualified resource: `<forge-host>/<owner>` for a namespace, or `<forge-host>/<owner>/<repo>` for one repository, all lowercase — `github.com/acme`, `github.com/acme/widgets`, `codeberg.org/acme`. The forge is never implied: `acme/widgets` alone is not a resource. Containment is by whole segment: `github.com/acme` contains `github.com/acme/widgets` and does not contain `github.com/acme-labs/x` or `codeberg.org/acme/widgets`.";
|
|
658
|
+
readonly type: "string";
|
|
659
|
+
readonly maxLength: 455;
|
|
660
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+(?:/[a-z0-9_-][a-z0-9._-]{0,99}){1,2}$";
|
|
661
|
+
};
|
|
662
|
+
readonly Right: {
|
|
663
|
+
readonly title: "Right";
|
|
664
|
+
readonly description: "One of the five git rights. Each string is also the TRQP `action` the VTC publishes the right under in its Trust Registry, so it is carried verbatim. `git.ns.admin` and `git.repo.create` apply to a namespace resource; `git.repo.own` and `git.repo.maintain` to a repository resource; `git.commit.sign` to either.";
|
|
665
|
+
readonly type: "string";
|
|
666
|
+
readonly enum: readonly ["git.ns.admin", "git.repo.create", "git.repo.own", "git.repo.maintain", "git.commit.sign"];
|
|
667
|
+
};
|
|
668
|
+
readonly RepoSummary: {
|
|
669
|
+
readonly title: "RepoSummary";
|
|
670
|
+
readonly description: "One repository as the VTC records it.";
|
|
671
|
+
readonly type: "object";
|
|
672
|
+
readonly additionalProperties: false;
|
|
673
|
+
readonly required: readonly ["resource", "visibility", "state", "owners", "bootstrap", "sync"];
|
|
674
|
+
readonly properties: {
|
|
675
|
+
readonly resource: {
|
|
676
|
+
readonly $ref: "#/$defs/RepoResource";
|
|
677
|
+
};
|
|
678
|
+
readonly forgeId: {
|
|
679
|
+
readonly $ref: "#/$defs/ForgeId";
|
|
680
|
+
readonly description: "The forge's repository id. Absent until the forge has confirmed the repository exists (a `pendingCreate` repository, or one adopted in bridge mode before the first inspection).";
|
|
681
|
+
};
|
|
682
|
+
readonly visibility: {
|
|
683
|
+
readonly $ref: "#/$defs/RepoVisibility";
|
|
684
|
+
};
|
|
685
|
+
readonly state: {
|
|
686
|
+
readonly type: "string";
|
|
687
|
+
readonly enum: readonly ["pendingCreate", "active", "archived", "detached", "orphaned", "unmanaged"];
|
|
688
|
+
readonly description: "`pendingCreate` — the name is reserved and the repository is not yet confirmed on the forge. `active` — managed. `archived` — archived through git-ns/repo/archive; commit rights on it are revoked. `detached` — no longer governed: its namespace was unbound, or it moved outside the namespace. `orphaned` — its last owner left the community and ownership passed to the namespace admins, who have not yet named a new owner. `unmanaged` — it exists on the forge inside a bound namespace but was never created or adopted through the VTC.";
|
|
689
|
+
};
|
|
690
|
+
readonly owners: {
|
|
691
|
+
readonly type: "array";
|
|
692
|
+
readonly uniqueItems: true;
|
|
693
|
+
readonly items: {
|
|
694
|
+
readonly $ref: "#/$defs/Did";
|
|
695
|
+
};
|
|
696
|
+
readonly description: "The DIDs holding `git.repo.own` on this repository by an explicit grant. Empty only for an `unmanaged` repository, and for an `orphaned` one whose ownership rests with the namespace admins by implication.";
|
|
697
|
+
};
|
|
698
|
+
readonly bootstrap: {
|
|
699
|
+
readonly $ref: "#/$defs/Bootstrap";
|
|
700
|
+
};
|
|
701
|
+
readonly sync: {
|
|
702
|
+
readonly $ref: "#/$defs/Sync";
|
|
703
|
+
};
|
|
704
|
+
};
|
|
705
|
+
};
|
|
706
|
+
readonly Sync: {
|
|
707
|
+
readonly title: "Sync";
|
|
708
|
+
readonly description: "How the forge compares with the VTC's projection for one repository.";
|
|
709
|
+
readonly type: "object";
|
|
710
|
+
readonly additionalProperties: false;
|
|
711
|
+
readonly required: readonly ["state", "drift"];
|
|
712
|
+
readonly properties: {
|
|
713
|
+
readonly state: {
|
|
714
|
+
readonly type: "string";
|
|
715
|
+
readonly enum: readonly ["inSync", "drift", "pending", "unchecked"];
|
|
716
|
+
readonly description: "`inSync` — the last comparison found no drift. `drift` — it found some, listed in `drift`. `pending` — a change has been sent to the forge and not yet confirmed. `unchecked` — nothing compares this repository (a manual-mode namespace).";
|
|
717
|
+
};
|
|
718
|
+
readonly checkedAt: {
|
|
719
|
+
readonly type: "string";
|
|
720
|
+
readonly format: "date-time";
|
|
721
|
+
readonly description: "When the forge was last compared. Absent if never.";
|
|
722
|
+
};
|
|
723
|
+
readonly drift: {
|
|
724
|
+
readonly type: "array";
|
|
725
|
+
readonly items: {
|
|
726
|
+
readonly $ref: "#/$defs/DriftItem";
|
|
727
|
+
};
|
|
728
|
+
readonly description: "Outstanding drift. Empty unless `state` is `drift`.";
|
|
729
|
+
};
|
|
730
|
+
};
|
|
731
|
+
};
|
|
732
|
+
readonly DriftItem: {
|
|
733
|
+
readonly title: "DriftItem";
|
|
734
|
+
readonly description: "One difference between the forge's observed state and the VTC's projection of a repository.";
|
|
735
|
+
readonly type: "object";
|
|
736
|
+
readonly additionalProperties: false;
|
|
737
|
+
readonly required: readonly ["type", "resource"];
|
|
738
|
+
readonly properties: {
|
|
739
|
+
readonly type: {
|
|
740
|
+
readonly type: "string";
|
|
741
|
+
readonly enum: readonly ["roleAdded", "roleRemoved", "roleChanged", "requiredCheckMissing", "protectionWeakened", "bootstrapMissing"];
|
|
742
|
+
readonly description: "`roleAdded` — someone holds a forge role the projection does not give them. `roleRemoved` — a projected role is missing. `roleChanged` — a projected role is present at another level. `requiredCheckMissing` — the verify-trust check is no longer required. `protectionWeakened` — branch protection or a ruleset is weaker than the projection in another way (force-push allowed, bypass actors added). `bootstrapMissing` — a bootstrap file or variable is gone.";
|
|
743
|
+
};
|
|
744
|
+
readonly resource: {
|
|
745
|
+
readonly $ref: "#/$defs/RepoResource";
|
|
746
|
+
};
|
|
747
|
+
readonly account: {
|
|
748
|
+
readonly $ref: "#/$defs/ForgeAccount";
|
|
749
|
+
readonly description: "Whose role differs, for the three role types.";
|
|
750
|
+
};
|
|
751
|
+
readonly observed: {
|
|
752
|
+
readonly type: "string";
|
|
753
|
+
readonly maxLength: 256;
|
|
754
|
+
readonly description: "What the forge shows, in the forge's own vocabulary (a role name such as `maintain`, a setting name). Absent when nothing is there.";
|
|
755
|
+
};
|
|
756
|
+
readonly expected: {
|
|
757
|
+
readonly type: "string";
|
|
758
|
+
readonly maxLength: 256;
|
|
759
|
+
readonly description: "What the projection calls for, in the forge's own vocabulary. Absent when the projection calls for nothing.";
|
|
760
|
+
};
|
|
761
|
+
};
|
|
762
|
+
};
|
|
763
|
+
readonly ForgeAccount: {
|
|
764
|
+
readonly title: "ForgeAccount";
|
|
765
|
+
readonly description: "A person's account on one forge. `id` is authoritative; `login` is for display only, because logins can be renamed and re-registered.";
|
|
766
|
+
readonly type: "object";
|
|
767
|
+
readonly additionalProperties: false;
|
|
768
|
+
readonly required: readonly ["forge", "id", "login"];
|
|
769
|
+
readonly properties: {
|
|
770
|
+
readonly forge: {
|
|
771
|
+
readonly $ref: "#/$defs/ForgeHost";
|
|
772
|
+
};
|
|
773
|
+
readonly id: {
|
|
774
|
+
readonly $ref: "#/$defs/ForgeId";
|
|
775
|
+
};
|
|
776
|
+
readonly login: {
|
|
777
|
+
readonly type: "string";
|
|
778
|
+
readonly minLength: 1;
|
|
779
|
+
readonly maxLength: 100;
|
|
780
|
+
readonly description: "The account's current login, as the forge reported it when last seen. Display only.";
|
|
781
|
+
};
|
|
782
|
+
};
|
|
783
|
+
};
|
|
784
|
+
readonly ForgeId: {
|
|
785
|
+
readonly title: "ForgeId";
|
|
786
|
+
readonly description: "An identifier the forge itself assigns — a repository id, a user or organisation id — carried as a string so a forge whose ids are not numbers needs no new version. GitHub and Forgejo ids are decimal integers written as strings (`\"812736451\"`). Unlike a name, it survives renames and transfers, which is why rights and bindings are keyed by it.";
|
|
787
|
+
readonly type: "string";
|
|
788
|
+
readonly minLength: 1;
|
|
789
|
+
readonly maxLength: 64;
|
|
790
|
+
};
|
|
791
|
+
readonly ForgeHost: {
|
|
792
|
+
readonly title: "ForgeHost";
|
|
793
|
+
readonly description: "The lowercased DNS host of a forge: `github.com`, a GitHub Enterprise Server host, `codeberg.org`, or a self-hosted Forgejo instance such as `git.example.org`. No scheme, no port, no path. The host is a segment of every resource, so a right never crosses forges.";
|
|
794
|
+
readonly type: "string";
|
|
795
|
+
readonly minLength: 3;
|
|
796
|
+
readonly maxLength: 253;
|
|
797
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$";
|
|
798
|
+
};
|
|
799
|
+
readonly RepoResource: {
|
|
800
|
+
readonly title: "RepoResource";
|
|
801
|
+
readonly description: "A forge-qualified resource naming exactly one repository: `<forge-host>/<owner>/<repo>`, lowercase.";
|
|
802
|
+
readonly type: "string";
|
|
803
|
+
readonly maxLength: 455;
|
|
804
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+/[a-z0-9_-][a-z0-9._-]{0,99}/[a-z0-9_-][a-z0-9._-]{0,99}$";
|
|
805
|
+
};
|
|
806
|
+
readonly Bootstrap: {
|
|
807
|
+
readonly title: "Bootstrap";
|
|
808
|
+
readonly description: "Whether each step that turns commit trust on for a repository is in place, as last reported. A step that this forge's plan does not need reads `true`.";
|
|
809
|
+
readonly type: "object";
|
|
810
|
+
readonly additionalProperties: false;
|
|
811
|
+
readonly required: readonly ["workflow", "keyring", "variables", "requiredCheck"];
|
|
812
|
+
readonly properties: {
|
|
813
|
+
readonly workflow: {
|
|
814
|
+
readonly type: "boolean";
|
|
815
|
+
readonly description: "The verify-trust check runs on the repository's pull requests — from a workflow committed to it, or, where the forge supports it, required on it from the namespace's own bridge-managed workflow repository at a pinned commit.";
|
|
816
|
+
};
|
|
817
|
+
readonly keyring: {
|
|
818
|
+
readonly type: "boolean";
|
|
819
|
+
readonly description: "The exempt platform keyring for forge-signed merge commits is committed, or the forge's plan does not need one.";
|
|
820
|
+
};
|
|
821
|
+
readonly variables: {
|
|
822
|
+
readonly type: "boolean";
|
|
823
|
+
readonly description: "The repository names the Trust Registry and this VTC as its trust anchors.";
|
|
824
|
+
};
|
|
825
|
+
readonly requiredCheck: {
|
|
826
|
+
readonly type: "boolean";
|
|
827
|
+
readonly description: "The forge refuses to merge into the default branch unless the verify-trust check passes, with no bypass, and a pull request cannot change what that check runs: an organisation-required workflow, code-owner review of workflow files, or protected workflow paths, as the forge allows.";
|
|
828
|
+
};
|
|
829
|
+
};
|
|
830
|
+
};
|
|
831
|
+
readonly RepoVisibility: {
|
|
832
|
+
readonly title: "RepoVisibility";
|
|
833
|
+
readonly type: "string";
|
|
834
|
+
readonly enum: readonly ["public", "private"];
|
|
835
|
+
readonly description: "Repository visibility on the forge.";
|
|
836
|
+
};
|
|
837
|
+
readonly GitNamespace: {
|
|
838
|
+
readonly title: "GitNamespace";
|
|
839
|
+
readonly description: "The VTC's binding to one owner on one forge.";
|
|
840
|
+
readonly type: "object";
|
|
841
|
+
readonly additionalProperties: false;
|
|
842
|
+
readonly required: readonly ["id", "forge", "owner", "mode", "state"];
|
|
843
|
+
readonly properties: {
|
|
844
|
+
readonly id: {
|
|
845
|
+
readonly $ref: "#/$defs/NamespaceId";
|
|
846
|
+
};
|
|
847
|
+
readonly forge: {
|
|
848
|
+
readonly $ref: "#/$defs/ForgeHost";
|
|
849
|
+
};
|
|
850
|
+
readonly owner: {
|
|
851
|
+
readonly $ref: "#/$defs/Segment";
|
|
852
|
+
readonly description: "The organisation or user on the forge, lowercased.";
|
|
853
|
+
};
|
|
854
|
+
readonly kind: {
|
|
855
|
+
readonly type: "string";
|
|
856
|
+
readonly enum: readonly ["organization", "user"];
|
|
857
|
+
readonly description: "Whether the owner is an organisation or a personal account, as the forge reports it. Present once known: a bridge-mode namespace learns it when binding completes, and a manual-mode namespace MAY never learn it.";
|
|
858
|
+
};
|
|
859
|
+
readonly mode: {
|
|
860
|
+
readonly type: "string";
|
|
861
|
+
readonly enum: readonly ["bridge", "manual"];
|
|
862
|
+
readonly description: "`bridge` — a bridge service acts on the forge for this namespace (creates repositories, projects roles, reports drift). `manual` — no automation; people with forge access carry out the steps the VTC names, and the VTC governs the rights alone.";
|
|
863
|
+
};
|
|
864
|
+
readonly state: {
|
|
865
|
+
readonly type: "string";
|
|
866
|
+
readonly enum: readonly ["pending", "bound"];
|
|
867
|
+
readonly description: "`pending` — binding has started and the forge-side proof has not arrived yet. `bound` — the VTC governs rights under this namespace.";
|
|
868
|
+
};
|
|
869
|
+
};
|
|
870
|
+
};
|
|
871
|
+
readonly Segment: {
|
|
872
|
+
readonly title: "Segment";
|
|
873
|
+
readonly description: "One lowercased owner or repository name. Forges compare these case-insensitively, so the wire form is always lowercase and a producer lowercases before sending. A leading `.` is refused, which rules out `.` and `..`.";
|
|
874
|
+
readonly type: "string";
|
|
875
|
+
readonly minLength: 1;
|
|
876
|
+
readonly maxLength: 100;
|
|
877
|
+
readonly pattern: "^[a-z0-9_-][a-z0-9._-]*$";
|
|
878
|
+
};
|
|
879
|
+
readonly NamespaceId: {
|
|
880
|
+
readonly title: "NamespaceId";
|
|
881
|
+
readonly description: "The VTC's opaque identifier for a namespace, assigned when it is bound. Stable for the life of the binding; never reused for another binding.";
|
|
882
|
+
readonly type: "string";
|
|
883
|
+
readonly minLength: 1;
|
|
884
|
+
readonly maxLength: 128;
|
|
885
|
+
};
|
|
886
|
+
};
|
|
887
|
+
};
|
|
888
|
+
/**
|
|
889
|
+
* SPEC.md §7.2 policy for the request variant, from this specification's
|
|
890
|
+
* front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
|
|
891
|
+
* per-specification and cannot be derived from the document alone, and
|
|
892
|
+
* item 2 needs the schema this carries.
|
|
893
|
+
*/
|
|
894
|
+
export declare const SPEC: {
|
|
895
|
+
readonly typeUri: "https://trusttasks.org/spec/git-ns/view/0.5";
|
|
896
|
+
readonly isBearer: false;
|
|
897
|
+
readonly isProofRequired: true;
|
|
898
|
+
readonly isRecipientRequired: true;
|
|
899
|
+
readonly isIssuedAtRequired: false;
|
|
900
|
+
readonly payloadSchema: {
|
|
901
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
902
|
+
readonly $id: "https://trusttasks.org/spec/git-ns/view/0.5";
|
|
903
|
+
readonly title: "Git Namespaces — View — payload";
|
|
904
|
+
readonly description: "A member reads the namespaces, repositories and rights they are entitled to see, optionally narrowed to one resource, together with the forge accounts linked to their own DID. An administrator may instead ask for everything in the namespaces they administer, and either may narrow the rights to break-glass records.";
|
|
905
|
+
readonly type: "object";
|
|
906
|
+
readonly additionalProperties: false;
|
|
907
|
+
readonly required: readonly [];
|
|
908
|
+
readonly properties: {
|
|
909
|
+
readonly resource: {
|
|
910
|
+
readonly $ref: "#/$defs/Resource";
|
|
911
|
+
readonly description: "Narrow the answer to this resource and everything inside it. Absent: everything the caller may see.";
|
|
912
|
+
};
|
|
913
|
+
readonly scope: {
|
|
914
|
+
readonly type: "string";
|
|
915
|
+
readonly enum: readonly ["member", "administrator"];
|
|
916
|
+
readonly description: "`member` (the default) — what the caller may see through their own git rights, exactly as in 0.4. `administrator` — everything in the namespaces the caller administers (every namespace, for a holder of the community-administrator capability; those they hold `git.ns.admin` on, for anyone else), reasons included. Refused with `git-ns/view:notAdministrator` when the caller administers no namespace within `resource`. Absent means `\"member\"`; this carries no schema-level default, so a producer that omits it is not normalised into sending it.";
|
|
917
|
+
};
|
|
918
|
+
readonly breakGlass: {
|
|
919
|
+
readonly type: "boolean";
|
|
920
|
+
readonly description: "`true` narrows `rights` to the records carrying `breakGlass` — ratified ones included — and `namespaces` and `repos` to those that contain such a record. `false` or absent: no narrowing. Absent means `false`; this carries no schema-level default, so a producer that omits it is not normalised into sending it.";
|
|
921
|
+
};
|
|
922
|
+
readonly ext: {
|
|
923
|
+
readonly $ref: "#/$defs/Ext";
|
|
924
|
+
};
|
|
925
|
+
};
|
|
926
|
+
readonly $defs: {
|
|
927
|
+
readonly LinkedAccount: {
|
|
928
|
+
readonly title: "LinkedAccount";
|
|
929
|
+
readonly description: "A forge account linked to the caller's DID with git-ns/account/link, and when the link completed.";
|
|
930
|
+
readonly type: "object";
|
|
931
|
+
readonly additionalProperties: false;
|
|
932
|
+
readonly required: readonly ["account", "linkedAt"];
|
|
933
|
+
readonly properties: {
|
|
934
|
+
readonly account: {
|
|
935
|
+
readonly $ref: "#/$defs/ForgeAccount";
|
|
936
|
+
readonly description: "The linked account. `id` is authoritative; `login` is as the forge last reported it.";
|
|
937
|
+
};
|
|
938
|
+
readonly linkedAt: {
|
|
939
|
+
readonly type: "string";
|
|
940
|
+
readonly format: "date-time";
|
|
941
|
+
readonly description: "When the link completed: when the VTC recorded the account against the caller's DID.";
|
|
942
|
+
};
|
|
943
|
+
};
|
|
944
|
+
};
|
|
945
|
+
readonly Response: {
|
|
946
|
+
readonly $anchor: "response";
|
|
947
|
+
readonly title: "Git Namespaces — View — response payload";
|
|
948
|
+
readonly description: "What the caller may see — or, with `scope: administrator`, everything in the namespaces they administer — and the caller's own linked forge accounts.";
|
|
949
|
+
readonly type: "object";
|
|
950
|
+
readonly additionalProperties: false;
|
|
951
|
+
readonly required: readonly ["namespaces", "repos", "rights", "accounts"];
|
|
952
|
+
readonly properties: {
|
|
953
|
+
readonly namespaces: {
|
|
954
|
+
readonly type: "array";
|
|
955
|
+
readonly items: {
|
|
956
|
+
readonly $ref: "#/$defs/GitNamespace";
|
|
957
|
+
};
|
|
958
|
+
readonly description: "Namespaces bound to this VTC that contain, or are contained by, `resource`. With `scope: administrator`, only those the caller administers. With `breakGlass: true`, only those containing a returned record.";
|
|
959
|
+
};
|
|
960
|
+
readonly repos: {
|
|
961
|
+
readonly type: "array";
|
|
962
|
+
readonly items: {
|
|
963
|
+
readonly $ref: "#/$defs/RepoSummary";
|
|
964
|
+
};
|
|
965
|
+
readonly description: "Repositories within `resource`. `unmanaged` repositories are included only for callers holding `git.ns.admin` over them, or with `scope: administrator`. With `breakGlass: true`, only those carrying a returned record.";
|
|
966
|
+
};
|
|
967
|
+
readonly rights: {
|
|
968
|
+
readonly type: "array";
|
|
969
|
+
readonly items: {
|
|
970
|
+
readonly $ref: "#/$defs/RightRecord";
|
|
971
|
+
};
|
|
972
|
+
readonly description: "Rights within `resource` the caller may see: always the caller's own; every right on a resource the caller owns or administers; every unratified break-glass record in a namespace they administer or on a resource they own. With `scope: administrator`, every recorded right in the namespaces the caller administers. `reason` is omitted except on resources the caller owns or administers. With `breakGlass: true`, only records carrying `breakGlass`.";
|
|
973
|
+
};
|
|
974
|
+
readonly accounts: {
|
|
975
|
+
readonly type: "array";
|
|
976
|
+
readonly items: {
|
|
977
|
+
readonly $ref: "#/$defs/LinkedAccount";
|
|
978
|
+
};
|
|
979
|
+
readonly description: "The forge accounts linked to the caller's own DID — never another member's — at most one per forge. With `resource`, only the account on that resource's forge. Empty when the caller has linked none.";
|
|
980
|
+
};
|
|
981
|
+
readonly ext: {
|
|
982
|
+
readonly $ref: "#/$defs/Ext";
|
|
983
|
+
};
|
|
984
|
+
};
|
|
985
|
+
};
|
|
986
|
+
readonly Ext: {
|
|
987
|
+
readonly title: "Ext";
|
|
988
|
+
readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
|
|
989
|
+
readonly type: "object";
|
|
990
|
+
readonly minProperties: 1;
|
|
991
|
+
readonly additionalProperties: true;
|
|
992
|
+
readonly propertyNames: {
|
|
993
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
994
|
+
};
|
|
995
|
+
};
|
|
996
|
+
readonly RightRecord: {
|
|
997
|
+
readonly title: "RightRecord";
|
|
998
|
+
readonly description: "One recorded right. Implied rights (§4.2 of the rights model: `own` implies `maintain` implies `commit.sign` on the same resource; `ns.admin` implies `repo.create` and `own` across its namespace) are not records and never appear as RightRecords. A record carrying `breakGlass` was given by its subject to themselves through git-ns/right/break-glass; it is a real right, published like any other, and is shown with that flag on every surface that shows the record.";
|
|
999
|
+
readonly type: "object";
|
|
1000
|
+
readonly additionalProperties: false;
|
|
1001
|
+
readonly required: readonly ["subject", "right", "resource", "grantedBy", "grantedAt"];
|
|
1002
|
+
readonly properties: {
|
|
1003
|
+
readonly subject: {
|
|
1004
|
+
readonly $ref: "#/$defs/Did";
|
|
1005
|
+
readonly description: "Who holds the right. For `git.commit.sign` this is the DID whose commit signatures the CI check accepts.";
|
|
1006
|
+
};
|
|
1007
|
+
readonly right: {
|
|
1008
|
+
readonly $ref: "#/$defs/Right";
|
|
1009
|
+
};
|
|
1010
|
+
readonly resource: {
|
|
1011
|
+
readonly $ref: "#/$defs/Resource";
|
|
1012
|
+
};
|
|
1013
|
+
readonly grantedBy: {
|
|
1014
|
+
readonly $ref: "#/$defs/Did";
|
|
1015
|
+
readonly description: "The actor whose task caused the right: the granter, the creator of a repository (for its first `own`), the adopting admin, the transferring owner, or the binding admin (for the first `git.ns.admin`). The VTC's own DID for a right it derives from its configuration.";
|
|
1016
|
+
};
|
|
1017
|
+
readonly grantedAt: {
|
|
1018
|
+
readonly type: "string";
|
|
1019
|
+
readonly format: "date-time";
|
|
1020
|
+
};
|
|
1021
|
+
readonly expiresAt: {
|
|
1022
|
+
readonly type: "string";
|
|
1023
|
+
readonly format: "date-time";
|
|
1024
|
+
readonly description: "When the right lapses. Absent: no expiry.";
|
|
1025
|
+
};
|
|
1026
|
+
readonly reason: {
|
|
1027
|
+
readonly type: "string";
|
|
1028
|
+
readonly maxLength: 1024;
|
|
1029
|
+
readonly description: "The granter's free-text reason. Disclosed only to holders of `git.repo.own` on the resource and of `git.ns.admin` over it.";
|
|
1030
|
+
};
|
|
1031
|
+
readonly breakGlass: {
|
|
1032
|
+
readonly $ref: "#/$defs/BreakGlass";
|
|
1033
|
+
readonly description: "Present exactly when the subject gave themselves this right through git-ns/right/break-glass. Absent for every other record.";
|
|
1034
|
+
};
|
|
1035
|
+
};
|
|
1036
|
+
};
|
|
1037
|
+
readonly BreakGlass: {
|
|
1038
|
+
readonly title: "BreakGlass";
|
|
1039
|
+
readonly description: "How a self-granted right came to be, and whether another administrator has since ratified it. A record whose `breakGlass` has no `ratifiedBy` is **unratified**: it is live and published like any other right, it does not count toward the last-owner or last-admin invariants, and any community administrator or namespace admin of its namespace may revoke it. Ratification (git-ns/right/ratify) sets `ratifiedBy` and `ratifiedAt`; from then on the record is an ordinary grant, and `breakGlass` stays as its history. Never published to the Trust Registry.";
|
|
1040
|
+
readonly type: "object";
|
|
1041
|
+
readonly additionalProperties: false;
|
|
1042
|
+
readonly required: readonly ["by", "at", "justification"];
|
|
1043
|
+
readonly properties: {
|
|
1044
|
+
readonly by: {
|
|
1045
|
+
readonly $ref: "#/$defs/Did";
|
|
1046
|
+
readonly description: "Who broke the glass: always the record's `subject`, restated so the flag reads on its own.";
|
|
1047
|
+
};
|
|
1048
|
+
readonly at: {
|
|
1049
|
+
readonly type: "string";
|
|
1050
|
+
readonly format: "date-time";
|
|
1051
|
+
readonly description: "When the VTC recorded the break-glass.";
|
|
1052
|
+
};
|
|
1053
|
+
readonly justification: {
|
|
1054
|
+
readonly type: "string";
|
|
1055
|
+
readonly minLength: 1;
|
|
1056
|
+
readonly maxLength: 2048;
|
|
1057
|
+
readonly pattern: "\\S";
|
|
1058
|
+
readonly description: "The actor's statement of why nobody else could grant this right. Shown to every community administrator, every namespace admin of the namespace and every owner of the resource; kept in the audit record; never published.";
|
|
1059
|
+
};
|
|
1060
|
+
readonly effectiveAt: {
|
|
1061
|
+
readonly type: "string";
|
|
1062
|
+
readonly format: "date-time";
|
|
1063
|
+
readonly description: "When the right takes effect, where the community's policy imposed a delay. Absent: it took effect at `at`. Until this instant the record confers nothing and is not published, and any administrator who may revoke it may do so.";
|
|
1064
|
+
};
|
|
1065
|
+
readonly ratifiedBy: {
|
|
1066
|
+
readonly $ref: "#/$defs/Did";
|
|
1067
|
+
readonly description: "The administrator who ratified the record — never its subject. Absent while unratified.";
|
|
1068
|
+
};
|
|
1069
|
+
readonly ratifiedAt: {
|
|
1070
|
+
readonly type: "string";
|
|
1071
|
+
readonly format: "date-time";
|
|
1072
|
+
readonly description: "When it was ratified. Present exactly when `ratifiedBy` is.";
|
|
1073
|
+
};
|
|
1074
|
+
};
|
|
1075
|
+
};
|
|
1076
|
+
readonly Did: {
|
|
1077
|
+
readonly title: "Did";
|
|
1078
|
+
readonly description: "A bare DID in the W3C DID Core syntax (§3.1): `did:`, a method name of lowercase letters and digits, `:`, and a method-specific id of colon-separated segments drawn from `A-Z a-z 0-9 . - _` and percent-encoded octets, the last segment non-empty. A DID URL is not a DID: no path, query or fragment (`/`, `?`, `#`), so a verification-method id such as `did:key:z6Mk…#z6Mk…` is refused. Compared by exact string equality — no case folding or percent-decoding. A consumer MUST still treat the value as data: the pattern keeps shell metacharacters, whitespace and quotes out of the wire form, but it does not make a DID safe to splice into a command or markup.";
|
|
1079
|
+
readonly type: "string";
|
|
1080
|
+
readonly maxLength: 2048;
|
|
1081
|
+
readonly pattern: "^did:[a-z0-9]+:(?:(?:[A-Za-z0-9._-]|%[0-9A-Fa-f]{2})*:)*(?:[A-Za-z0-9._-]|%[0-9A-Fa-f]{2})+$";
|
|
1082
|
+
};
|
|
1083
|
+
readonly Resource: {
|
|
1084
|
+
readonly title: "Resource";
|
|
1085
|
+
readonly description: "A forge-qualified resource: `<forge-host>/<owner>` for a namespace, or `<forge-host>/<owner>/<repo>` for one repository, all lowercase — `github.com/acme`, `github.com/acme/widgets`, `codeberg.org/acme`. The forge is never implied: `acme/widgets` alone is not a resource. Containment is by whole segment: `github.com/acme` contains `github.com/acme/widgets` and does not contain `github.com/acme-labs/x` or `codeberg.org/acme/widgets`.";
|
|
1086
|
+
readonly type: "string";
|
|
1087
|
+
readonly maxLength: 455;
|
|
1088
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+(?:/[a-z0-9_-][a-z0-9._-]{0,99}){1,2}$";
|
|
1089
|
+
};
|
|
1090
|
+
readonly Right: {
|
|
1091
|
+
readonly title: "Right";
|
|
1092
|
+
readonly description: "One of the five git rights. Each string is also the TRQP `action` the VTC publishes the right under in its Trust Registry, so it is carried verbatim. `git.ns.admin` and `git.repo.create` apply to a namespace resource; `git.repo.own` and `git.repo.maintain` to a repository resource; `git.commit.sign` to either.";
|
|
1093
|
+
readonly type: "string";
|
|
1094
|
+
readonly enum: readonly ["git.ns.admin", "git.repo.create", "git.repo.own", "git.repo.maintain", "git.commit.sign"];
|
|
1095
|
+
};
|
|
1096
|
+
readonly RepoSummary: {
|
|
1097
|
+
readonly title: "RepoSummary";
|
|
1098
|
+
readonly description: "One repository as the VTC records it.";
|
|
1099
|
+
readonly type: "object";
|
|
1100
|
+
readonly additionalProperties: false;
|
|
1101
|
+
readonly required: readonly ["resource", "visibility", "state", "owners", "bootstrap", "sync"];
|
|
1102
|
+
readonly properties: {
|
|
1103
|
+
readonly resource: {
|
|
1104
|
+
readonly $ref: "#/$defs/RepoResource";
|
|
1105
|
+
};
|
|
1106
|
+
readonly forgeId: {
|
|
1107
|
+
readonly $ref: "#/$defs/ForgeId";
|
|
1108
|
+
readonly description: "The forge's repository id. Absent until the forge has confirmed the repository exists (a `pendingCreate` repository, or one adopted in bridge mode before the first inspection).";
|
|
1109
|
+
};
|
|
1110
|
+
readonly visibility: {
|
|
1111
|
+
readonly $ref: "#/$defs/RepoVisibility";
|
|
1112
|
+
};
|
|
1113
|
+
readonly state: {
|
|
1114
|
+
readonly type: "string";
|
|
1115
|
+
readonly enum: readonly ["pendingCreate", "active", "archived", "detached", "orphaned", "unmanaged"];
|
|
1116
|
+
readonly description: "`pendingCreate` — the name is reserved and the repository is not yet confirmed on the forge. `active` — managed. `archived` — archived through git-ns/repo/archive; commit rights on it are revoked. `detached` — no longer governed: its namespace was unbound, or it moved outside the namespace. `orphaned` — its last owner left the community and ownership passed to the namespace admins, who have not yet named a new owner. `unmanaged` — it exists on the forge inside a bound namespace but was never created or adopted through the VTC.";
|
|
1117
|
+
};
|
|
1118
|
+
readonly owners: {
|
|
1119
|
+
readonly type: "array";
|
|
1120
|
+
readonly uniqueItems: true;
|
|
1121
|
+
readonly items: {
|
|
1122
|
+
readonly $ref: "#/$defs/Did";
|
|
1123
|
+
};
|
|
1124
|
+
readonly description: "The DIDs holding `git.repo.own` on this repository by an explicit grant. Empty only for an `unmanaged` repository, and for an `orphaned` one whose ownership rests with the namespace admins by implication.";
|
|
1125
|
+
};
|
|
1126
|
+
readonly bootstrap: {
|
|
1127
|
+
readonly $ref: "#/$defs/Bootstrap";
|
|
1128
|
+
};
|
|
1129
|
+
readonly sync: {
|
|
1130
|
+
readonly $ref: "#/$defs/Sync";
|
|
1131
|
+
};
|
|
1132
|
+
};
|
|
1133
|
+
};
|
|
1134
|
+
readonly Sync: {
|
|
1135
|
+
readonly title: "Sync";
|
|
1136
|
+
readonly description: "How the forge compares with the VTC's projection for one repository.";
|
|
1137
|
+
readonly type: "object";
|
|
1138
|
+
readonly additionalProperties: false;
|
|
1139
|
+
readonly required: readonly ["state", "drift"];
|
|
1140
|
+
readonly properties: {
|
|
1141
|
+
readonly state: {
|
|
1142
|
+
readonly type: "string";
|
|
1143
|
+
readonly enum: readonly ["inSync", "drift", "pending", "unchecked"];
|
|
1144
|
+
readonly description: "`inSync` — the last comparison found no drift. `drift` — it found some, listed in `drift`. `pending` — a change has been sent to the forge and not yet confirmed. `unchecked` — nothing compares this repository (a manual-mode namespace).";
|
|
1145
|
+
};
|
|
1146
|
+
readonly checkedAt: {
|
|
1147
|
+
readonly type: "string";
|
|
1148
|
+
readonly format: "date-time";
|
|
1149
|
+
readonly description: "When the forge was last compared. Absent if never.";
|
|
1150
|
+
};
|
|
1151
|
+
readonly drift: {
|
|
1152
|
+
readonly type: "array";
|
|
1153
|
+
readonly items: {
|
|
1154
|
+
readonly $ref: "#/$defs/DriftItem";
|
|
1155
|
+
};
|
|
1156
|
+
readonly description: "Outstanding drift. Empty unless `state` is `drift`.";
|
|
1157
|
+
};
|
|
1158
|
+
};
|
|
1159
|
+
};
|
|
1160
|
+
readonly DriftItem: {
|
|
1161
|
+
readonly title: "DriftItem";
|
|
1162
|
+
readonly description: "One difference between the forge's observed state and the VTC's projection of a repository.";
|
|
1163
|
+
readonly type: "object";
|
|
1164
|
+
readonly additionalProperties: false;
|
|
1165
|
+
readonly required: readonly ["type", "resource"];
|
|
1166
|
+
readonly properties: {
|
|
1167
|
+
readonly type: {
|
|
1168
|
+
readonly type: "string";
|
|
1169
|
+
readonly enum: readonly ["roleAdded", "roleRemoved", "roleChanged", "requiredCheckMissing", "protectionWeakened", "bootstrapMissing"];
|
|
1170
|
+
readonly description: "`roleAdded` — someone holds a forge role the projection does not give them. `roleRemoved` — a projected role is missing. `roleChanged` — a projected role is present at another level. `requiredCheckMissing` — the verify-trust check is no longer required. `protectionWeakened` — branch protection or a ruleset is weaker than the projection in another way (force-push allowed, bypass actors added). `bootstrapMissing` — a bootstrap file or variable is gone.";
|
|
1171
|
+
};
|
|
1172
|
+
readonly resource: {
|
|
1173
|
+
readonly $ref: "#/$defs/RepoResource";
|
|
1174
|
+
};
|
|
1175
|
+
readonly account: {
|
|
1176
|
+
readonly $ref: "#/$defs/ForgeAccount";
|
|
1177
|
+
readonly description: "Whose role differs, for the three role types.";
|
|
1178
|
+
};
|
|
1179
|
+
readonly observed: {
|
|
1180
|
+
readonly type: "string";
|
|
1181
|
+
readonly maxLength: 256;
|
|
1182
|
+
readonly description: "What the forge shows, in the forge's own vocabulary (a role name such as `maintain`, a setting name). Absent when nothing is there.";
|
|
1183
|
+
};
|
|
1184
|
+
readonly expected: {
|
|
1185
|
+
readonly type: "string";
|
|
1186
|
+
readonly maxLength: 256;
|
|
1187
|
+
readonly description: "What the projection calls for, in the forge's own vocabulary. Absent when the projection calls for nothing.";
|
|
1188
|
+
};
|
|
1189
|
+
};
|
|
1190
|
+
};
|
|
1191
|
+
readonly ForgeAccount: {
|
|
1192
|
+
readonly title: "ForgeAccount";
|
|
1193
|
+
readonly description: "A person's account on one forge. `id` is authoritative; `login` is for display only, because logins can be renamed and re-registered.";
|
|
1194
|
+
readonly type: "object";
|
|
1195
|
+
readonly additionalProperties: false;
|
|
1196
|
+
readonly required: readonly ["forge", "id", "login"];
|
|
1197
|
+
readonly properties: {
|
|
1198
|
+
readonly forge: {
|
|
1199
|
+
readonly $ref: "#/$defs/ForgeHost";
|
|
1200
|
+
};
|
|
1201
|
+
readonly id: {
|
|
1202
|
+
readonly $ref: "#/$defs/ForgeId";
|
|
1203
|
+
};
|
|
1204
|
+
readonly login: {
|
|
1205
|
+
readonly type: "string";
|
|
1206
|
+
readonly minLength: 1;
|
|
1207
|
+
readonly maxLength: 100;
|
|
1208
|
+
readonly description: "The account's current login, as the forge reported it when last seen. Display only.";
|
|
1209
|
+
};
|
|
1210
|
+
};
|
|
1211
|
+
};
|
|
1212
|
+
readonly ForgeId: {
|
|
1213
|
+
readonly title: "ForgeId";
|
|
1214
|
+
readonly description: "An identifier the forge itself assigns — a repository id, a user or organisation id — carried as a string so a forge whose ids are not numbers needs no new version. GitHub and Forgejo ids are decimal integers written as strings (`\"812736451\"`). Unlike a name, it survives renames and transfers, which is why rights and bindings are keyed by it.";
|
|
1215
|
+
readonly type: "string";
|
|
1216
|
+
readonly minLength: 1;
|
|
1217
|
+
readonly maxLength: 64;
|
|
1218
|
+
};
|
|
1219
|
+
readonly ForgeHost: {
|
|
1220
|
+
readonly title: "ForgeHost";
|
|
1221
|
+
readonly description: "The lowercased DNS host of a forge: `github.com`, a GitHub Enterprise Server host, `codeberg.org`, or a self-hosted Forgejo instance such as `git.example.org`. No scheme, no port, no path. The host is a segment of every resource, so a right never crosses forges.";
|
|
1222
|
+
readonly type: "string";
|
|
1223
|
+
readonly minLength: 3;
|
|
1224
|
+
readonly maxLength: 253;
|
|
1225
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$";
|
|
1226
|
+
};
|
|
1227
|
+
readonly RepoResource: {
|
|
1228
|
+
readonly title: "RepoResource";
|
|
1229
|
+
readonly description: "A forge-qualified resource naming exactly one repository: `<forge-host>/<owner>/<repo>`, lowercase.";
|
|
1230
|
+
readonly type: "string";
|
|
1231
|
+
readonly maxLength: 455;
|
|
1232
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+/[a-z0-9_-][a-z0-9._-]{0,99}/[a-z0-9_-][a-z0-9._-]{0,99}$";
|
|
1233
|
+
};
|
|
1234
|
+
readonly Bootstrap: {
|
|
1235
|
+
readonly title: "Bootstrap";
|
|
1236
|
+
readonly description: "Whether each step that turns commit trust on for a repository is in place, as last reported. A step that this forge's plan does not need reads `true`.";
|
|
1237
|
+
readonly type: "object";
|
|
1238
|
+
readonly additionalProperties: false;
|
|
1239
|
+
readonly required: readonly ["workflow", "keyring", "variables", "requiredCheck"];
|
|
1240
|
+
readonly properties: {
|
|
1241
|
+
readonly workflow: {
|
|
1242
|
+
readonly type: "boolean";
|
|
1243
|
+
readonly description: "The verify-trust check runs on the repository's pull requests — from a workflow committed to it, or, where the forge supports it, required on it from the namespace's own bridge-managed workflow repository at a pinned commit.";
|
|
1244
|
+
};
|
|
1245
|
+
readonly keyring: {
|
|
1246
|
+
readonly type: "boolean";
|
|
1247
|
+
readonly description: "The exempt platform keyring for forge-signed merge commits is committed, or the forge's plan does not need one.";
|
|
1248
|
+
};
|
|
1249
|
+
readonly variables: {
|
|
1250
|
+
readonly type: "boolean";
|
|
1251
|
+
readonly description: "The repository names the Trust Registry and this VTC as its trust anchors.";
|
|
1252
|
+
};
|
|
1253
|
+
readonly requiredCheck: {
|
|
1254
|
+
readonly type: "boolean";
|
|
1255
|
+
readonly description: "The forge refuses to merge into the default branch unless the verify-trust check passes, with no bypass, and a pull request cannot change what that check runs: an organisation-required workflow, code-owner review of workflow files, or protected workflow paths, as the forge allows.";
|
|
1256
|
+
};
|
|
1257
|
+
};
|
|
1258
|
+
};
|
|
1259
|
+
readonly RepoVisibility: {
|
|
1260
|
+
readonly title: "RepoVisibility";
|
|
1261
|
+
readonly type: "string";
|
|
1262
|
+
readonly enum: readonly ["public", "private"];
|
|
1263
|
+
readonly description: "Repository visibility on the forge.";
|
|
1264
|
+
};
|
|
1265
|
+
readonly GitNamespace: {
|
|
1266
|
+
readonly title: "GitNamespace";
|
|
1267
|
+
readonly description: "The VTC's binding to one owner on one forge.";
|
|
1268
|
+
readonly type: "object";
|
|
1269
|
+
readonly additionalProperties: false;
|
|
1270
|
+
readonly required: readonly ["id", "forge", "owner", "mode", "state"];
|
|
1271
|
+
readonly properties: {
|
|
1272
|
+
readonly id: {
|
|
1273
|
+
readonly $ref: "#/$defs/NamespaceId";
|
|
1274
|
+
};
|
|
1275
|
+
readonly forge: {
|
|
1276
|
+
readonly $ref: "#/$defs/ForgeHost";
|
|
1277
|
+
};
|
|
1278
|
+
readonly owner: {
|
|
1279
|
+
readonly $ref: "#/$defs/Segment";
|
|
1280
|
+
readonly description: "The organisation or user on the forge, lowercased.";
|
|
1281
|
+
};
|
|
1282
|
+
readonly kind: {
|
|
1283
|
+
readonly type: "string";
|
|
1284
|
+
readonly enum: readonly ["organization", "user"];
|
|
1285
|
+
readonly description: "Whether the owner is an organisation or a personal account, as the forge reports it. Present once known: a bridge-mode namespace learns it when binding completes, and a manual-mode namespace MAY never learn it.";
|
|
1286
|
+
};
|
|
1287
|
+
readonly mode: {
|
|
1288
|
+
readonly type: "string";
|
|
1289
|
+
readonly enum: readonly ["bridge", "manual"];
|
|
1290
|
+
readonly description: "`bridge` — a bridge service acts on the forge for this namespace (creates repositories, projects roles, reports drift). `manual` — no automation; people with forge access carry out the steps the VTC names, and the VTC governs the rights alone.";
|
|
1291
|
+
};
|
|
1292
|
+
readonly state: {
|
|
1293
|
+
readonly type: "string";
|
|
1294
|
+
readonly enum: readonly ["pending", "bound"];
|
|
1295
|
+
readonly description: "`pending` — binding has started and the forge-side proof has not arrived yet. `bound` — the VTC governs rights under this namespace.";
|
|
1296
|
+
};
|
|
1297
|
+
};
|
|
1298
|
+
};
|
|
1299
|
+
readonly Segment: {
|
|
1300
|
+
readonly title: "Segment";
|
|
1301
|
+
readonly description: "One lowercased owner or repository name. Forges compare these case-insensitively, so the wire form is always lowercase and a producer lowercases before sending. A leading `.` is refused, which rules out `.` and `..`.";
|
|
1302
|
+
readonly type: "string";
|
|
1303
|
+
readonly minLength: 1;
|
|
1304
|
+
readonly maxLength: 100;
|
|
1305
|
+
readonly pattern: "^[a-z0-9_-][a-z0-9._-]*$";
|
|
1306
|
+
};
|
|
1307
|
+
readonly NamespaceId: {
|
|
1308
|
+
readonly title: "NamespaceId";
|
|
1309
|
+
readonly description: "The VTC's opaque identifier for a namespace, assigned when it is bound. Stable for the life of the binding; never reused for another binding.";
|
|
1310
|
+
readonly type: "string";
|
|
1311
|
+
readonly minLength: 1;
|
|
1312
|
+
readonly maxLength: 128;
|
|
1313
|
+
};
|
|
1314
|
+
};
|
|
1315
|
+
};
|
|
1316
|
+
};
|
|
1317
|
+
/**
|
|
1318
|
+
* SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
|
|
1319
|
+
* tracks the *issuer* party's requirement because a response swaps the
|
|
1320
|
+
* parties (§7.3 item 5).
|
|
1321
|
+
*/
|
|
1322
|
+
export declare const RESPONSE_SPEC: {
|
|
1323
|
+
readonly typeUri: "https://trusttasks.org/spec/git-ns/view/0.5#response";
|
|
1324
|
+
readonly isBearer: false;
|
|
1325
|
+
readonly isProofRequired: true;
|
|
1326
|
+
readonly isRecipientRequired: true;
|
|
1327
|
+
readonly isIssuedAtRequired: false;
|
|
1328
|
+
readonly payloadSchema: {
|
|
1329
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
1330
|
+
readonly $ref: "#/$defs/Response";
|
|
1331
|
+
readonly $defs: {
|
|
1332
|
+
readonly LinkedAccount: {
|
|
1333
|
+
readonly title: "LinkedAccount";
|
|
1334
|
+
readonly description: "A forge account linked to the caller's DID with git-ns/account/link, and when the link completed.";
|
|
1335
|
+
readonly type: "object";
|
|
1336
|
+
readonly additionalProperties: false;
|
|
1337
|
+
readonly required: readonly ["account", "linkedAt"];
|
|
1338
|
+
readonly properties: {
|
|
1339
|
+
readonly account: {
|
|
1340
|
+
readonly $ref: "#/$defs/ForgeAccount";
|
|
1341
|
+
readonly description: "The linked account. `id` is authoritative; `login` is as the forge last reported it.";
|
|
1342
|
+
};
|
|
1343
|
+
readonly linkedAt: {
|
|
1344
|
+
readonly type: "string";
|
|
1345
|
+
readonly format: "date-time";
|
|
1346
|
+
readonly description: "When the link completed: when the VTC recorded the account against the caller's DID.";
|
|
1347
|
+
};
|
|
1348
|
+
};
|
|
1349
|
+
};
|
|
1350
|
+
readonly Response: {
|
|
1351
|
+
readonly $anchor: "response";
|
|
1352
|
+
readonly title: "Git Namespaces — View — response payload";
|
|
1353
|
+
readonly description: "What the caller may see — or, with `scope: administrator`, everything in the namespaces they administer — and the caller's own linked forge accounts.";
|
|
1354
|
+
readonly type: "object";
|
|
1355
|
+
readonly additionalProperties: false;
|
|
1356
|
+
readonly required: readonly ["namespaces", "repos", "rights", "accounts"];
|
|
1357
|
+
readonly properties: {
|
|
1358
|
+
readonly namespaces: {
|
|
1359
|
+
readonly type: "array";
|
|
1360
|
+
readonly items: {
|
|
1361
|
+
readonly $ref: "#/$defs/GitNamespace";
|
|
1362
|
+
};
|
|
1363
|
+
readonly description: "Namespaces bound to this VTC that contain, or are contained by, `resource`. With `scope: administrator`, only those the caller administers. With `breakGlass: true`, only those containing a returned record.";
|
|
1364
|
+
};
|
|
1365
|
+
readonly repos: {
|
|
1366
|
+
readonly type: "array";
|
|
1367
|
+
readonly items: {
|
|
1368
|
+
readonly $ref: "#/$defs/RepoSummary";
|
|
1369
|
+
};
|
|
1370
|
+
readonly description: "Repositories within `resource`. `unmanaged` repositories are included only for callers holding `git.ns.admin` over them, or with `scope: administrator`. With `breakGlass: true`, only those carrying a returned record.";
|
|
1371
|
+
};
|
|
1372
|
+
readonly rights: {
|
|
1373
|
+
readonly type: "array";
|
|
1374
|
+
readonly items: {
|
|
1375
|
+
readonly $ref: "#/$defs/RightRecord";
|
|
1376
|
+
};
|
|
1377
|
+
readonly description: "Rights within `resource` the caller may see: always the caller's own; every right on a resource the caller owns or administers; every unratified break-glass record in a namespace they administer or on a resource they own. With `scope: administrator`, every recorded right in the namespaces the caller administers. `reason` is omitted except on resources the caller owns or administers. With `breakGlass: true`, only records carrying `breakGlass`.";
|
|
1378
|
+
};
|
|
1379
|
+
readonly accounts: {
|
|
1380
|
+
readonly type: "array";
|
|
1381
|
+
readonly items: {
|
|
1382
|
+
readonly $ref: "#/$defs/LinkedAccount";
|
|
1383
|
+
};
|
|
1384
|
+
readonly description: "The forge accounts linked to the caller's own DID — never another member's — at most one per forge. With `resource`, only the account on that resource's forge. Empty when the caller has linked none.";
|
|
1385
|
+
};
|
|
1386
|
+
readonly ext: {
|
|
1387
|
+
readonly $ref: "#/$defs/Ext";
|
|
1388
|
+
};
|
|
1389
|
+
};
|
|
1390
|
+
};
|
|
1391
|
+
readonly Ext: {
|
|
1392
|
+
readonly title: "Ext";
|
|
1393
|
+
readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
|
|
1394
|
+
readonly type: "object";
|
|
1395
|
+
readonly minProperties: 1;
|
|
1396
|
+
readonly additionalProperties: true;
|
|
1397
|
+
readonly propertyNames: {
|
|
1398
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
1399
|
+
};
|
|
1400
|
+
};
|
|
1401
|
+
readonly RightRecord: {
|
|
1402
|
+
readonly title: "RightRecord";
|
|
1403
|
+
readonly description: "One recorded right. Implied rights (§4.2 of the rights model: `own` implies `maintain` implies `commit.sign` on the same resource; `ns.admin` implies `repo.create` and `own` across its namespace) are not records and never appear as RightRecords. A record carrying `breakGlass` was given by its subject to themselves through git-ns/right/break-glass; it is a real right, published like any other, and is shown with that flag on every surface that shows the record.";
|
|
1404
|
+
readonly type: "object";
|
|
1405
|
+
readonly additionalProperties: false;
|
|
1406
|
+
readonly required: readonly ["subject", "right", "resource", "grantedBy", "grantedAt"];
|
|
1407
|
+
readonly properties: {
|
|
1408
|
+
readonly subject: {
|
|
1409
|
+
readonly $ref: "#/$defs/Did";
|
|
1410
|
+
readonly description: "Who holds the right. For `git.commit.sign` this is the DID whose commit signatures the CI check accepts.";
|
|
1411
|
+
};
|
|
1412
|
+
readonly right: {
|
|
1413
|
+
readonly $ref: "#/$defs/Right";
|
|
1414
|
+
};
|
|
1415
|
+
readonly resource: {
|
|
1416
|
+
readonly $ref: "#/$defs/Resource";
|
|
1417
|
+
};
|
|
1418
|
+
readonly grantedBy: {
|
|
1419
|
+
readonly $ref: "#/$defs/Did";
|
|
1420
|
+
readonly description: "The actor whose task caused the right: the granter, the creator of a repository (for its first `own`), the adopting admin, the transferring owner, or the binding admin (for the first `git.ns.admin`). The VTC's own DID for a right it derives from its configuration.";
|
|
1421
|
+
};
|
|
1422
|
+
readonly grantedAt: {
|
|
1423
|
+
readonly type: "string";
|
|
1424
|
+
readonly format: "date-time";
|
|
1425
|
+
};
|
|
1426
|
+
readonly expiresAt: {
|
|
1427
|
+
readonly type: "string";
|
|
1428
|
+
readonly format: "date-time";
|
|
1429
|
+
readonly description: "When the right lapses. Absent: no expiry.";
|
|
1430
|
+
};
|
|
1431
|
+
readonly reason: {
|
|
1432
|
+
readonly type: "string";
|
|
1433
|
+
readonly maxLength: 1024;
|
|
1434
|
+
readonly description: "The granter's free-text reason. Disclosed only to holders of `git.repo.own` on the resource and of `git.ns.admin` over it.";
|
|
1435
|
+
};
|
|
1436
|
+
readonly breakGlass: {
|
|
1437
|
+
readonly $ref: "#/$defs/BreakGlass";
|
|
1438
|
+
readonly description: "Present exactly when the subject gave themselves this right through git-ns/right/break-glass. Absent for every other record.";
|
|
1439
|
+
};
|
|
1440
|
+
};
|
|
1441
|
+
};
|
|
1442
|
+
readonly BreakGlass: {
|
|
1443
|
+
readonly title: "BreakGlass";
|
|
1444
|
+
readonly description: "How a self-granted right came to be, and whether another administrator has since ratified it. A record whose `breakGlass` has no `ratifiedBy` is **unratified**: it is live and published like any other right, it does not count toward the last-owner or last-admin invariants, and any community administrator or namespace admin of its namespace may revoke it. Ratification (git-ns/right/ratify) sets `ratifiedBy` and `ratifiedAt`; from then on the record is an ordinary grant, and `breakGlass` stays as its history. Never published to the Trust Registry.";
|
|
1445
|
+
readonly type: "object";
|
|
1446
|
+
readonly additionalProperties: false;
|
|
1447
|
+
readonly required: readonly ["by", "at", "justification"];
|
|
1448
|
+
readonly properties: {
|
|
1449
|
+
readonly by: {
|
|
1450
|
+
readonly $ref: "#/$defs/Did";
|
|
1451
|
+
readonly description: "Who broke the glass: always the record's `subject`, restated so the flag reads on its own.";
|
|
1452
|
+
};
|
|
1453
|
+
readonly at: {
|
|
1454
|
+
readonly type: "string";
|
|
1455
|
+
readonly format: "date-time";
|
|
1456
|
+
readonly description: "When the VTC recorded the break-glass.";
|
|
1457
|
+
};
|
|
1458
|
+
readonly justification: {
|
|
1459
|
+
readonly type: "string";
|
|
1460
|
+
readonly minLength: 1;
|
|
1461
|
+
readonly maxLength: 2048;
|
|
1462
|
+
readonly pattern: "\\S";
|
|
1463
|
+
readonly description: "The actor's statement of why nobody else could grant this right. Shown to every community administrator, every namespace admin of the namespace and every owner of the resource; kept in the audit record; never published.";
|
|
1464
|
+
};
|
|
1465
|
+
readonly effectiveAt: {
|
|
1466
|
+
readonly type: "string";
|
|
1467
|
+
readonly format: "date-time";
|
|
1468
|
+
readonly description: "When the right takes effect, where the community's policy imposed a delay. Absent: it took effect at `at`. Until this instant the record confers nothing and is not published, and any administrator who may revoke it may do so.";
|
|
1469
|
+
};
|
|
1470
|
+
readonly ratifiedBy: {
|
|
1471
|
+
readonly $ref: "#/$defs/Did";
|
|
1472
|
+
readonly description: "The administrator who ratified the record — never its subject. Absent while unratified.";
|
|
1473
|
+
};
|
|
1474
|
+
readonly ratifiedAt: {
|
|
1475
|
+
readonly type: "string";
|
|
1476
|
+
readonly format: "date-time";
|
|
1477
|
+
readonly description: "When it was ratified. Present exactly when `ratifiedBy` is.";
|
|
1478
|
+
};
|
|
1479
|
+
};
|
|
1480
|
+
};
|
|
1481
|
+
readonly Did: {
|
|
1482
|
+
readonly title: "Did";
|
|
1483
|
+
readonly description: "A bare DID in the W3C DID Core syntax (§3.1): `did:`, a method name of lowercase letters and digits, `:`, and a method-specific id of colon-separated segments drawn from `A-Z a-z 0-9 . - _` and percent-encoded octets, the last segment non-empty. A DID URL is not a DID: no path, query or fragment (`/`, `?`, `#`), so a verification-method id such as `did:key:z6Mk…#z6Mk…` is refused. Compared by exact string equality — no case folding or percent-decoding. A consumer MUST still treat the value as data: the pattern keeps shell metacharacters, whitespace and quotes out of the wire form, but it does not make a DID safe to splice into a command or markup.";
|
|
1484
|
+
readonly type: "string";
|
|
1485
|
+
readonly maxLength: 2048;
|
|
1486
|
+
readonly pattern: "^did:[a-z0-9]+:(?:(?:[A-Za-z0-9._-]|%[0-9A-Fa-f]{2})*:)*(?:[A-Za-z0-9._-]|%[0-9A-Fa-f]{2})+$";
|
|
1487
|
+
};
|
|
1488
|
+
readonly Resource: {
|
|
1489
|
+
readonly title: "Resource";
|
|
1490
|
+
readonly description: "A forge-qualified resource: `<forge-host>/<owner>` for a namespace, or `<forge-host>/<owner>/<repo>` for one repository, all lowercase — `github.com/acme`, `github.com/acme/widgets`, `codeberg.org/acme`. The forge is never implied: `acme/widgets` alone is not a resource. Containment is by whole segment: `github.com/acme` contains `github.com/acme/widgets` and does not contain `github.com/acme-labs/x` or `codeberg.org/acme/widgets`.";
|
|
1491
|
+
readonly type: "string";
|
|
1492
|
+
readonly maxLength: 455;
|
|
1493
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+(?:/[a-z0-9_-][a-z0-9._-]{0,99}){1,2}$";
|
|
1494
|
+
};
|
|
1495
|
+
readonly Right: {
|
|
1496
|
+
readonly title: "Right";
|
|
1497
|
+
readonly description: "One of the five git rights. Each string is also the TRQP `action` the VTC publishes the right under in its Trust Registry, so it is carried verbatim. `git.ns.admin` and `git.repo.create` apply to a namespace resource; `git.repo.own` and `git.repo.maintain` to a repository resource; `git.commit.sign` to either.";
|
|
1498
|
+
readonly type: "string";
|
|
1499
|
+
readonly enum: readonly ["git.ns.admin", "git.repo.create", "git.repo.own", "git.repo.maintain", "git.commit.sign"];
|
|
1500
|
+
};
|
|
1501
|
+
readonly RepoSummary: {
|
|
1502
|
+
readonly title: "RepoSummary";
|
|
1503
|
+
readonly description: "One repository as the VTC records it.";
|
|
1504
|
+
readonly type: "object";
|
|
1505
|
+
readonly additionalProperties: false;
|
|
1506
|
+
readonly required: readonly ["resource", "visibility", "state", "owners", "bootstrap", "sync"];
|
|
1507
|
+
readonly properties: {
|
|
1508
|
+
readonly resource: {
|
|
1509
|
+
readonly $ref: "#/$defs/RepoResource";
|
|
1510
|
+
};
|
|
1511
|
+
readonly forgeId: {
|
|
1512
|
+
readonly $ref: "#/$defs/ForgeId";
|
|
1513
|
+
readonly description: "The forge's repository id. Absent until the forge has confirmed the repository exists (a `pendingCreate` repository, or one adopted in bridge mode before the first inspection).";
|
|
1514
|
+
};
|
|
1515
|
+
readonly visibility: {
|
|
1516
|
+
readonly $ref: "#/$defs/RepoVisibility";
|
|
1517
|
+
};
|
|
1518
|
+
readonly state: {
|
|
1519
|
+
readonly type: "string";
|
|
1520
|
+
readonly enum: readonly ["pendingCreate", "active", "archived", "detached", "orphaned", "unmanaged"];
|
|
1521
|
+
readonly description: "`pendingCreate` — the name is reserved and the repository is not yet confirmed on the forge. `active` — managed. `archived` — archived through git-ns/repo/archive; commit rights on it are revoked. `detached` — no longer governed: its namespace was unbound, or it moved outside the namespace. `orphaned` — its last owner left the community and ownership passed to the namespace admins, who have not yet named a new owner. `unmanaged` — it exists on the forge inside a bound namespace but was never created or adopted through the VTC.";
|
|
1522
|
+
};
|
|
1523
|
+
readonly owners: {
|
|
1524
|
+
readonly type: "array";
|
|
1525
|
+
readonly uniqueItems: true;
|
|
1526
|
+
readonly items: {
|
|
1527
|
+
readonly $ref: "#/$defs/Did";
|
|
1528
|
+
};
|
|
1529
|
+
readonly description: "The DIDs holding `git.repo.own` on this repository by an explicit grant. Empty only for an `unmanaged` repository, and for an `orphaned` one whose ownership rests with the namespace admins by implication.";
|
|
1530
|
+
};
|
|
1531
|
+
readonly bootstrap: {
|
|
1532
|
+
readonly $ref: "#/$defs/Bootstrap";
|
|
1533
|
+
};
|
|
1534
|
+
readonly sync: {
|
|
1535
|
+
readonly $ref: "#/$defs/Sync";
|
|
1536
|
+
};
|
|
1537
|
+
};
|
|
1538
|
+
};
|
|
1539
|
+
readonly Sync: {
|
|
1540
|
+
readonly title: "Sync";
|
|
1541
|
+
readonly description: "How the forge compares with the VTC's projection for one repository.";
|
|
1542
|
+
readonly type: "object";
|
|
1543
|
+
readonly additionalProperties: false;
|
|
1544
|
+
readonly required: readonly ["state", "drift"];
|
|
1545
|
+
readonly properties: {
|
|
1546
|
+
readonly state: {
|
|
1547
|
+
readonly type: "string";
|
|
1548
|
+
readonly enum: readonly ["inSync", "drift", "pending", "unchecked"];
|
|
1549
|
+
readonly description: "`inSync` — the last comparison found no drift. `drift` — it found some, listed in `drift`. `pending` — a change has been sent to the forge and not yet confirmed. `unchecked` — nothing compares this repository (a manual-mode namespace).";
|
|
1550
|
+
};
|
|
1551
|
+
readonly checkedAt: {
|
|
1552
|
+
readonly type: "string";
|
|
1553
|
+
readonly format: "date-time";
|
|
1554
|
+
readonly description: "When the forge was last compared. Absent if never.";
|
|
1555
|
+
};
|
|
1556
|
+
readonly drift: {
|
|
1557
|
+
readonly type: "array";
|
|
1558
|
+
readonly items: {
|
|
1559
|
+
readonly $ref: "#/$defs/DriftItem";
|
|
1560
|
+
};
|
|
1561
|
+
readonly description: "Outstanding drift. Empty unless `state` is `drift`.";
|
|
1562
|
+
};
|
|
1563
|
+
};
|
|
1564
|
+
};
|
|
1565
|
+
readonly DriftItem: {
|
|
1566
|
+
readonly title: "DriftItem";
|
|
1567
|
+
readonly description: "One difference between the forge's observed state and the VTC's projection of a repository.";
|
|
1568
|
+
readonly type: "object";
|
|
1569
|
+
readonly additionalProperties: false;
|
|
1570
|
+
readonly required: readonly ["type", "resource"];
|
|
1571
|
+
readonly properties: {
|
|
1572
|
+
readonly type: {
|
|
1573
|
+
readonly type: "string";
|
|
1574
|
+
readonly enum: readonly ["roleAdded", "roleRemoved", "roleChanged", "requiredCheckMissing", "protectionWeakened", "bootstrapMissing"];
|
|
1575
|
+
readonly description: "`roleAdded` — someone holds a forge role the projection does not give them. `roleRemoved` — a projected role is missing. `roleChanged` — a projected role is present at another level. `requiredCheckMissing` — the verify-trust check is no longer required. `protectionWeakened` — branch protection or a ruleset is weaker than the projection in another way (force-push allowed, bypass actors added). `bootstrapMissing` — a bootstrap file or variable is gone.";
|
|
1576
|
+
};
|
|
1577
|
+
readonly resource: {
|
|
1578
|
+
readonly $ref: "#/$defs/RepoResource";
|
|
1579
|
+
};
|
|
1580
|
+
readonly account: {
|
|
1581
|
+
readonly $ref: "#/$defs/ForgeAccount";
|
|
1582
|
+
readonly description: "Whose role differs, for the three role types.";
|
|
1583
|
+
};
|
|
1584
|
+
readonly observed: {
|
|
1585
|
+
readonly type: "string";
|
|
1586
|
+
readonly maxLength: 256;
|
|
1587
|
+
readonly description: "What the forge shows, in the forge's own vocabulary (a role name such as `maintain`, a setting name). Absent when nothing is there.";
|
|
1588
|
+
};
|
|
1589
|
+
readonly expected: {
|
|
1590
|
+
readonly type: "string";
|
|
1591
|
+
readonly maxLength: 256;
|
|
1592
|
+
readonly description: "What the projection calls for, in the forge's own vocabulary. Absent when the projection calls for nothing.";
|
|
1593
|
+
};
|
|
1594
|
+
};
|
|
1595
|
+
};
|
|
1596
|
+
readonly ForgeAccount: {
|
|
1597
|
+
readonly title: "ForgeAccount";
|
|
1598
|
+
readonly description: "A person's account on one forge. `id` is authoritative; `login` is for display only, because logins can be renamed and re-registered.";
|
|
1599
|
+
readonly type: "object";
|
|
1600
|
+
readonly additionalProperties: false;
|
|
1601
|
+
readonly required: readonly ["forge", "id", "login"];
|
|
1602
|
+
readonly properties: {
|
|
1603
|
+
readonly forge: {
|
|
1604
|
+
readonly $ref: "#/$defs/ForgeHost";
|
|
1605
|
+
};
|
|
1606
|
+
readonly id: {
|
|
1607
|
+
readonly $ref: "#/$defs/ForgeId";
|
|
1608
|
+
};
|
|
1609
|
+
readonly login: {
|
|
1610
|
+
readonly type: "string";
|
|
1611
|
+
readonly minLength: 1;
|
|
1612
|
+
readonly maxLength: 100;
|
|
1613
|
+
readonly description: "The account's current login, as the forge reported it when last seen. Display only.";
|
|
1614
|
+
};
|
|
1615
|
+
};
|
|
1616
|
+
};
|
|
1617
|
+
readonly ForgeId: {
|
|
1618
|
+
readonly title: "ForgeId";
|
|
1619
|
+
readonly description: "An identifier the forge itself assigns — a repository id, a user or organisation id — carried as a string so a forge whose ids are not numbers needs no new version. GitHub and Forgejo ids are decimal integers written as strings (`\"812736451\"`). Unlike a name, it survives renames and transfers, which is why rights and bindings are keyed by it.";
|
|
1620
|
+
readonly type: "string";
|
|
1621
|
+
readonly minLength: 1;
|
|
1622
|
+
readonly maxLength: 64;
|
|
1623
|
+
};
|
|
1624
|
+
readonly ForgeHost: {
|
|
1625
|
+
readonly title: "ForgeHost";
|
|
1626
|
+
readonly description: "The lowercased DNS host of a forge: `github.com`, a GitHub Enterprise Server host, `codeberg.org`, or a self-hosted Forgejo instance such as `git.example.org`. No scheme, no port, no path. The host is a segment of every resource, so a right never crosses forges.";
|
|
1627
|
+
readonly type: "string";
|
|
1628
|
+
readonly minLength: 3;
|
|
1629
|
+
readonly maxLength: 253;
|
|
1630
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$";
|
|
1631
|
+
};
|
|
1632
|
+
readonly RepoResource: {
|
|
1633
|
+
readonly title: "RepoResource";
|
|
1634
|
+
readonly description: "A forge-qualified resource naming exactly one repository: `<forge-host>/<owner>/<repo>`, lowercase.";
|
|
1635
|
+
readonly type: "string";
|
|
1636
|
+
readonly maxLength: 455;
|
|
1637
|
+
readonly pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+/[a-z0-9_-][a-z0-9._-]{0,99}/[a-z0-9_-][a-z0-9._-]{0,99}$";
|
|
1638
|
+
};
|
|
1639
|
+
readonly Bootstrap: {
|
|
1640
|
+
readonly title: "Bootstrap";
|
|
1641
|
+
readonly description: "Whether each step that turns commit trust on for a repository is in place, as last reported. A step that this forge's plan does not need reads `true`.";
|
|
1642
|
+
readonly type: "object";
|
|
1643
|
+
readonly additionalProperties: false;
|
|
1644
|
+
readonly required: readonly ["workflow", "keyring", "variables", "requiredCheck"];
|
|
1645
|
+
readonly properties: {
|
|
1646
|
+
readonly workflow: {
|
|
1647
|
+
readonly type: "boolean";
|
|
1648
|
+
readonly description: "The verify-trust check runs on the repository's pull requests — from a workflow committed to it, or, where the forge supports it, required on it from the namespace's own bridge-managed workflow repository at a pinned commit.";
|
|
1649
|
+
};
|
|
1650
|
+
readonly keyring: {
|
|
1651
|
+
readonly type: "boolean";
|
|
1652
|
+
readonly description: "The exempt platform keyring for forge-signed merge commits is committed, or the forge's plan does not need one.";
|
|
1653
|
+
};
|
|
1654
|
+
readonly variables: {
|
|
1655
|
+
readonly type: "boolean";
|
|
1656
|
+
readonly description: "The repository names the Trust Registry and this VTC as its trust anchors.";
|
|
1657
|
+
};
|
|
1658
|
+
readonly requiredCheck: {
|
|
1659
|
+
readonly type: "boolean";
|
|
1660
|
+
readonly description: "The forge refuses to merge into the default branch unless the verify-trust check passes, with no bypass, and a pull request cannot change what that check runs: an organisation-required workflow, code-owner review of workflow files, or protected workflow paths, as the forge allows.";
|
|
1661
|
+
};
|
|
1662
|
+
};
|
|
1663
|
+
};
|
|
1664
|
+
readonly RepoVisibility: {
|
|
1665
|
+
readonly title: "RepoVisibility";
|
|
1666
|
+
readonly type: "string";
|
|
1667
|
+
readonly enum: readonly ["public", "private"];
|
|
1668
|
+
readonly description: "Repository visibility on the forge.";
|
|
1669
|
+
};
|
|
1670
|
+
readonly GitNamespace: {
|
|
1671
|
+
readonly title: "GitNamespace";
|
|
1672
|
+
readonly description: "The VTC's binding to one owner on one forge.";
|
|
1673
|
+
readonly type: "object";
|
|
1674
|
+
readonly additionalProperties: false;
|
|
1675
|
+
readonly required: readonly ["id", "forge", "owner", "mode", "state"];
|
|
1676
|
+
readonly properties: {
|
|
1677
|
+
readonly id: {
|
|
1678
|
+
readonly $ref: "#/$defs/NamespaceId";
|
|
1679
|
+
};
|
|
1680
|
+
readonly forge: {
|
|
1681
|
+
readonly $ref: "#/$defs/ForgeHost";
|
|
1682
|
+
};
|
|
1683
|
+
readonly owner: {
|
|
1684
|
+
readonly $ref: "#/$defs/Segment";
|
|
1685
|
+
readonly description: "The organisation or user on the forge, lowercased.";
|
|
1686
|
+
};
|
|
1687
|
+
readonly kind: {
|
|
1688
|
+
readonly type: "string";
|
|
1689
|
+
readonly enum: readonly ["organization", "user"];
|
|
1690
|
+
readonly description: "Whether the owner is an organisation or a personal account, as the forge reports it. Present once known: a bridge-mode namespace learns it when binding completes, and a manual-mode namespace MAY never learn it.";
|
|
1691
|
+
};
|
|
1692
|
+
readonly mode: {
|
|
1693
|
+
readonly type: "string";
|
|
1694
|
+
readonly enum: readonly ["bridge", "manual"];
|
|
1695
|
+
readonly description: "`bridge` — a bridge service acts on the forge for this namespace (creates repositories, projects roles, reports drift). `manual` — no automation; people with forge access carry out the steps the VTC names, and the VTC governs the rights alone.";
|
|
1696
|
+
};
|
|
1697
|
+
readonly state: {
|
|
1698
|
+
readonly type: "string";
|
|
1699
|
+
readonly enum: readonly ["pending", "bound"];
|
|
1700
|
+
readonly description: "`pending` — binding has started and the forge-side proof has not arrived yet. `bound` — the VTC governs rights under this namespace.";
|
|
1701
|
+
};
|
|
1702
|
+
};
|
|
1703
|
+
};
|
|
1704
|
+
readonly Segment: {
|
|
1705
|
+
readonly title: "Segment";
|
|
1706
|
+
readonly description: "One lowercased owner or repository name. Forges compare these case-insensitively, so the wire form is always lowercase and a producer lowercases before sending. A leading `.` is refused, which rules out `.` and `..`.";
|
|
1707
|
+
readonly type: "string";
|
|
1708
|
+
readonly minLength: 1;
|
|
1709
|
+
readonly maxLength: 100;
|
|
1710
|
+
readonly pattern: "^[a-z0-9_-][a-z0-9._-]*$";
|
|
1711
|
+
};
|
|
1712
|
+
readonly NamespaceId: {
|
|
1713
|
+
readonly title: "NamespaceId";
|
|
1714
|
+
readonly description: "The VTC's opaque identifier for a namespace, assigned when it is bound. Stable for the life of the binding; never reused for another binding.";
|
|
1715
|
+
readonly type: "string";
|
|
1716
|
+
readonly minLength: 1;
|
|
1717
|
+
readonly maxLength: 128;
|
|
1718
|
+
};
|
|
1719
|
+
};
|
|
1720
|
+
};
|
|
1721
|
+
};
|
|
1722
|
+
//# sourceMappingURL=payload.d.ts.map
|