opena2a-cli 0.5.5 → 0.5.7

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.
Files changed (51) hide show
  1. package/dist/commands/atp-types.d.ts +70 -0
  2. package/dist/commands/atp-types.d.ts.map +1 -0
  3. package/dist/commands/atp-types.js +8 -0
  4. package/dist/commands/atp-types.js.map +1 -0
  5. package/dist/commands/claim.d.ts +42 -0
  6. package/dist/commands/claim.d.ts.map +1 -0
  7. package/dist/commands/claim.js +434 -0
  8. package/dist/commands/claim.js.map +1 -0
  9. package/dist/commands/demo.d.ts +21 -0
  10. package/dist/commands/demo.d.ts.map +1 -0
  11. package/dist/commands/demo.js +683 -0
  12. package/dist/commands/demo.js.map +1 -0
  13. package/dist/commands/detect.d.ts +58 -0
  14. package/dist/commands/detect.d.ts.map +1 -0
  15. package/dist/commands/detect.js +335 -0
  16. package/dist/commands/detect.js.map +1 -0
  17. package/dist/commands/gcp-sm-migration.d.ts +17 -0
  18. package/dist/commands/gcp-sm-migration.d.ts.map +1 -0
  19. package/dist/commands/gcp-sm-migration.js +295 -0
  20. package/dist/commands/gcp-sm-migration.js.map +1 -0
  21. package/dist/commands/identity.js +3 -1
  22. package/dist/commands/identity.js.map +1 -1
  23. package/dist/commands/init.js +4 -4
  24. package/dist/commands/init.js.map +1 -1
  25. package/dist/commands/mcp-audit.d.ts +50 -0
  26. package/dist/commands/mcp-audit.d.ts.map +1 -0
  27. package/dist/commands/mcp-audit.js +501 -0
  28. package/dist/commands/mcp-audit.js.map +1 -0
  29. package/dist/commands/protect.d.ts.map +1 -1
  30. package/dist/commands/protect.js +10 -1
  31. package/dist/commands/protect.js.map +1 -1
  32. package/dist/commands/soul.js +3 -3
  33. package/dist/commands/soul.js.map +1 -1
  34. package/dist/commands/trust.d.ts +30 -0
  35. package/dist/commands/trust.d.ts.map +1 -0
  36. package/dist/commands/trust.js +261 -0
  37. package/dist/commands/trust.js.map +1 -0
  38. package/dist/guided/wizard.js +2 -2
  39. package/dist/guided/wizard.js.map +1 -1
  40. package/dist/index.js +119 -4
  41. package/dist/index.js.map +1 -1
  42. package/dist/natural/llm-fallback.js +1 -1
  43. package/dist/report/review-html.js +1 -1
  44. package/dist/router.d.ts.map +1 -1
  45. package/dist/router.js +70 -4
  46. package/dist/router.js.map +1 -1
  47. package/dist/semantic/command-index.json +3 -3
  48. package/dist/shield/init.d.ts.map +1 -1
  49. package/dist/shield/init.js +16 -1
  50. package/dist/shield/init.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Agent Trust Protocol (ATP) types.
