@unson/brainbase-mcp 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/contracts/judgment-dag/digest.json +2 -2
- package/dist/canonical-task-contract.d.ts +9 -0
- package/dist/canonical-task-contract.js +39 -0
- package/dist/canonical-task-principal.d.ts +16 -0
- package/dist/canonical-task-principal.js +36 -0
- package/dist/canonical-task-service.d.ts +251 -0
- package/dist/canonical-task-service.js +809 -0
- package/dist/company-os-evaluation.d.ts +193 -0
- package/dist/company-os-evaluation.js +1150 -0
- package/dist/company-os-impact-review.d.ts +248 -0
- package/dist/company-os-impact-review.js +663 -0
- package/dist/company-os-learning-adoption.d.ts +288 -0
- package/dist/company-os-learning-adoption.js +944 -0
- package/dist/company-os-objectives.d.ts +52 -0
- package/dist/company-os-objectives.js +197 -0
- package/dist/company-os-receipt-adapter.d.ts +109 -0
- package/dist/company-os-receipt-adapter.js +636 -0
- package/dist/constraint-exception-store.d.ts +23 -0
- package/dist/constraint-exception-store.js +108 -0
- package/dist/constraint-resolution.d.ts +175 -0
- package/dist/constraint-resolution.js +922 -0
- package/dist/decision-adapter.d.ts +145 -0
- package/dist/decision-adapter.js +586 -0
- package/dist/durable-wait-http.d.ts +51 -0
- package/dist/durable-wait-http.js +497 -0
- package/dist/durable-waits.d.ts +234 -0
- package/dist/durable-waits.js +944 -0
- package/dist/execution-authority-http.d.ts +28 -0
- package/dist/execution-authority-http.js +359 -0
- package/dist/execution-authority.d.ts +201 -0
- package/dist/execution-authority.js +634 -0
- package/dist/foundation-catalog.d.ts +26 -0
- package/dist/foundation-catalog.js +206 -0
- package/dist/foundation-constraint-store.d.ts +50 -0
- package/dist/foundation-constraint-store.js +215 -0
- package/dist/foundation-http.d.ts +90 -0
- package/dist/foundation-http.js +439 -0
- package/dist/foundation-store.d.ts +132 -0
- package/dist/foundation-store.js +654 -0
- package/dist/judgment-dag-composition.d.ts +224 -0
- package/dist/judgment-dag-composition.js +731 -0
- package/dist/judgment-dag.d.ts +2 -0
- package/dist/judgment-dag.js +1 -0
- package/dist/judgment-problem-snapshot.d.ts +185 -0
- package/dist/judgment-problem-snapshot.js +777 -0
- package/dist/judgment-view-http.d.ts +22 -0
- package/dist/judgment-view-http.js +128 -0
- package/dist/judgment-view.d.ts +222 -0
- package/dist/judgment-view.js +627 -0
- package/dist/knowledge-adapter.d.ts +112 -0
- package/dist/knowledge-adapter.js +691 -0
- package/dist/ontology-foundation.d.ts +209 -0
- package/dist/ontology-foundation.js +1000 -0
- package/dist/ontology.d.ts +13 -0
- package/dist/ontology.js +14 -0
- package/dist/organization-connection.d.ts +164 -0
- package/dist/organization-connection.js +428 -0
- package/dist/personal-knowledge.d.ts +120 -0
- package/dist/personal-knowledge.js +750 -0
- package/dist/problem-candidates.d.ts +149 -0
- package/dist/problem-candidates.js +898 -0
- package/dist/problem-selection.d.ts +238 -0
- package/dist/problem-selection.js +995 -0
- package/dist/resource-reservation-http.d.ts +31 -0
- package/dist/resource-reservation-http.js +371 -0
- package/dist/resource-reservations.d.ts +221 -0
- package/dist/resource-reservations.js +577 -0
- package/dist/server.d.ts +97 -0
- package/dist/server.js +180 -1
- package/dist/ssot.d.ts +6 -1
- package/dist/ssot.js +63 -5
- package/dist/streamable-http.d.ts +42 -0
- package/dist/streamable-http.js +288 -0
- package/dist/types.d.ts +20 -0
- package/dist/world-model.d.ts +181 -0
- package/dist/world-model.js +873 -0
- package/package.json +145 -3
- package/ui/icons/mana/LICENSE.tabler.txt +21 -0
- package/ui/icons/mana/affiliate.svg +20 -0
- package/ui/icons/mana/brand-github.svg +15 -0
- package/ui/icons/mana/brand-google-drive.svg +17 -0
- package/ui/icons/mana/brand-slack.svg +18 -0
- package/ui/icons/mana/cpu.svg +24 -0
- package/ui/judgment-view.css +238 -0
- package/ui/judgment-view.js +508 -0
- package/ui/objective-editor.css +180 -0
- package/ui/objective-editor.js +1139 -0
- package/ui/outcome-knowledge.css +365 -0
- package/ui/outcome-knowledge.js +1570 -0
- package/ui/outcome-mana.css +255 -0
- package/ui/outcome-mana.js +2325 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ConstraintError, validateConstraintExceptionRecord, } from './constraint-resolution.js';
|
|
2
|
+
import { mutatePersonalOsWithSidecar, readPersonalOsSidecar } from './ssot.js';
|
|
3
|
+
/** The shared SSOT evidence area used for rich exception metadata. */
|
|
4
|
+
export const CONSTRAINT_EXCEPTION_EVIDENCE_PATH = 'evidence/constraint-exceptions.jsonl';
|
|
5
|
+
/**
|
|
6
|
+
* Durable exception evidence stored through the common SSOT transaction
|
|
7
|
+
* writer. Constraint definitions remain in GraphFoundationRevisionStore;
|
|
8
|
+
* this evidence adapter only supplies the approval metadata missing from the
|
|
9
|
+
* shared ontology reference. Authorization is intentionally performed by
|
|
10
|
+
* ConstraintService's injected provider before this storage port is called.
|
|
11
|
+
*/
|
|
12
|
+
export class AtomicConstraintExceptionStore {
|
|
13
|
+
dataDir;
|
|
14
|
+
evidencePath;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
if (!options.dataDir) {
|
|
17
|
+
throw new ConstraintError('constraint_store_unavailable', 'exception evidence dataDir is required', 503);
|
|
18
|
+
}
|
|
19
|
+
this.dataDir = options.dataDir;
|
|
20
|
+
this.evidencePath = options.evidencePath ?? CONSTRAINT_EXCEPTION_EVIDENCE_PATH;
|
|
21
|
+
}
|
|
22
|
+
async append(exception, _context) {
|
|
23
|
+
validateConstraintExceptionRecord(exception);
|
|
24
|
+
try {
|
|
25
|
+
const stored = await mutatePersonalOsWithSidecar(this.dataDir, this.evidencePath, async (current, existingContent) => {
|
|
26
|
+
const records = parseEvidence(existingContent ?? '');
|
|
27
|
+
if (records.some((record) => record.id === exception.id)) {
|
|
28
|
+
throw new ConstraintError('revision_conflict', 'exception id already exists', 409, { id: exception.id });
|
|
29
|
+
}
|
|
30
|
+
const next = [...records, clone(exception)].sort((left, right) => left.id.localeCompare(right.id, 'en'));
|
|
31
|
+
return {
|
|
32
|
+
next: current,
|
|
33
|
+
sidecarContent: serializeEvidence(next),
|
|
34
|
+
result: clone(exception),
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
return stored;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error instanceof ConstraintError)
|
|
41
|
+
throw error;
|
|
42
|
+
throw new ConstraintError('constraint_store_unavailable', 'exception evidence could not be persisted', 503, {
|
|
43
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async list(query, _context) {
|
|
48
|
+
let content;
|
|
49
|
+
try {
|
|
50
|
+
content = await readPersonalOsSidecar(this.dataDir, this.evidencePath);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error instanceof ConstraintError)
|
|
54
|
+
throw error;
|
|
55
|
+
throw new ConstraintError('constraint_store_unavailable', 'exception evidence could not be read', 503, {
|
|
56
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (content === undefined)
|
|
60
|
+
return [];
|
|
61
|
+
return parseEvidence(content)
|
|
62
|
+
.filter((record) => query.constraintId === undefined || record.constraintRef.id === query.constraintId)
|
|
63
|
+
.filter((record) => query.constraintRevision === undefined || record.constraintRef.revision === query.constraintRevision)
|
|
64
|
+
.map(clone);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function createAtomicConstraintExceptionStore(options) {
|
|
68
|
+
return new AtomicConstraintExceptionStore(options);
|
|
69
|
+
}
|
|
70
|
+
function parseEvidence(content) {
|
|
71
|
+
const records = [];
|
|
72
|
+
for (const [index, line] of content.split(/\r?\n/u).map((value) => value.trim()).filter(Boolean).entries()) {
|
|
73
|
+
let parsed;
|
|
74
|
+
try {
|
|
75
|
+
parsed = JSON.parse(line);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw new ConstraintError('constraint_store_corrupt', `exception evidence line ${index + 1} is not valid JSON`, 500, {
|
|
79
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
validateConstraintExceptionRecord(parsed);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof ConstraintError)
|
|
87
|
+
throw error;
|
|
88
|
+
throw new ConstraintError('constraint_store_corrupt', `exception evidence line ${index + 1} is invalid`, 500, {
|
|
89
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
records.push(clone(parsed));
|
|
93
|
+
}
|
|
94
|
+
const ids = new Set();
|
|
95
|
+
for (const record of records) {
|
|
96
|
+
if (ids.has(record.id)) {
|
|
97
|
+
throw new ConstraintError('constraint_store_corrupt', 'exception evidence contains duplicate ids', 500, { id: record.id });
|
|
98
|
+
}
|
|
99
|
+
ids.add(record.id);
|
|
100
|
+
}
|
|
101
|
+
return records;
|
|
102
|
+
}
|
|
103
|
+
function serializeEvidence(records) {
|
|
104
|
+
return records.length === 0 ? '' : `${records.map((record) => JSON.stringify(record)).join('\n')}\n`;
|
|
105
|
+
}
|
|
106
|
+
function clone(value) {
|
|
107
|
+
return JSON.parse(JSON.stringify(value));
|
|
108
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type { ConstraintDefinition, ConstraintException, DecisionRevision, FoundationAcl, FoundationAdoptionState, FoundationEpistemicState, FoundationProvenance, FoundationScope, FoundationStorage, FoundationUse } from './ontology-foundation.js';
|
|
2
|
+
export type ConstraintUse = FoundationUse;
|
|
3
|
+
export type ConstraintEpistemicState = FoundationEpistemicState;
|
|
4
|
+
export type ConstraintAdoptionState = FoundationAdoptionState;
|
|
5
|
+
export type ConstraintStorage = FoundationStorage;
|
|
6
|
+
export type ConstraintVisibility = FoundationAcl['visibility'];
|
|
7
|
+
export type ConstraintProvenanceKind = FoundationProvenance['sourceKind'];
|
|
8
|
+
export type ConstraintScope = FoundationScope;
|
|
9
|
+
export type ConstraintAcl = FoundationAcl;
|
|
10
|
+
export type ConstraintProvenance = FoundationProvenance;
|
|
11
|
+
export type ConstraintDecisionReference = DecisionRevision;
|
|
12
|
+
export type ConstraintExceptionReference = ConstraintException;
|
|
13
|
+
export type ConstraintProjection = ConstraintDefinition;
|
|
14
|
+
export interface ConstraintRef {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly revision: string;
|
|
17
|
+
}
|
|
18
|
+
/** A durable exception record kept by the canonical store adapter. */
|
|
19
|
+
export interface ConstraintExceptionRecord {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly constraintRef: ConstraintRef;
|
|
22
|
+
readonly decisionRef: ConstraintDecisionReference;
|
|
23
|
+
readonly approverId: string;
|
|
24
|
+
readonly scope: ConstraintScope;
|
|
25
|
+
readonly expiresAt: string;
|
|
26
|
+
readonly rationale: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ConstraintStoreQuery {
|
|
29
|
+
readonly ownerId?: string;
|
|
30
|
+
readonly id?: string;
|
|
31
|
+
readonly revision?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ConstraintExceptionQuery {
|
|
34
|
+
readonly constraintId?: string;
|
|
35
|
+
readonly constraintRevision?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ConstraintStore<TConstraint extends ConstraintProjection = ConstraintProjection> {
|
|
38
|
+
/**
|
|
39
|
+
* Append one immutable revision. `null` means that the id must not exist;
|
|
40
|
+
* a string is an atomic compare-and-swap against the current revision.
|
|
41
|
+
*/
|
|
42
|
+
append(input: {
|
|
43
|
+
record: TConstraint;
|
|
44
|
+
expectedPreviousRevision?: string | null;
|
|
45
|
+
}, context?: ConstraintAuthorizationContext): Promise<TConstraint>;
|
|
46
|
+
get(ref: {
|
|
47
|
+
id: string;
|
|
48
|
+
revision: string;
|
|
49
|
+
}, context?: ConstraintAuthorizationContext): Promise<TConstraint | null>;
|
|
50
|
+
getLatest(id: string, context?: ConstraintAuthorizationContext): Promise<TConstraint | null>;
|
|
51
|
+
list(query: ConstraintStoreQuery, context?: ConstraintAuthorizationContext): Promise<readonly TConstraint[]>;
|
|
52
|
+
appendException(exception: ConstraintExceptionRecord, context?: ConstraintAuthorizationContext): Promise<ConstraintExceptionRecord>;
|
|
53
|
+
listExceptions(query: ConstraintExceptionQuery, context?: ConstraintAuthorizationContext): Promise<readonly ConstraintExceptionRecord[]>;
|
|
54
|
+
}
|
|
55
|
+
export type ConstraintAction = 'create' | 'update' | 'read' | 'resolve' | 'adopt' | 'exception';
|
|
56
|
+
export interface ConstraintAuthorizationContext {
|
|
57
|
+
readonly actorId: string;
|
|
58
|
+
readonly ownerId: string;
|
|
59
|
+
readonly [key: string]: unknown;
|
|
60
|
+
}
|
|
61
|
+
export interface ConstraintAuthorizationRequest {
|
|
62
|
+
readonly action: ConstraintAction;
|
|
63
|
+
readonly context: ConstraintAuthorizationContext;
|
|
64
|
+
readonly ownerId?: string;
|
|
65
|
+
readonly constraint?: ConstraintProjection | null;
|
|
66
|
+
readonly input?: unknown;
|
|
67
|
+
}
|
|
68
|
+
export interface ConstraintAuthorizationPort {
|
|
69
|
+
authorize(request: ConstraintAuthorizationRequest): void | Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
export interface DecisionRevisionReader {
|
|
72
|
+
exists(reference: ConstraintDecisionReference, context: ConstraintAuthorizationContext): Promise<boolean>;
|
|
73
|
+
}
|
|
74
|
+
export type ConstraintEvaluationResult = {
|
|
75
|
+
readonly status: 'resolved';
|
|
76
|
+
readonly applies: boolean;
|
|
77
|
+
readonly reason?: string;
|
|
78
|
+
} | {
|
|
79
|
+
readonly status: 'unknown';
|
|
80
|
+
readonly reason: string;
|
|
81
|
+
} | {
|
|
82
|
+
readonly status: 'conflict';
|
|
83
|
+
readonly reason: string;
|
|
84
|
+
readonly conflictingRefs?: readonly ConstraintRef[];
|
|
85
|
+
};
|
|
86
|
+
export interface ConstraintResolutionQuery {
|
|
87
|
+
readonly ownerId: string;
|
|
88
|
+
readonly subjectId?: string;
|
|
89
|
+
readonly targetId?: string;
|
|
90
|
+
readonly asOf: string;
|
|
91
|
+
readonly use?: ConstraintUse;
|
|
92
|
+
}
|
|
93
|
+
export interface ConstraintEvaluationInput<TConstraint extends ConstraintProjection = ConstraintProjection> {
|
|
94
|
+
readonly constraint: TConstraint;
|
|
95
|
+
readonly candidates: readonly TConstraint[];
|
|
96
|
+
readonly query: ConstraintResolutionQuery;
|
|
97
|
+
readonly activeExceptions: readonly ConstraintExceptionRecord[];
|
|
98
|
+
}
|
|
99
|
+
export interface ConstraintEvaluationProvider<TConstraint extends ConstraintProjection = ConstraintProjection> {
|
|
100
|
+
evaluate(input: ConstraintEvaluationInput<TConstraint>): Promise<ConstraintEvaluationResult> | ConstraintEvaluationResult;
|
|
101
|
+
}
|
|
102
|
+
export interface ConstraintResolutionIssue {
|
|
103
|
+
readonly code: 'scope_violation' | 'constraint_store_unavailable' | 'scope_unknown' | 'target_scope_unknown' | 'decision_reference_missing' | 'decision_reference_unresolved' | 'retired_constraint' | 'unauthorized_use' | 'exception_invalid' | 'exception_store_unavailable' | 'evaluation_unknown' | 'constraint_conflict' | 'evaluation_invalid' | 'evaluation_unavailable';
|
|
104
|
+
readonly message: string;
|
|
105
|
+
readonly constraintRef?: ConstraintRef;
|
|
106
|
+
readonly conflictingRefs?: readonly ConstraintRef[];
|
|
107
|
+
}
|
|
108
|
+
export interface ConstraintResolution<TConstraint extends ConstraintProjection = ConstraintProjection> {
|
|
109
|
+
readonly status: 'resolved' | 'unresolved';
|
|
110
|
+
readonly constraints: readonly TConstraint[];
|
|
111
|
+
readonly unresolvedReasons: readonly ConstraintResolutionIssue[];
|
|
112
|
+
/** Resolution never grants permission to perform an external action. */
|
|
113
|
+
readonly executionAuthority: 'not_granted';
|
|
114
|
+
}
|
|
115
|
+
export interface ConstraintRevisionSequence {
|
|
116
|
+
next(currentRevision: string): string;
|
|
117
|
+
compare(left: string, right: string): number;
|
|
118
|
+
}
|
|
119
|
+
export interface ConstraintServiceOptions<TConstraint extends ConstraintProjection = ConstraintProjection> {
|
|
120
|
+
readonly store: ConstraintStore<TConstraint>;
|
|
121
|
+
readonly authorization: ConstraintAuthorizationPort;
|
|
122
|
+
readonly decisionReader: DecisionRevisionReader;
|
|
123
|
+
readonly evaluator: ConstraintEvaluationProvider<TConstraint>;
|
|
124
|
+
readonly revisionSequence?: ConstraintRevisionSequence;
|
|
125
|
+
}
|
|
126
|
+
export type ConstraintPatch<TConstraint extends ConstraintProjection = ConstraintProjection> = Partial<Omit<TConstraint, 'id' | 'type' | 'revision'>>;
|
|
127
|
+
export declare class ConstraintError extends Error {
|
|
128
|
+
readonly code: ConstraintErrorCode;
|
|
129
|
+
readonly status: number;
|
|
130
|
+
readonly details: Readonly<Record<string, unknown>>;
|
|
131
|
+
constructor(code: ConstraintErrorCode, message: string, status?: number, details?: Readonly<Record<string, unknown>>);
|
|
132
|
+
}
|
|
133
|
+
export type ConstraintErrorCode = 'invalid_constraint' | 'invalid_scope' | 'invalid_revision' | 'revision_conflict' | 'constraint_not_found' | 'decision_reference_unresolved' | 'authorization_denied' | 'scope_violation' | 'exception_invalid' | 'exception_not_found' | 'constraint_store_unavailable' | 'constraint_store_corrupt' | 'unsupported_revision_sequence';
|
|
134
|
+
export declare const numericConstraintRevisionSequence: ConstraintRevisionSequence;
|
|
135
|
+
export interface InMemoryConstraintStoreOptions {
|
|
136
|
+
readonly compareRevisions?: (left: string, right: string) => number;
|
|
137
|
+
}
|
|
138
|
+
/** In-memory adapter used by contract tests; production uses the injected canonical store. */
|
|
139
|
+
export declare class InMemoryConstraintStore<TConstraint extends ConstraintProjection = ConstraintProjection> implements ConstraintStore<TConstraint> {
|
|
140
|
+
private readonly records;
|
|
141
|
+
private readonly exceptions;
|
|
142
|
+
private readonly compareRevisions;
|
|
143
|
+
constructor(options?: InMemoryConstraintStoreOptions);
|
|
144
|
+
append(input: {
|
|
145
|
+
record: TConstraint;
|
|
146
|
+
expectedPreviousRevision?: string | null;
|
|
147
|
+
}): Promise<TConstraint>;
|
|
148
|
+
get(ref: {
|
|
149
|
+
id: string;
|
|
150
|
+
revision: string;
|
|
151
|
+
}): Promise<TConstraint | null>;
|
|
152
|
+
getLatest(id: string): Promise<TConstraint | null>;
|
|
153
|
+
list(query: ConstraintStoreQuery): Promise<readonly TConstraint[]>;
|
|
154
|
+
appendException(exception: ConstraintExceptionRecord): Promise<ConstraintExceptionRecord>;
|
|
155
|
+
listExceptions(query: ConstraintExceptionQuery): Promise<readonly ConstraintExceptionRecord[]>;
|
|
156
|
+
}
|
|
157
|
+
/** Validate a durable exception before a persistence adapter writes it. */
|
|
158
|
+
export declare function validateConstraintExceptionRecord(exception: ConstraintExceptionRecord): void;
|
|
159
|
+
export declare function createSingleOwnerConstraintAuthorization(): ConstraintAuthorizationPort;
|
|
160
|
+
export declare class ConstraintService<TConstraint extends ConstraintProjection = ConstraintProjection> {
|
|
161
|
+
private readonly options;
|
|
162
|
+
private readonly revisionSequence;
|
|
163
|
+
constructor(options: ConstraintServiceOptions<TConstraint>);
|
|
164
|
+
createConstraint(record: TConstraint, context: ConstraintAuthorizationContext): Promise<TConstraint>;
|
|
165
|
+
getConstraint(ref: ConstraintRef, context: ConstraintAuthorizationContext): Promise<TConstraint | null>;
|
|
166
|
+
updateConstraint(id: string, expectedRevision: string, patch: ConstraintPatch<TConstraint>, context: ConstraintAuthorizationContext): Promise<TConstraint>;
|
|
167
|
+
adoptConstraint(id: string, expectedRevision: string, decisionRef: ConstraintDecisionReference, context: ConstraintAuthorizationContext): Promise<TConstraint>;
|
|
168
|
+
registerException(exception: ConstraintExceptionRecord, context: ConstraintAuthorizationContext): Promise<ConstraintExceptionRecord>;
|
|
169
|
+
resolveConstraints(query: ConstraintResolutionQuery, context: ConstraintAuthorizationContext): Promise<ConstraintResolution<TConstraint>>;
|
|
170
|
+
private requireLatest;
|
|
171
|
+
private assertOwner;
|
|
172
|
+
private authorize;
|
|
173
|
+
private authorizationIssue;
|
|
174
|
+
private appendAndReadback;
|
|
175
|
+
}
|