@cendor/acttrace 0.2.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/LICENSE +201 -0
- package/README.md +79 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/detectors.d.ts +69 -0
- package/dist/detectors.d.ts.map +1 -0
- package/dist/detectors.js +378 -0
- package/dist/detectors.js.map +1 -0
- package/dist/guard.d.ts +36 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +124 -0
- package/dist/guard.js.map +1 -0
- package/dist/hash.d.ts +7 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +32 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +145 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +741 -0
- package/dist/index.js.map +1 -0
- package/dist/ner.d.ts +16 -0
- package/dist/ner.d.ts.map +1 -0
- package/dist/ner.js +21 -0
- package/dist/ner.js.map +1 -0
- package/dist/packs.d.ts +31 -0
- package/dist/packs.d.ts.map +1 -0
- package/dist/packs.js +113 -0
- package/dist/packs.js.map +1 -0
- package/dist/policy.d.ts +58 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +119 -0
- package/dist/policy.js.map +1 -0
- package/dist/pyjson.d.ts +33 -0
- package/dist/pyjson.d.ts.map +1 -0
- package/dist/pyjson.js +250 -0
- package/dist/pyjson.js.map +1 -0
- package/dist/storage.d.ts +17 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +71 -0
- package/dist/storage.js.map +1 -0
- package/package.json +46 -0
package/dist/pyjson.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python-`json`-compatible serialization + a number-preserving parser — the cross-language
|
|
3
|
+
* conformance backbone shared (vendored) by @cendor/cassette and @cendor/acttrace.
|
|
4
|
+
*
|
|
5
|
+
* Reproduces `json.dumps(..., ensure_ascii=False)` byte-for-byte for Cendor's value shapes:
|
|
6
|
+
* - strings/bools/null: via `JSON.stringify` (JS matches Python's ensure_ascii=False escaping —
|
|
7
|
+
* same control-char escapes, `/` unescaped, non-ASCII raw, U+2028/U+2029 raw).
|
|
8
|
+
* - integers: `bigint` (or an integer-valued producer `number`) -> decimal string (no `.0`, no exp).
|
|
9
|
+
* - floats: `PyFloat` wrapper (or a non-integer producer `number`) -> Python `repr(float)` form.
|
|
10
|
+
*
|
|
11
|
+
* The int/float distinction is the #1 hazard: `JSON.parse` collapses `2.0` and `2`. So the VERIFIER
|
|
12
|
+
* side must parse with {@link parsePreserving} (tags each number token int vs float from its literal).
|
|
13
|
+
* The PRODUCER side builds payloads with plain numbers; integer-valued numbers serialize as ints
|
|
14
|
+
* (self-consistent and Python-verifiable — Python re-reads `"12"` as int too).
|
|
15
|
+
*/
|
|
16
|
+
export class PyFloat {
|
|
17
|
+
value;
|
|
18
|
+
constructor(value) {
|
|
19
|
+
this.value = value;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Python `repr(float)`-compatible string (exact for finite non-exponential values; best-effort exp). */
|
|
23
|
+
export function pyFloatRepr(n) {
|
|
24
|
+
if (Number.isNaN(n))
|
|
25
|
+
return 'NaN';
|
|
26
|
+
if (n === Number.POSITIVE_INFINITY)
|
|
27
|
+
return 'Infinity';
|
|
28
|
+
if (n === Number.NEGATIVE_INFINITY)
|
|
29
|
+
return '-Infinity';
|
|
30
|
+
let s = n.toString();
|
|
31
|
+
if (s.includes('e') || s.includes('E')) {
|
|
32
|
+
const m = s.match(/^(-?)(\d+(?:\.\d+)?)[eE]([+-]?)(\d+)$/);
|
|
33
|
+
if (m) {
|
|
34
|
+
const sign = m[1] ?? '';
|
|
35
|
+
const mant = m[2] ?? '';
|
|
36
|
+
const esign = m[3] === '-' ? '-' : '+';
|
|
37
|
+
const edig = m[4] ?? '';
|
|
38
|
+
s = `${sign}${mant}e${esign}${edig.length < 2 ? `0${edig}` : edig}`;
|
|
39
|
+
}
|
|
40
|
+
return s;
|
|
41
|
+
}
|
|
42
|
+
if (!s.includes('.'))
|
|
43
|
+
s += '.0';
|
|
44
|
+
return s;
|
|
45
|
+
}
|
|
46
|
+
function numberToken(v) {
|
|
47
|
+
if (typeof v === 'bigint')
|
|
48
|
+
return v.toString();
|
|
49
|
+
if (v instanceof PyFloat)
|
|
50
|
+
return pyFloatRepr(v.value);
|
|
51
|
+
if (Number.isInteger(v))
|
|
52
|
+
return Number.isSafeInteger(v) ? BigInt(v).toString() : v.toString();
|
|
53
|
+
return pyFloatRepr(v);
|
|
54
|
+
}
|
|
55
|
+
/** Sort by Unicode code point (Python `sort_keys`), not UTF-16 code unit. */
|
|
56
|
+
function codePointCompare(a, b) {
|
|
57
|
+
const ia = Array.from(a);
|
|
58
|
+
const ib = Array.from(b);
|
|
59
|
+
const n = Math.min(ia.length, ib.length);
|
|
60
|
+
for (let i = 0; i < n; i++) {
|
|
61
|
+
const ca = ia[i].codePointAt(0);
|
|
62
|
+
const cb = ib[i].codePointAt(0);
|
|
63
|
+
if (ca !== cb)
|
|
64
|
+
return ca - cb;
|
|
65
|
+
}
|
|
66
|
+
return ia.length - ib.length;
|
|
67
|
+
}
|
|
68
|
+
function serialize(v, opts, depth) {
|
|
69
|
+
if (v === null)
|
|
70
|
+
return 'null';
|
|
71
|
+
if (typeof v === 'boolean')
|
|
72
|
+
return v ? 'true' : 'false';
|
|
73
|
+
if (typeof v === 'string')
|
|
74
|
+
return JSON.stringify(v);
|
|
75
|
+
if (typeof v === 'number' || typeof v === 'bigint' || v instanceof PyFloat)
|
|
76
|
+
return numberToken(v);
|
|
77
|
+
const pad = opts.indent !== null ? `\n${' '.repeat(opts.indent * (depth + 1))}` : '';
|
|
78
|
+
const padEnd = opts.indent !== null ? `\n${' '.repeat(opts.indent * depth)}` : '';
|
|
79
|
+
const itemSep = opts.indent !== null ? `,${pad}` : opts.compact ? ',' : ', ';
|
|
80
|
+
const kvSep = opts.compact ? ':' : ': ';
|
|
81
|
+
if (Array.isArray(v)) {
|
|
82
|
+
if (v.length === 0)
|
|
83
|
+
return '[]';
|
|
84
|
+
const items = v.map((x) => serialize(x, opts, depth + 1));
|
|
85
|
+
return `[${pad}${items.join(itemSep)}${padEnd}]`;
|
|
86
|
+
}
|
|
87
|
+
let keys = Object.keys(v);
|
|
88
|
+
if (opts.sortKeys)
|
|
89
|
+
keys = keys.sort(codePointCompare);
|
|
90
|
+
if (keys.length === 0)
|
|
91
|
+
return '{}';
|
|
92
|
+
const items = keys.map((k) => `${JSON.stringify(k)}${kvSep}${serialize(v[k], opts, depth + 1)}`);
|
|
93
|
+
return `{${pad}${items.join(itemSep)}${padEnd}}`;
|
|
94
|
+
}
|
|
95
|
+
/** `json.dumps(obj, sort_keys=True, ensure_ascii=False, separators=(",",":"))` — the HASH input. */
|
|
96
|
+
export function canonical(v) {
|
|
97
|
+
return serialize(v, { sortKeys: true, indent: null, compact: true }, 0);
|
|
98
|
+
}
|
|
99
|
+
/** `json.dumps(obj, ensure_ascii=False)` — insertion order, spaces after `,`/`:` (acttrace JSONL). */
|
|
100
|
+
export function dumpsDefault(v) {
|
|
101
|
+
return serialize(v, { sortKeys: false, indent: null, compact: false }, 0);
|
|
102
|
+
}
|
|
103
|
+
/** `json.dumps(obj, indent=2, ensure_ascii=False)` — insertion order, 2-space indent (cassette file). */
|
|
104
|
+
export function dumpsIndent2(v) {
|
|
105
|
+
return serialize(v, { sortKeys: false, indent: 2, compact: false }, 0);
|
|
106
|
+
}
|
|
107
|
+
// --------------------------------------------------------------------------- number-preserving parse
|
|
108
|
+
class PreservingParser {
|
|
109
|
+
s;
|
|
110
|
+
i = 0;
|
|
111
|
+
constructor(s) {
|
|
112
|
+
this.s = s;
|
|
113
|
+
}
|
|
114
|
+
parse() {
|
|
115
|
+
this.ws();
|
|
116
|
+
const v = this.value();
|
|
117
|
+
this.ws();
|
|
118
|
+
if (this.i !== this.s.length)
|
|
119
|
+
throw new SyntaxError(`trailing content at ${this.i}`);
|
|
120
|
+
return v;
|
|
121
|
+
}
|
|
122
|
+
ws() {
|
|
123
|
+
while (this.i < this.s.length) {
|
|
124
|
+
const c = this.s.charCodeAt(this.i);
|
|
125
|
+
if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d)
|
|
126
|
+
this.i++;
|
|
127
|
+
else
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
value() {
|
|
132
|
+
const c = this.s[this.i];
|
|
133
|
+
if (c === '{')
|
|
134
|
+
return this.object();
|
|
135
|
+
if (c === '[')
|
|
136
|
+
return this.array();
|
|
137
|
+
if (c === '"')
|
|
138
|
+
return this.string();
|
|
139
|
+
if (c === '-' || (c !== undefined && c >= '0' && c <= '9'))
|
|
140
|
+
return this.number();
|
|
141
|
+
if (this.s.startsWith('true', this.i)) {
|
|
142
|
+
this.i += 4;
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
if (this.s.startsWith('false', this.i)) {
|
|
146
|
+
this.i += 5;
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
if (this.s.startsWith('null', this.i)) {
|
|
150
|
+
this.i += 4;
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
throw new SyntaxError(`unexpected '${c}' at ${this.i}`);
|
|
154
|
+
}
|
|
155
|
+
object() {
|
|
156
|
+
const o = {};
|
|
157
|
+
this.i++;
|
|
158
|
+
this.ws();
|
|
159
|
+
if (this.s[this.i] === '}') {
|
|
160
|
+
this.i++;
|
|
161
|
+
return o;
|
|
162
|
+
}
|
|
163
|
+
for (;;) {
|
|
164
|
+
this.ws();
|
|
165
|
+
const k = this.string();
|
|
166
|
+
this.ws();
|
|
167
|
+
if (this.s[this.i] !== ':')
|
|
168
|
+
throw new SyntaxError(`expected ':' at ${this.i}`);
|
|
169
|
+
this.i++;
|
|
170
|
+
this.ws();
|
|
171
|
+
o[k] = this.value();
|
|
172
|
+
this.ws();
|
|
173
|
+
const ch = this.s[this.i];
|
|
174
|
+
if (ch === ',') {
|
|
175
|
+
this.i++;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (ch === '}') {
|
|
179
|
+
this.i++;
|
|
180
|
+
return o;
|
|
181
|
+
}
|
|
182
|
+
throw new SyntaxError(`expected ',' or '}' at ${this.i}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
array() {
|
|
186
|
+
const a = [];
|
|
187
|
+
this.i++;
|
|
188
|
+
this.ws();
|
|
189
|
+
if (this.s[this.i] === ']') {
|
|
190
|
+
this.i++;
|
|
191
|
+
return a;
|
|
192
|
+
}
|
|
193
|
+
for (;;) {
|
|
194
|
+
this.ws();
|
|
195
|
+
a.push(this.value());
|
|
196
|
+
this.ws();
|
|
197
|
+
const ch = this.s[this.i];
|
|
198
|
+
if (ch === ',') {
|
|
199
|
+
this.i++;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (ch === ']') {
|
|
203
|
+
this.i++;
|
|
204
|
+
return a;
|
|
205
|
+
}
|
|
206
|
+
throw new SyntaxError(`expected ',' or ']' at ${this.i}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
string() {
|
|
210
|
+
if (this.s[this.i] !== '"')
|
|
211
|
+
throw new SyntaxError(`expected string at ${this.i}`);
|
|
212
|
+
const start = this.i;
|
|
213
|
+
this.i++;
|
|
214
|
+
for (;;) {
|
|
215
|
+
const c = this.s[this.i++];
|
|
216
|
+
if (c === undefined)
|
|
217
|
+
throw new SyntaxError('unterminated string');
|
|
218
|
+
if (c === '"')
|
|
219
|
+
break;
|
|
220
|
+
if (c === '\\')
|
|
221
|
+
this.i++;
|
|
222
|
+
}
|
|
223
|
+
// Reuse JSON.parse for exact unescaping (inverse of JSON.stringify).
|
|
224
|
+
return JSON.parse(this.s.slice(start, this.i));
|
|
225
|
+
}
|
|
226
|
+
number() {
|
|
227
|
+
const start = this.i;
|
|
228
|
+
if (this.s[this.i] === '-')
|
|
229
|
+
this.i++;
|
|
230
|
+
let isFloat = false;
|
|
231
|
+
while (this.i < this.s.length) {
|
|
232
|
+
const c = this.s[this.i];
|
|
233
|
+
if (c >= '0' && c <= '9')
|
|
234
|
+
this.i++;
|
|
235
|
+
else if (c === '.' || c === 'e' || c === 'E' || c === '+' || c === '-') {
|
|
236
|
+
isFloat = isFloat || c === '.' || c === 'e' || c === 'E';
|
|
237
|
+
this.i++;
|
|
238
|
+
}
|
|
239
|
+
else
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
const token = this.s.slice(start, this.i);
|
|
243
|
+
return isFloat ? new PyFloat(Number(token)) : BigInt(token);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/** Parse JSON preserving int (`bigint`) vs float ({@link PyFloat}) from each numeric literal. */
|
|
247
|
+
export function parsePreserving(text) {
|
|
248
|
+
return new PreservingParser(text).parse();
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=pyjson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pyjson.js","sourceRoot":"","sources":["../src/pyjson.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** A tamper-evident-chain backend: truncate-open, append durable lines, and re-read the full chain. */
|
|
2
|
+
export interface ChainStorage {
|
|
3
|
+
appendLine(line: string): void;
|
|
4
|
+
readLines(): string[];
|
|
5
|
+
close(): void;
|
|
6
|
+
}
|
|
7
|
+
/** In-memory chain storage (browser/tests). */
|
|
8
|
+
export declare function memoryChainStorage(): ChainStorage;
|
|
9
|
+
/**
|
|
10
|
+
* Filesystem chain storage (the Node default): truncate-open on creation, `write`+`fsync` each line
|
|
11
|
+
* for durability, re-read the full chain from disk on demand (so a bounded in-memory log can still
|
|
12
|
+
* export/verify the complete file).
|
|
13
|
+
*/
|
|
14
|
+
export declare function fsChainStorage(path: string): ChainStorage;
|
|
15
|
+
/** Read all non-empty lines from a path (for `verify()` / CLI). */
|
|
16
|
+
export declare function fsReadLines(path: string): string[];
|
|
17
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAUA,uGAAuG;AACvG,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,IAAI,MAAM,EAAE,CAAC;IACtB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,IAAI,YAAY,CASjD;AA0BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA2BzD;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAIlD"}
|
package/dist/storage.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable acttrace chain storage. Core logic uses the {@link ChainStorage} interface; the fs
|
|
3
|
+
* adapter lazily requires `node:fs` so importing the package never forces Node built-ins into a
|
|
4
|
+
* bundle. acttrace is server-side (signing keys never belong in a browser), so fs + memory are the
|
|
5
|
+
* shipped adapters; a Workers-KV/other backend can implement the same interface.
|
|
6
|
+
*/
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
/** In-memory chain storage (browser/tests). */
|
|
10
|
+
export function memoryChainStorage() {
|
|
11
|
+
const lines = [];
|
|
12
|
+
return {
|
|
13
|
+
appendLine: (line) => {
|
|
14
|
+
lines.push(line);
|
|
15
|
+
},
|
|
16
|
+
readLines: () => lines.map((l) => l.replace(/\n$/, '')),
|
|
17
|
+
close: () => { },
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
let fs;
|
|
21
|
+
let pathMod;
|
|
22
|
+
function nodeFs() {
|
|
23
|
+
if (fs === undefined)
|
|
24
|
+
fs = require('node:fs');
|
|
25
|
+
return fs;
|
|
26
|
+
}
|
|
27
|
+
function nodePath() {
|
|
28
|
+
if (pathMod === undefined)
|
|
29
|
+
pathMod = require('node:path');
|
|
30
|
+
return pathMod;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Filesystem chain storage (the Node default): truncate-open on creation, `write`+`fsync` each line
|
|
34
|
+
* for durability, re-read the full chain from disk on demand (so a bounded in-memory log can still
|
|
35
|
+
* export/verify the complete file).
|
|
36
|
+
*/
|
|
37
|
+
export function fsChainStorage(path) {
|
|
38
|
+
nodeFs().mkdirSync(nodePath().dirname(path), { recursive: true });
|
|
39
|
+
let fd = nodeFs().openSync(path, 'w');
|
|
40
|
+
return {
|
|
41
|
+
appendLine: (line) => {
|
|
42
|
+
if (fd === null) {
|
|
43
|
+
// handle closed: append-open, write, close (matches the reference fallback)
|
|
44
|
+
const f = nodeFs().openSync(path, 'a');
|
|
45
|
+
nodeFs().writeSync(f, line);
|
|
46
|
+
nodeFs().fsyncSync(f);
|
|
47
|
+
nodeFs().closeSync(f);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
nodeFs().writeSync(fd, line);
|
|
51
|
+
nodeFs().fsyncSync(fd);
|
|
52
|
+
},
|
|
53
|
+
readLines: () => {
|
|
54
|
+
const text = nodeFs().existsSync(path) ? nodeFs().readFileSync(path, 'utf8') : '';
|
|
55
|
+
return text.split('\n').filter((l) => l.length > 0);
|
|
56
|
+
},
|
|
57
|
+
close: () => {
|
|
58
|
+
if (fd !== null) {
|
|
59
|
+
nodeFs().closeSync(fd);
|
|
60
|
+
fd = null;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Read all non-empty lines from a path (for `verify()` / CLI). */
|
|
66
|
+
export function fsReadLines(path) {
|
|
67
|
+
const f = require('node:fs');
|
|
68
|
+
const text = f.readFileSync(path, 'utf8');
|
|
69
|
+
return text.split('\n');
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cendor/acttrace",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "A tamper-evident, auto-populated audit log for AI decisions. The TypeScript port of cendor.acttrace (regex/pattern detectors only).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./storage": {
|
|
15
|
+
"types": "./dist/storage.d.ts",
|
|
16
|
+
"default": "./dist/storage.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@cendor/core": "^0.2.0"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"llm",
|
|
32
|
+
"audit",
|
|
33
|
+
"governance",
|
|
34
|
+
"eu-ai-act",
|
|
35
|
+
"tamper-evident",
|
|
36
|
+
"cendor"
|
|
37
|
+
],
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/cendorhq/cendor-libs-js.git",
|
|
41
|
+
"directory": "packages/acttrace"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
}
|
|
46
|
+
}
|