3
+ * TypeScript interfaces for the public trust lookup and claim APIs
4
+ * on the OpenA2A Registry.
5
+ */
6
+ export interface TrustPosture {
7
+ hardeningPassRate: number;
8
+ oasbCompliance: number;
9
+ soulConformance: string;
10
+ attackSurfaceRisk: string;
11
+ supplyChainHealth: number;
12
+ a2asCertified: boolean;
13
+ }
14
+ export interface TrustFactors {
15
+ verification: number;
16
+ uptime: number;
17
+ actionSuccess: number;
18
+ securityAlerts: number;
19
+ compliance: number;
20
+ age: number;
21
+ drift: number;
22
+ feedback: number;
23
+ }
24
+ export type TrustLevel = 'discovered' | 'scanned' | 'claimed' | 'verified' | 'certified';
25
+ export interface SupplyChainInfo {
26
+ totalDependencies: number;
27
+ criticalVulnerabilities: number;
28
+ highVulnerabilities: number;
29
+ lastPublished: string;
30
+ maintainerCount: number;
31
+ }
32
+ export interface TrustLookupResponse {
33
+ agentId: string;
34
+ name: string;
35
+ source: string;
36
+ version: string;
37
+ publisher: string;
38
+ publisherVerified: boolean;
39
+ trustScore: number;
40
+ trustLevel: TrustLevel;
41
+ posture: TrustPosture;
42
+ factors: TrustFactors;
43
+ capabilities: string[];
44
+ supplyChain: SupplyChainInfo;
45
+ lastScanned: string;
46
+ profileUrl: string;
47
+ }
48
+ export interface OwnershipProof {
49
+ method: 'npm' | 'github' | 'pypi';
50
+ /** npm: username, github: owner/repo, pypi: token prefix */
51
+ identity: string;
52
+ /** Opaque proof payload (varies by method) */
53
+ evidence: string;
54
+ }
55
+ export interface ClaimRequest {
56
+ agentId: string;
57
+ proof: OwnershipProof;
58
+ publicKey: string;
59
+ }
60
+ export interface ClaimResponse {
61
+ success: boolean;
62
+ agentId: string;
63
+ previousTrustLevel: TrustLevel;
64
+ newTrustLevel: TrustLevel;
65
+ previousTrustScore: number;
66
+ newTrustScore: number;
67
+ profileUrl: string;
68
+ error?: string;
69
+ }
70
+ //# sourceMappingURL=atp-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atp-types.d.ts","sourceRoot":"","sources":["../../src/commands/atp-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAEzF,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,YAAY,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,eAAe,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClC,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,UAAU,CAAC;IAC/B,aAAa,EAAE,UAAU,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Agent Trust Protocol (ATP) types.
4
+ * TypeScript interfaces for the public trust lookup and claim APIs
5
+ * on the OpenA2A Registry.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=atp-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atp-types.js","sourceRoot":"","sources":["../../src/commands/atp-types.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * opena2a claim -- Claim ownership of a discovered agent in the trust registry.
3
+ * Verifies package ownership via npm, GitHub, or PyPI and links the profile
4
+ * to the developer's verified identity.
5
+ *
6
+ * Usage:
7
+ * opena2a claim @anthropic/mcp-server-fetch
8
+ * opena2a claim langchain --source pypi
9
+ * opena2a claim # reads package.json in cwd
10
+ */
11
+ import type { TrustLookupResponse, OwnershipProof, ClaimResponse } from './atp-types.js';
12
+ export interface ClaimOptions {
13
+ packageName?: string;
14
+ source?: string;
15
+ registryUrl?: string;
16
+ ci?: boolean;
17
+ format?: 'text' | 'json';
18
+ json?: boolean;
19
+ verbose?: boolean;
20
+ }
21
+ export declare const _internals: {
22
+ readLocalPackageName(): string | null;
23
+ fetchTrustLookup(registryUrl: string, packageName: string, source?: string): Promise<{
24
+ ok: boolean;
25
+ status: number;
26
+ data?: TrustLookupResponse;
27
+ }>;
28
+ verifyNpmOwnership(packageName: string): Promise<OwnershipProof | null>;
29
+ verifyGithubOwnership(packageName: string): Promise<OwnershipProof | null>;
30
+ generateKeypair(): Promise<{
31
+ publicKey: string;
32
+ privateKey: string;
33
+ }>;
34
+ submitClaim(registryUrl: string, agentId: string, proof: OwnershipProof, publicKey: string): Promise<{
35
+ ok: boolean;
36
+ status: number;
37
+ data?: ClaimResponse;
38
+ }>;
39
+ storeKeypair(agentId: string, publicKey: string, privateKey: string): Promise<string>;
40
+ };
41
+ export declare function claim(options: ClaimOptions): Promise<number>;
42
+ //# sourceMappingURL=claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACd,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAQD,eAAO,MAAM,UAAU;4BACG,MAAM,GAAG,IAAI;kCActB,MAAM,eACN,MAAM,WACV,MAAM,GACd,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,mBAAmB,CAAA;KAAE,CAAC;oCAmBjC,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;uCA6BpC,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;uBAmDvD,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;6BAY5D,MAAM,WACV,MAAM,SACR,cAAc,aACV,MAAM,GAChB,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC;0BAoCrC,MAAM,aAAa,MAAM,cAAc,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAiB5F,CAAC;AAIF,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAsPlE"}
@@ -0,0 +1,434 @@
1
+ "use strict";
2
+ /**
3
+ * opena2a claim -- Claim ownership of a discovered agent in the trust registry.
4
+ * Verifies package ownership via npm, GitHub, or PyPI and links the profile
5
+ * to the developer's verified identity.
6
+ *
7
+ * Usage:
8
+ * opena2a claim @anthropic/mcp-server-fetch
9
+ * opena2a claim langchain --source pypi
10
+ * opena2a claim # reads package.json in cwd
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports._internals = void 0;
14
+ exports.claim = claim;
15
+ const colors_js_1 = require("../util/colors.js");
16
+ const spinner_js_1 = require("../util/spinner.js");
17
+ // --- Constants ---
18
+ const DEFAULT_REGISTRY_URL = 'https://registry.opena2a.org';
19
+ // --- Testable internals ---
20
+ exports._internals = {
21
+ readLocalPackageName() {
22
+ try {
23
+ const fs = require('node:fs');
24
+ const path = require('node:path');
25
+ const pkgPath = path.join(process.cwd(), 'package.json');
26
+ if (fs.existsSync(pkgPath)) {
27
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
28
+ return pkg.name ?? null;
29
+ }
30
+ }
31
+ catch { /* ignore */ }
32
+ return null;
33
+ },
34
+ async fetchTrustLookup(registryUrl, packageName, source) {
35
+ const params = new URLSearchParams({ package: packageName });
36
+ if (source)
37
+ params.set('source', source);
38
+ const url = `${registryUrl}/v1/trust/lookup?${params}`;
39
+ const response = await fetch(url, {
40
+ method: 'GET',
41
+ headers: { 'Accept': 'application/json' },
42
+ signal: AbortSignal.timeout(15_000),
43
+ });
44
+ if (!response.ok) {
45
+ return { ok: false, status: response.status };
46
+ }
47
+ const data = (await response.json());
48
+ return { ok: true, status: response.status, data };
49
+ },
50
+ async verifyNpmOwnership(packageName) {
51
+ try {
52
+ const { execSync } = require('node:child_process');
53
+ // Get current npm user
54
+ const whoami = execSync('npm whoami', { encoding: 'utf-8', timeout: 10_000 }).trim();
55
+ if (!whoami)
56
+ return null;
57
+ // Check if user has publish access
58
+ const accessOutput = execSync('npm access ls-packages', {
59
+ encoding: 'utf-8',
60
+ timeout: 15_000,
61
+ }).trim();
62
+ const packages = JSON.parse(accessOutput || '{}');
63
+ const hasAccess = packages[packageName] === 'read-write';
64
+ if (!hasAccess)
65
+ return null;
66
+ return {
67
+ method: 'npm',
68
+ identity: whoami,
69
+ evidence: JSON.stringify({ username: whoami, access: packages[packageName] }),
70
+ };
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ },
76
+ async verifyGithubOwnership(packageName) {
77
+ try {
78
+ const { execSync } = require('node:child_process');
79
+ // Derive owner/repo from scoped package name or plain name
80
+ let owner;
81
+ let repo;
82
+ if (packageName.startsWith('@')) {
83
+ // @scope/name -> scope, name
84
+ const parts = packageName.slice(1).split('/');
85
+ owner = parts[0];
86
+ repo = parts[1] ?? parts[0];
87
+ }
88
+ else {
89
+ // Try to find repo info from local git remote
90
+ try {
91
+ const remoteUrl = execSync('git remote get-url origin', {
92
+ encoding: 'utf-8',
93
+ timeout: 5_000,
94
+ }).trim();
95
+ const match = remoteUrl.match(/github\.com[:/]([^/]+)\/([^/.]+)/);
96
+ if (match) {
97
+ owner = match[1];
98
+ repo = match[2];
99
+ }
100
+ else {
101
+ return null;
102
+ }
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ // Verify repo access via gh CLI
109
+ const repoData = execSync(`gh api repos/${owner}/${repo} --jq '.permissions.push'`, {
110
+ encoding: 'utf-8',
111
+ timeout: 10_000,
112
+ }).trim();
113
+ if (repoData !== 'true')
114
+ return null;
115
+ return {
116
+ method: 'github',
117
+ identity: `${owner}/${repo}`,
118
+ evidence: JSON.stringify({ owner, repo, pushAccess: true }),
119
+ };
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ },
125
+ async generateKeypair() {
126
+ const { generateKeyPairSync } = require('node:crypto');
127
+ const { publicKey, privateKey } = generateKeyPairSync('ed25519', {
128
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
129
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
130
+ });
131
+ return { publicKey, privateKey };
132
+ },
133
+ async submitClaim(registryUrl, agentId, proof, publicKey) {
134
+ const url = `${registryUrl}/v1/trust/claim`;
135
+ const response = await fetch(url, {
136
+ method: 'POST',
137
+ headers: {
138
+ 'Content-Type': 'application/json',
139
+ 'Accept': 'application/json',
140
+ },
141
+ body: JSON.stringify({ agentId, proof, publicKey }),
142
+ signal: AbortSignal.timeout(15_000),
143
+ });
144
+ if (!response.ok) {
145
+ let errorData = {};
146
+ try {
147
+ errorData = await response.json();
148
+ }
149
+ catch { /* ignore */ }
150
+ return {
151
+ ok: false,
152
+ status: response.status,
153
+ data: {
154
+ success: false,
155
+ agentId,
156
+ previousTrustLevel: 'discovered',
157
+ newTrustLevel: 'discovered',
158
+ previousTrustScore: 0,
159
+ newTrustScore: 0,
160
+ profileUrl: '',
161
+ error: errorData.error ?? errorData.message ?? `HTTP ${response.status}`,
162
+ },
163
+ };
164
+ }
165
+ const data = (await response.json());
166
+ return { ok: true, status: response.status, data };
167
+ },
168
+ async storeKeypair(agentId, publicKey, privateKey) {
169
+ const fs = require('node:fs');
170
+ const path = require('node:path');
171
+ const os = require('node:os');
172
+ const dir = path.join(os.homedir(), '.opena2a', 'keys');
173
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
174
+ const sanitizedId = agentId.replace(/[^a-zA-Z0-9_-]/g, '_');
175
+ const pubPath = path.join(dir, `${sanitizedId}.pub`);
176
+ const privPath = path.join(dir, `${sanitizedId}.key`);
177
+ fs.writeFileSync(pubPath, publicKey, { mode: 0o644 });
178
+ fs.writeFileSync(privPath, privateKey, { mode: 0o600 });
179
+ return dir;
180
+ },
181
+ };
182
+ // --- Core ---
183
+ async function claim(options) {
184
+ const registryUrl = await resolveRegistryUrl(options.registryUrl);
185
+ const isJson = options.json || options.format === 'json';
186
+ const isCi = options.ci ?? false;
187
+ // Resolve package name
188
+ let packageName = options.packageName;
189
+ // Auto-detect GitHub URLs
190
+ if (packageName && packageName.startsWith('https://github.com/')) {
191
+ const match = packageName.match(/github\.com\/([^/]+\/[^/]+)/);
192
+ if (match) {
193
+ packageName = match[1].replace(/\.git$/, '');
194
+ if (!options.source)
195
+ options.source = 'github';
196
+ }
197
+ }
198
+ if (!packageName) {
199
+ packageName = exports._internals.readLocalPackageName() ?? undefined;
200
+ if (!packageName) {
201
+ const msg = 'No package name provided and no package.json found in current directory.';
202
+ if (isJson) {
203
+ process.stdout.write(JSON.stringify({ error: msg }) + '\n');
204
+ }
205
+ else {
206
+ process.stderr.write((0, colors_js_1.red)(msg) + '\n');
207
+ process.stderr.write('Usage: opena2a claim <package-name> [--source npm|pypi|github]\n');
208
+ }
209
+ return 1;
210
+ }
211
+ }
212
+ if (!isJson && !isCi) {
213
+ process.stdout.write(`Claiming ${(0, colors_js_1.bold)(packageName)}...\n\n`);
214
+ }
215
+ const spinner = new spinner_js_1.Spinner('');
216
+ // Step 1: Look up the package in the registry
217
+ if (!isCi && !isJson) {
218
+ spinner.update('Looking up trust profile...');
219
+ spinner.start();
220
+ }
221
+ let lookupData;
222
+ try {
223
+ const result = await exports._internals.fetchTrustLookup(registryUrl, packageName, options.source);
224
+ if (!isCi && !isJson)
225
+ spinner.stop();
226
+ if (!result.ok || !result.data) {
227
+ const msg = `No trust profile found. Run \`opena2a self-register ${packageName}\` to add it first.`;
228
+ if (isJson) {
229
+ process.stdout.write(JSON.stringify({ error: 'not_found', package: packageName, message: msg }) + '\n');
230
+ }
231
+ else {
232
+ process.stdout.write((0, colors_js_1.yellow)(msg) + '\n');
233
+ if (options.verbose) {
234
+ const params = new URLSearchParams({ package: packageName });
235
+ if (options.source)
236
+ params.set('source', options.source);
237
+ process.stdout.write((0, colors_js_1.dim)(`Registry: ${registryUrl}`) + '\n');
238
+ process.stdout.write((0, colors_js_1.dim)(`Request: GET /v1/trust/lookup?${params}`) + '\n');
239
+ }
240
+ }
241
+ return 1;
242
+ }
243
+ lookupData = result.data;
244
+ }
245
+ catch (err) {
246
+ if (!isCi && !isJson)
247
+ spinner.stop();
248
+ const errMsg = err instanceof Error ? err.message : String(err);
249
+ if (isJson) {
250
+ process.stdout.write(JSON.stringify({ error: 'lookup_failed', message: errMsg }) + '\n');
251
+ }
252
+ else {
253
+ process.stderr.write((0, colors_js_1.red)(`Failed to look up trust profile: ${errMsg}`) + '\n');
254
+ if (options.verbose) {
255
+ process.stderr.write((0, colors_js_1.dim)(`Registry: ${registryUrl}`) + '\n');
256
+ process.stderr.write((0, colors_js_1.dim)(`Full error: ${err instanceof Error ? err.stack ?? err.message : String(err)}`) + '\n');
257
+ }
258
+ }
259
+ return 1;
260
+ }
261
+ // Step 2: Check if already claimed
262
+ if (lookupData.trustLevel === 'claimed' || lookupData.trustLevel === 'verified' || lookupData.trustLevel === 'certified') {
263
+ const msg = `This agent is already claimed by ${lookupData.publisher}.`;
264
+ if (isJson) {
265
+ process.stdout.write(JSON.stringify({
266
+ error: 'already_claimed',
267
+ package: packageName,
268
+ publisher: lookupData.publisher,
269
+ trustLevel: lookupData.trustLevel,
270
+ message: msg,
271
+ }) + '\n');
272
+ }
273
+ else {
274
+ process.stdout.write((0, colors_js_1.yellow)(msg) + '\n');
275
+ process.stdout.write((0, colors_js_1.dim)(`Trust level: ${lookupData.trustLevel}, Score: ${Math.round(lookupData.trustScore * 100)}/100`) + '\n');
276
+ process.stdout.write((0, colors_js_1.dim)(`Profile: ${lookupData.profileUrl}`) + '\n');
277
+ }
278
+ return 1;
279
+ }
280
+ // Step 3: Verify ownership
281
+ if (!isCi && !isJson) {
282
+ spinner.update('Verifying ownership...');
283
+ spinner.start();
284
+ }
285
+ const source = options.source ?? lookupData.source ?? 'npm';
286
+ let proof = null;
287
+ if (source === 'npm' || (!options.source && !lookupData.source)) {
288
+ if (!isCi && !isJson)
289
+ spinner.update('Verifying npm publish access...');
290
+ proof = await exports._internals.verifyNpmOwnership(packageName);
291
+ }
292
+ if (!proof && (source === 'github' || !options.source)) {
293
+ if (!isCi && !isJson)
294
+ spinner.update('Verifying GitHub repository access...');
295
+ proof = await exports._internals.verifyGithubOwnership(packageName);
296
+ }
297
+ if (!isCi && !isJson)
298
+ spinner.stop();
299
+ if (!proof) {
300
+ const msg = `Could not verify ownership of ${packageName}.`;
301
+ if (isJson) {
302
+ process.stdout.write(JSON.stringify({
303
+ error: 'verification_failed',
304
+ package: packageName,
305
+ message: msg,
306
+ }) + '\n');
307
+ }
308
+ else {
309
+ process.stderr.write((0, colors_js_1.red)(msg) + '\n');
310
+ process.stderr.write('\n');
311
+ process.stderr.write('Ownership verification requires one of:\n');
312
+ process.stderr.write(' npm: Logged in with publish access (npm login)\n');
313
+ process.stderr.write(' GitHub: Push access to the repository (gh auth login)\n');
314
+ }
315
+ return 1;
316
+ }
317
+ if (!isJson && !isCi) {
318
+ const methodLabel = proof.method === 'npm' ? 'npm publish access'
319
+ : proof.method === 'github' ? 'GitHub repository access'
320
+ : 'PyPI API token';
321
+ process.stdout.write(`Verifying ${methodLabel}... ${(0, colors_js_1.green)('verified')}\n`);
322
+ }
323
+ // Step 4: Generate Ed25519 keypair
324
+ if (!isCi && !isJson) {
325
+ spinner.update('Generating Ed25519 keypair...');
326
+ spinner.start();
327
+ }
328
+ let publicKey;
329
+ let privateKey;
330
+ try {
331
+ const keypair = await exports._internals.generateKeypair();
332
+ publicKey = keypair.publicKey;
333
+ privateKey = keypair.privateKey;
334
+ }
335
+ catch (err) {
336
+ if (!isCi && !isJson)
337
+ spinner.stop();
338
+ const errMsg = err instanceof Error ? err.message : String(err);
339
+ if (isJson) {
340
+ process.stdout.write(JSON.stringify({ error: 'keygen_failed', message: errMsg }) + '\n');
341
+ }
342
+ else {
343
+ process.stderr.write((0, colors_js_1.red)(`Failed to generate keypair: ${errMsg}`) + '\n');
344
+ }
345
+ return 1;
346
+ }
347
+ if (!isCi && !isJson) {
348
+ spinner.stop();
349
+ process.stdout.write(`Generating Ed25519 keypair... ${(0, colors_js_1.green)('done')}\n`);
350
+ }
351
+ // Step 5: Submit claim to registry
352
+ if (!isCi && !isJson) {
353
+ spinner.update('Registering claim with registry...');
354
+ spinner.start();
355
+ }
356
+ try {
357
+ const claimResult = await exports._internals.submitClaim(registryUrl, lookupData.agentId, proof, publicKey);
358
+ if (!isCi && !isJson)
359
+ spinner.stop();
360
+ if (!claimResult.ok || !claimResult.data?.success) {
361
+ const errMsg = claimResult.data?.error ?? 'Unknown error';
362
+ if (isJson) {
363
+ const { error: _discardError, ...rest } = claimResult.data ?? {};
364
+ process.stdout.write(JSON.stringify({
365
+ ...rest,
366
+ error: 'claim_failed',
367
+ message: errMsg,
368
+ }) + '\n');
369
+ }
370
+ else {
371
+ process.stderr.write((0, colors_js_1.red)(`Claim failed: ${errMsg}`) + '\n');
372
+ }
373
+ return 1;
374
+ }
375
+ // Store keypair locally
376
+ const keyDir = await exports._internals.storeKeypair(lookupData.agentId, publicKey, privateKey);
377
+ const claimData = claimResult.data;
378
+ if (isJson) {
379
+ process.stdout.write(JSON.stringify(claimData, null, 2) + '\n');
380
+ }
381
+ else {
382
+ process.stdout.write(`Registering claim with registry... ${(0, colors_js_1.green)('done')}\n`);
383
+ process.stdout.write('\n');
384
+ process.stdout.write((0, colors_js_1.green)((0, colors_js_1.bold)('Claimed successfully.')) + '\n');
385
+ const prevScore = Math.round(claimData.previousTrustScore * 100);
386
+ const newScore = Math.round(claimData.newTrustScore * 100);
387
+ process.stdout.write(` Trust level: ${claimData.previousTrustLevel} -> ${(0, colors_js_1.green)(claimData.newTrustLevel)}\n`);
388
+ process.stdout.write(` Trust score: ${prevScore}/100 -> ${(0, colors_js_1.green)(`${newScore}/100`)}\n`);
389
+ process.stdout.write(` Profile: ${(0, colors_js_1.cyan)(claimData.profileUrl)}\n`);
390
+ process.stdout.write(` Keys: ${(0, colors_js_1.dim)(keyDir)}\n`);
391
+ process.stdout.write('\n');
392
+ process.stdout.write((0, colors_js_1.bold)('Next steps:') + '\n');
393
+ process.stdout.write(` Run \`hackmyagent scan . --publish\` to improve your trust score\n`);
394
+ const badgeUrl = claimData.profileUrl.replace('/agents/', '/v1/trust/') + '/badge.svg';
395
+ process.stdout.write(` Add badge to README:\n`);
396
+ process.stdout.write((0, colors_js_1.dim)(` [![Trust](${badgeUrl})](${claimData.profileUrl})`) + '\n');
397
+ }
398
+ return 0;
399
+ }
400
+ catch (err) {
401
+ if (!isCi && !isJson)
402
+ spinner.stop();
403
+ const errMsg = err instanceof Error ? err.message : String(err);
404
+ if (isJson) {
405
+ process.stdout.write(JSON.stringify({ error: 'claim_failed', message: errMsg }) + '\n');
406
+ }
407
+ else {
408
+ process.stderr.write((0, colors_js_1.red)(`Failed to submit claim: ${errMsg}`) + '\n');
409
+ process.stderr.write((0, colors_js_1.dim)(`Registry: ${registryUrl}`) + '\n');
410
+ if (options.verbose) {
411
+ process.stderr.write((0, colors_js_1.dim)(`Full error: ${err instanceof Error ? err.stack ?? err.message : String(err)}`) + '\n');
412
+ }
413
+ }
414
+ return 1;
415
+ }
416
+ }
417
+ // --- Helpers ---
418
+ async function resolveRegistryUrl(override) {
419
+ if (override)
420
+ return override.replace(/\/$/, '');
421
+ const envUrl = process.env.OPENA2A_REGISTRY_URL;
422
+ if (envUrl)
423
+ return envUrl.replace(/\/$/, '');
424
+ try {
425
+ const shared = await Function('return import("@opena2a/shared")')();
426
+ const mod = 'default' in shared ? shared.default : shared;
427
+ const config = mod.loadUserConfig();
428
+ if (config.registry.url)
429
+ return config.registry.url;
430
+ }
431
+ catch { /* not available */ }
432
+ return DEFAULT_REGISTRY_URL;
433
+ }
434
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AA0NH,sBAsPC;AA9cD,iDAAwE;AACxE,mDAA6C;AAmB7C,oBAAoB;AAEpB,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAE5D,6BAA6B;AAEhB,QAAA,UAAU,GAAG;IACxB,oBAAoB;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;YACzD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC1D,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,WAAmB,EACnB,WAAmB,EACnB,MAAe;QAEf,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,WAAW,oBAAoB,MAAM,EAAE,CAAC;QAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE;YACzC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAEnD,uBAAuB;YACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrF,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAEzB,mCAAmC;YACnC,MAAM,YAAY,GAAG,QAAQ,CAAC,wBAAwB,EAAE;gBACtD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC,IAAI,EAAE,CAAC;YAEV,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAA2B,CAAC;YAC5E,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,YAAY,CAAC;YAEzD,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAE5B,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;aAC9E,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,WAAmB;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAEnD,2DAA2D;YAC3D,IAAI,KAAa,CAAC;YAClB,IAAI,IAAY,CAAC;YAEjB,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,6BAA6B;gBAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9C,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,QAAQ,CAAC,2BAA2B,EAAE;wBACtD,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,KAAK;qBACf,CAAC,CAAC,IAAI,EAAE,CAAC;oBAEV,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;oBAClE,IAAI,KAAK,EAAE,CAAC;wBACV,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBACjB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,gCAAgC;YAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,KAAK,IAAI,IAAI,2BAA2B,EAAE;gBAClF,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC,IAAI,EAAE,CAAC;YAEV,IAAI,QAAQ,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YAErC,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE;gBAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aAC5D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAEvD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,SAAS,EAAE;YAC/D,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;YAClD,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;SACrD,CAAC,CAAC;QAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,WAAW,CACf,WAAmB,EACnB,OAAe,EACf,KAAqB,EACrB,SAAiB;QAEjB,MAAM,GAAG,GAAG,GAAG,WAAW,iBAAiB,CAAC;QAE5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,QAAQ,EAAE,kBAAkB;aAC7B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACnD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,SAAS,GAAQ,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACjE,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,OAAO;oBACP,kBAAkB,EAAE,YAAY;oBAChC,aAAa,EAAE,YAAY;oBAC3B,kBAAkB,EAAE,CAAC;oBACrB,aAAa,EAAE,CAAC;oBAChB,UAAU,EAAE,EAAE;oBACd,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE;iBACzE;aACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAC;QACtD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,SAAiB,EAAE,UAAkB;QACvE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACxD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,MAAM,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,MAAM,CAAC,CAAC;QAEtD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAExD,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAC;AAEF,eAAe;AAER,KAAK,UAAU,KAAK,CAAC,OAAqB;IAC/C,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,IAAI,KAAK,CAAC;IAEjC,uBAAuB;IACvB,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAEtC,0BAA0B;IAC1B,IAAI,WAAW,IAAI,WAAW,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC/D,IAAI,KAAK,EAAE,CAAC;YACV,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,kBAAU,CAAC,oBAAoB,EAAE,IAAI,SAAS,CAAC;QAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,0EAA0E,CAAC;YACvF,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAC3F,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAA,gBAAI,EAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,oBAAO,CAAC,EAAE,CAAC,CAAC;IAEhC,8CAA8C;IAC9C,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,UAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAErC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,uDAAuD,WAAW,qBAAqB,CAAC;YACpG,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1G,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,kBAAM,EAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBACzC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC7D,IAAI,OAAO,CAAC,MAAM;wBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;oBACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,aAAa,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;oBAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,iCAAiC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,oCAAoC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC/E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,aAAa,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,eAAe,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACnH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,mCAAmC;IACnC,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;QACzH,MAAM,GAAG,GAAG,oCAAoC,UAAU,CAAC,SAAS,GAAG,CAAC;QACxE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBAClC,KAAK,EAAE,iBAAiB;gBACxB,OAAO,EAAE,WAAW;gBACpB,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,OAAO,EAAE,GAAG;aACb,CAAC,GAAG,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,kBAAM,EAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,gBAAgB,UAAU,CAAC,UAAU,YAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACjI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,YAAY,UAAU,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC;IAC5D,IAAI,KAAK,GAA0B,IAAI,CAAC;IAExC,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC;QACxE,KAAK,GAAG,MAAM,kBAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;QAC9E,KAAK,GAAG,MAAM,kBAAU,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAErC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,iCAAiC,WAAW,GAAG,CAAC;QAC5D,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBAClC,KAAK,EAAE,qBAAqB;gBAC5B,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,GAAG;aACb,CAAC,GAAG,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,oBAAoB;YAC/D,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,0BAA0B;gBACxD,CAAC,CAAC,gBAAgB,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,WAAW,OAAO,IAAA,iBAAK,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,SAAiB,CAAC;IACtB,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAU,CAAC,eAAe,EAAE,CAAC;QACnD,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAC9B,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,+BAA+B,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAA,iBAAK,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,kBAAU,CAAC,WAAW,CAC9C,WAAW,EACX,UAAU,CAAC,OAAO,EAClB,KAAK,EACL,SAAS,CACV,CAAC;QAEF,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAErC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,IAAI,eAAe,CAAC;YAC1D,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC,IAAI,IAAI,EAAS,CAAC;gBACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;oBAClC,GAAG,IAAI;oBACP,KAAK,EAAE,cAAc;oBACrB,OAAO,EAAE,MAAM;iBAChB,CAAC,GAAG,IAAI,CAAC,CAAC;YACb,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,iBAAiB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,wBAAwB;QACxB,MAAM,MAAM,GAAG,MAAM,kBAAU,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAExF,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC;QAEnC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,IAAA,iBAAK,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,iBAAK,EAAC,IAAA,gBAAI,EAAC,uBAAuB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAElE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,kBAAkB,GAAG,GAAG,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;YAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,SAAS,CAAC,kBAAkB,OAAO,IAAA,iBAAK,EAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC9G,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,SAAS,WAAW,IAAA,iBAAK,EAAC,GAAG,QAAQ,MAAM,CAAC,IAAI,CAAC,CAAC;YACzF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,IAAA,gBAAI,EAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAA,eAAG,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,gBAAI,EAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;YAE7F,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC;YACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,iBAAiB,QAAQ,MAAM,SAAS,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,2BAA2B,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,aAAa,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,eAAG,EAAC,eAAe,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACnH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,kBAAkB;AAElB,KAAK,UAAU,kBAAkB,CAAC,QAAiB;IACjD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAO,QAAQ,CAAC,kCAAkC,CAAC,EAAmB,CAAC;QACtF,MAAM,GAAG,GAAG,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAE/B,OAAO,oBAAoB,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * opena2a demo -- Interactive demonstration of AIM capabilities.
3
+ *
4
+ * Runs a self-contained, narrated walkthrough showing the full AIM lifecycle
5
+ * in a temporary sandbox. No Docker or external services required.
6
+ *
7
+ * Scenarios:
8
+ * aim (default) -- Identity, policy, signing, credential migration
9
+ * dvaa -- Attack/defend loop against a vulnerable agent config
10
+ */
11
+ export interface DemoOptions {
12
+ scenario?: string;
13
+ interactive?: boolean;
14
+ keep?: boolean;
15
+ dir?: string;
16
+ ci?: boolean;
17
+ format?: string;
18
+ verbose?: boolean;
19
+ }
20
+ export declare function demo(opts: DemoOptions): Promise<number>;
21
+ //# sourceMappingURL=demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA8wBD,wBAAsB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAqC7D"}