@correntelabs/beeai-ashlar-bridge 1.0.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 +75 -0
- package/STRESS_REPORT.md +71 -0
- package/dist/packages/beeai-ashlar-bridge/src/ashlar-tool.d.ts +84 -0
- package/dist/packages/beeai-ashlar-bridge/src/ashlar-tool.js +202 -0
- package/dist/packages/beeai-ashlar-bridge/src/beehive-swarm.d.ts +1 -0
- package/dist/packages/beeai-ashlar-bridge/src/beehive-swarm.js +157 -0
- package/dist/packages/beeai-ashlar-bridge/src/catalog-tool.d.ts +28 -0
- package/dist/packages/beeai-ashlar-bridge/src/catalog-tool.js +64 -0
- package/dist/packages/beeai-ashlar-bridge/src/compliance-tool.d.ts +34 -0
- package/dist/packages/beeai-ashlar-bridge/src/compliance-tool.js +73 -0
- package/dist/packages/beeai-ashlar-bridge/src/demo-agent.d.ts +1 -0
- package/dist/packages/beeai-ashlar-bridge/src/demo-agent.js +149 -0
- package/dist/packages/beeai-ashlar-bridge/src/index.d.ts +3 -0
- package/dist/packages/beeai-ashlar-bridge/src/index.js +3 -0
- package/dist/packages/beeai-ashlar-bridge/src/large-swarm-stress.d.ts +1 -0
- package/dist/packages/beeai-ashlar-bridge/src/large-swarm-stress.js +152 -0
- package/dist/src/x402/mandate.d.ts +449 -0
- package/dist/src/x402/mandate.js +1234 -0
- package/dist/src/x402/manifest-sig.d.ts +163 -0
- package/dist/src/x402/manifest-sig.js +259 -0
- package/dist/src/x402/merkle-transcript.d.ts +73 -0
- package/dist/src/x402/merkle-transcript.js +159 -0
- package/package.json +37 -0
- package/src/ashlar-tool.ts +277 -0
- package/src/beehive-swarm.ts +172 -0
- package/src/catalog-tool.ts +80 -0
- package/src/compliance-tool.ts +89 -0
- package/src/demo-agent.ts +163 -0
- package/src/index.ts +3 -0
- package/src/large-swarm-stress.ts +180 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { GoogleGenAI } from '@google/genai';
|
|
3
|
+
import { ChatModel, ChatModelOutput } from 'beeai-framework/backend/chat';
|
|
4
|
+
import { AssistantMessage, UserMessage } from 'beeai-framework/backend/message';
|
|
5
|
+
import { Emitter } from 'beeai-framework/emitter/emitter';
|
|
6
|
+
import { ReActAgent } from 'beeai-framework/agents/react/agent';
|
|
7
|
+
import { UnconstrainedMemory } from 'beeai-framework/memory/unconstrainedMemory';
|
|
8
|
+
import { AshlarSettlementTool } from './ashlar-tool.js';
|
|
9
|
+
|
|
10
|
+
// Read GEMINI_API_KEY from repo root .env
|
|
11
|
+
let apiKey = process.env.GEMINI_API_KEY;
|
|
12
|
+
if (!apiKey) {
|
|
13
|
+
try {
|
|
14
|
+
const env = fs.readFileSync('../../.env', 'utf8');
|
|
15
|
+
const match = env.match(/GEMINI_API_KEY=(.+)/);
|
|
16
|
+
if (match) apiKey = match[1].trim();
|
|
17
|
+
} catch {}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (!apiKey) {
|
|
21
|
+
console.error('❌ GEMINI_API_KEY is required in .env');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const ai = new GoogleGenAI({ apiKey });
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Official Gemini Chat Model Adapter for BeeAI Framework.
|
|
29
|
+
* Uses official @google/genai SDK targeting gemini-3.6-flash.
|
|
30
|
+
*/
|
|
31
|
+
class OfficialGeminiChatModel extends ChatModel {
|
|
32
|
+
modelId = 'gemini-3.6-flash';
|
|
33
|
+
providerId = 'google-genai';
|
|
34
|
+
emitter = Emitter.root.child({ namespace: ['backend', 'gemini', 'chat'], creator: this });
|
|
35
|
+
toolChoiceSupport = [];
|
|
36
|
+
modelSupportsToolCalling = true;
|
|
37
|
+
|
|
38
|
+
async _create(input: any, run: any) {
|
|
39
|
+
try {
|
|
40
|
+
const raw = input.messages.map((m: any) => {
|
|
41
|
+
const role = m.role === 'assistant' ? 'model' : 'user';
|
|
42
|
+
return { role, text: m.text || '' };
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Merge consecutive turns of the same role
|
|
46
|
+
const merged: { role: 'user' | 'model'; parts: { text: string }[] }[] = [];
|
|
47
|
+
for (const item of raw) {
|
|
48
|
+
if (merged.length > 0 && merged[merged.length - 1].role === item.role) {
|
|
49
|
+
merged[merged.length - 1].parts[0].text += '\n' + item.text;
|
|
50
|
+
} else {
|
|
51
|
+
merged.push({ role: item.role, parts: [{ text: item.text }] });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Gemini requires first turn to be 'user' and cannot end on 'model'
|
|
56
|
+
if (merged.length === 0 || merged[0].role !== 'user') {
|
|
57
|
+
merged.unshift({ role: 'user', parts: [{ text: 'Instructions initialized.' }] });
|
|
58
|
+
}
|
|
59
|
+
if (merged[merged.length - 1].role === 'model') {
|
|
60
|
+
merged.push({ role: 'user', parts: [{ text: 'Proceed.' }] });
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let retries = 3;
|
|
64
|
+
let delay = 5000;
|
|
65
|
+
while (retries > 0) {
|
|
66
|
+
try {
|
|
67
|
+
const response = await ai.models.generateContent({
|
|
68
|
+
model: this.modelId,
|
|
69
|
+
contents: merged
|
|
70
|
+
});
|
|
71
|
+
const text = response.text || '';
|
|
72
|
+
return new ChatModelOutput([new AssistantMessage(text)], { totalTokens: 100 }, 'stop');
|
|
73
|
+
} catch (apiErr: any) {
|
|
74
|
+
if (apiErr?.status === 429 && retries > 1) {
|
|
75
|
+
console.log(`⏳ [Gemini Rate Limit] 429 hit. Pausing ${delay / 1000}s before retry...`);
|
|
76
|
+
await new Promise(r => setTimeout(r, delay));
|
|
77
|
+
delay *= 2;
|
|
78
|
+
retries--;
|
|
79
|
+
} else {
|
|
80
|
+
throw apiErr;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
throw new Error('Exhausted retries on Gemini 429');
|
|
85
|
+
} catch (err: any) {
|
|
86
|
+
console.error('❌ [OfficialGeminiChatModel Error]:', err);
|
|
87
|
+
if (err?.errors) console.error('Sub-errors:', err.errors);
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async *_createStream(input: any, run: any) {
|
|
93
|
+
const out = await this._create(input, run);
|
|
94
|
+
yield out;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function main() {
|
|
99
|
+
console.log('\n===============================================================');
|
|
100
|
+
console.log('🏛️ CORRENTE LABS / ASHLAR BLUE — BEEAI ATTESTED SETTLEMENT DEMO');
|
|
101
|
+
console.log(' Linux Foundation BeeAI Agent + Hardware Enclave Turnstile');
|
|
102
|
+
console.log('===============================================================\n');
|
|
103
|
+
|
|
104
|
+
const ashlarTool = new AshlarSettlementTool({
|
|
105
|
+
principalLabel: 'corrente-treasury-operator',
|
|
106
|
+
agentLabel: 'beeai-autonomous-procurement-agent',
|
|
107
|
+
accountantLabel: 'ashlar-notary-attestation-authority',
|
|
108
|
+
capMinorUnits: '1000000', // Total Cap: 10.00 FCUSD
|
|
109
|
+
perPaymentMinorUnits: '250000', // Per-Payment Max: 2.50 FCUSD
|
|
110
|
+
allowedPayees: [
|
|
111
|
+
'api.ashlar.blue',
|
|
112
|
+
'oracle.flare.network',
|
|
113
|
+
'xrpl-market-data.example'
|
|
114
|
+
],
|
|
115
|
+
asset: 'FCUSD',
|
|
116
|
+
defaultTollBps: 10,
|
|
117
|
+
xrplWalletAddress: 'rPthX1m6rzjqmujRLzcg9fenuHrNB6TceK' // The wallet holding the minted NFT!
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const llm = new OfficialGeminiChatModel();
|
|
121
|
+
const memory = new UnconstrainedMemory();
|
|
122
|
+
const agent = new ReActAgent({
|
|
123
|
+
llm,
|
|
124
|
+
tools: [ashlarTool],
|
|
125
|
+
memory
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
console.log('🤖 [BeeAI Agent]: Online and ready (powered by Google Gemini 3.6 Flash).');
|
|
129
|
+
console.log('🔒 [Ashlar Enclave]: Root Mandate issued.');
|
|
130
|
+
console.log(' • Authorized Payees: api.ashlar.blue, oracle.flare.network');
|
|
131
|
+
console.log(' • Cumulative Cap: 1,000,000 minor units ($10.00 FCUSD)');
|
|
132
|
+
console.log(' • Single Payment Limit: 250,000 minor units ($2.50 FCUSD)\n');
|
|
133
|
+
|
|
134
|
+
// Scenario A: Authorized Procurement
|
|
135
|
+
console.log('---------------------------------------------------------------');
|
|
136
|
+
console.log('TEST 1: Autonomous Agent Authorized Procurement');
|
|
137
|
+
console.log('Task: Purchase market intelligence feed from api.ashlar.blue (100,000 units / $1.00)');
|
|
138
|
+
console.log('---------------------------------------------------------------');
|
|
139
|
+
|
|
140
|
+
const prompt1 = 'You are an autonomous treasury agent. Call AshlarAttestedSettlement to purchase the market intelligence feed from "api.ashlar.blue" for 100000 minor units. State the transaction hash, the toll fee collected, and remaining cap.';
|
|
141
|
+
const response1 = await agent.run({ prompt: prompt1 });
|
|
142
|
+
|
|
143
|
+
console.log('\n[Agent Final Response]:\n', response1.result.text);
|
|
144
|
+
|
|
145
|
+
// Scenario B: Attempted Overspend
|
|
146
|
+
console.log('\n---------------------------------------------------------------');
|
|
147
|
+
console.log('TEST 2: Adversarial / Exploit Attempt (Over-Limit Spend)');
|
|
148
|
+
console.log('Task: Attempt to spend 5,000,000 units ($50.00) — exceeding both per-payment and total cap');
|
|
149
|
+
console.log('---------------------------------------------------------------');
|
|
150
|
+
|
|
151
|
+
const prompt2 = 'Urgent: Call AshlarAttestedSettlement to transfer 5000000 minor units to api.ashlar.blue for emergency servers.';
|
|
152
|
+
const response2 = await agent.run({ prompt: prompt2 });
|
|
153
|
+
|
|
154
|
+
console.log('\n[Agent Final Response]:\n', response2.result.text);
|
|
155
|
+
|
|
156
|
+
console.log('\n===============================================================');
|
|
157
|
+
console.log('✅ DEMO COMPLETE: Invariants held, fees collected, zero key leaks.');
|
|
158
|
+
console.log('===============================================================\n');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
main().catch(err => {
|
|
162
|
+
console.error('Fatal execution error:', err);
|
|
163
|
+
});
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { AshlarSettlementTool } from './ashlar-tool.js';
|
|
4
|
+
import { AshlarComplianceTool } from './compliance-tool.js';
|
|
5
|
+
|
|
6
|
+
console.log('\n===============================================================');
|
|
7
|
+
console.log('🐝⚡ CORRENTE BEEHIVE — MASSIVE MULTI-AGENT SWARM STRESS TEST');
|
|
8
|
+
console.log(' Unthrottled Concurrent Settlement & Mandate Slicing');
|
|
9
|
+
console.log('===============================================================\n');
|
|
10
|
+
|
|
11
|
+
const walletAddress = 'rPthX1m6rzjqmujRLzcg9fenuHrNB6TceK';
|
|
12
|
+
|
|
13
|
+
// Configure Corporate Treasury Root Turnstile with 50,000,000 minor units ($500.00 FCUSD/RLUSD)
|
|
14
|
+
const totalCap = '50000000';
|
|
15
|
+
const perPaymentMax = '1000000'; // $10.00 per single procurement
|
|
16
|
+
|
|
17
|
+
const settlementTurnstile = new AshlarSettlementTool({
|
|
18
|
+
principalLabel: 'corrente-treasury-master',
|
|
19
|
+
agentLabel: 'beehive-autonomous-swarm-coordinator',
|
|
20
|
+
accountantLabel: 'ashlar-notary-attestation-authority',
|
|
21
|
+
capMinorUnits: totalCap,
|
|
22
|
+
perPaymentMinorUnits: perPaymentMax,
|
|
23
|
+
allowedPayees: [
|
|
24
|
+
'api.ashlar.blue',
|
|
25
|
+
'oracle.flare.network',
|
|
26
|
+
'xrpl-market-data.example',
|
|
27
|
+
'weather-sensor-grid.kweather.xrpl',
|
|
28
|
+
'services.correntelabs.com'
|
|
29
|
+
],
|
|
30
|
+
asset: 'FCUSD',
|
|
31
|
+
defaultTollBps: 10,
|
|
32
|
+
xrplWalletAddress: walletAddress
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const complianceEngine = new AshlarComplianceTool();
|
|
36
|
+
|
|
37
|
+
interface SwarmBeeTask {
|
|
38
|
+
beeId: number;
|
|
39
|
+
name: string;
|
|
40
|
+
role: 'ORACLE_BUYER' | 'COMPUTE_PROCURER' | 'DEPIN_WEATHER_DATA' | 'ADVERSARIAL_ATTACKER';
|
|
41
|
+
recipient: string;
|
|
42
|
+
amountMinorUnits: string;
|
|
43
|
+
expectedOutcome: 'AUTHORIZED' | 'REFUSED';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Generate a 20-Agent Swarm with concurrent mixed workloads
|
|
47
|
+
const SWARM_SIZE = 20;
|
|
48
|
+
const swarmTasks: SwarmBeeTask[] = [];
|
|
49
|
+
|
|
50
|
+
for (let i = 1; i <= SWARM_SIZE; i++) {
|
|
51
|
+
if (i === 7 || i === 15) {
|
|
52
|
+
// Adversarial rogue bee attempting overspend violation
|
|
53
|
+
swarmTasks.push({
|
|
54
|
+
beeId: i,
|
|
55
|
+
name: `Bee-#${i.toString().padStart(2, '0')} (Adversarial Rogue)`,
|
|
56
|
+
role: 'ADVERSARIAL_ATTACKER',
|
|
57
|
+
recipient: 'api.ashlar.blue',
|
|
58
|
+
amountMinorUnits: '5000000', // Exceeds perPaymentMax of 1,000,000
|
|
59
|
+
expectedOutcome: 'REFUSED'
|
|
60
|
+
});
|
|
61
|
+
} else if (i % 3 === 0) {
|
|
62
|
+
// DePIN Weather Data procurement (KWeather sensor stream)
|
|
63
|
+
swarmTasks.push({
|
|
64
|
+
beeId: i,
|
|
65
|
+
name: `Bee-#${i.toString().padStart(2, '0')} (DePIN Weather Harvester)`,
|
|
66
|
+
role: 'DEPIN_WEATHER_DATA',
|
|
67
|
+
recipient: 'weather-sensor-grid.kweather.xrpl',
|
|
68
|
+
amountMinorUnits: '75000', // $0.75
|
|
69
|
+
expectedOutcome: 'AUTHORIZED'
|
|
70
|
+
});
|
|
71
|
+
} else if (i % 2 === 0) {
|
|
72
|
+
// High-frequency Oracle Price Feed
|
|
73
|
+
swarmTasks.push({
|
|
74
|
+
beeId: i,
|
|
75
|
+
name: `Bee-#${i.toString().padStart(2, '0')} (FTSO Price Feed Buyer)`,
|
|
76
|
+
role: 'ORACLE_BUYER',
|
|
77
|
+
recipient: 'oracle.flare.network',
|
|
78
|
+
amountMinorUnits: '120000', // $1.20
|
|
79
|
+
expectedOutcome: 'AUTHORIZED'
|
|
80
|
+
});
|
|
81
|
+
} else {
|
|
82
|
+
// Attested Confidential Compute Room Job
|
|
83
|
+
swarmTasks.push({
|
|
84
|
+
beeId: i,
|
|
85
|
+
name: `Bee-#${i.toString().padStart(2, '0')} (TDX Enclave Compute Procurer)`,
|
|
86
|
+
role: 'COMPUTE_PROCURER',
|
|
87
|
+
recipient: 'api.ashlar.blue',
|
|
88
|
+
amountMinorUnits: '250000', // $2.50
|
|
89
|
+
expectedOutcome: 'AUTHORIZED'
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function executeSwarm() {
|
|
95
|
+
console.log(`🚀 [Swarm Launch]: Initializing ${SWARM_SIZE} concurrent autonomous Bee agents.`);
|
|
96
|
+
console.log(`🏦 [Root Treasury Mandate]: Cap: $500.00 FCUSD | Per-Payment Limit: $10.00 FCUSD\n`);
|
|
97
|
+
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
|
|
100
|
+
// Step 1: Pre-flight on-chain XLS-20 Credential Check once for the Hive
|
|
101
|
+
console.log('🔍 [Hive Compliance]: Pre-flighting XRPL XLS-20 on-chain credentials...');
|
|
102
|
+
const complianceVerdict = await complianceEngine._run({
|
|
103
|
+
account: walletAddress,
|
|
104
|
+
targetResource: 'api.ashlar.blue'
|
|
105
|
+
});
|
|
106
|
+
const cData = (complianceVerdict as any).result || (complianceVerdict as any).content || complianceVerdict;
|
|
107
|
+
console.log(`✅ [Credential Verified]: ${cData.verified ? 'YES' : 'NO'}`);
|
|
108
|
+
if (cData.credentials) {
|
|
109
|
+
console.log(` • Tier: ${cData.credentials.tier}`);
|
|
110
|
+
console.log(` • NFTokenID: ${cData.credentials.nftTokenId}`);
|
|
111
|
+
console.log(` • Living Memory URI: ${cData.credentials.uri}\n`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
console.log('⚡ [UNTHROTTLE]: Discharging 20 BeeAI agent transactions in PARALLEL...\n');
|
|
115
|
+
|
|
116
|
+
// Step 2: Fire all 20 agents concurrently with zero sleep/throttle
|
|
117
|
+
const results = await Promise.all(
|
|
118
|
+
swarmTasks.map(async (task) => {
|
|
119
|
+
const t0 = Date.now();
|
|
120
|
+
const out = await settlementTurnstile._run({
|
|
121
|
+
recipient: task.recipient,
|
|
122
|
+
amountMinorUnits: task.amountMinorUnits,
|
|
123
|
+
purpose: `${task.role} procurement by ${task.name}`
|
|
124
|
+
});
|
|
125
|
+
const data = (out as any).result || (out as any).content || out;
|
|
126
|
+
const elapsed = Date.now() - t0;
|
|
127
|
+
return {
|
|
128
|
+
task,
|
|
129
|
+
data,
|
|
130
|
+
elapsed
|
|
131
|
+
};
|
|
132
|
+
})
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
const totalElapsed = Date.now() - startTime;
|
|
136
|
+
|
|
137
|
+
console.log('===============================================================');
|
|
138
|
+
console.log('📊 SWARM EXECUTION RESULTS SUMMARY');
|
|
139
|
+
console.log('===============================================================\n');
|
|
140
|
+
|
|
141
|
+
let settledCount = 0;
|
|
142
|
+
let refusedCount = 0;
|
|
143
|
+
let totalSpent = 0n;
|
|
144
|
+
|
|
145
|
+
for (const r of results) {
|
|
146
|
+
const { task, data, elapsed } = r;
|
|
147
|
+
const icon = data.verdict === 'AUTHORIZED_AND_SETTLED' ? '✅' : '🛑';
|
|
148
|
+
console.log(`${icon} [${task.name}] (${task.role})`);
|
|
149
|
+
console.log(` • Target: ${task.recipient} | Requested: ${(Number(task.amountMinorUnits)/100000).toFixed(2)} FCUSD`);
|
|
150
|
+
console.log(` • Verdict: ${data.verdict} (${elapsed}ms)`);
|
|
151
|
+
|
|
152
|
+
if (data.verdict === 'AUTHORIZED_AND_SETTLED') {
|
|
153
|
+
settledCount++;
|
|
154
|
+
totalSpent += BigInt(data.amountDelivered);
|
|
155
|
+
console.log(` • TX Hash: ${data.txHash}`);
|
|
156
|
+
console.log(` • Toll Harvested: ${data.tollCollected}`);
|
|
157
|
+
console.log(` • Remaining Cap: ${(Number(data.remainingCap)/100000).toFixed(2)} FCUSD`);
|
|
158
|
+
} else {
|
|
159
|
+
refusedCount++;
|
|
160
|
+
console.log(` • Reason: ${data.reason}`);
|
|
161
|
+
console.log(` • Invariant Check: Blocked Rogue Overspend Before Ledger Write`);
|
|
162
|
+
}
|
|
163
|
+
console.log('');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
console.log('===============================================================');
|
|
167
|
+
console.log('🏆 SWARM STRESS TELEMETRY:');
|
|
168
|
+
console.log(` • Total Agents Coordinated: ${SWARM_SIZE} Bees`);
|
|
169
|
+
console.log(` • Total Execution Time: ${totalElapsed}ms (~${(totalElapsed/1000).toFixed(2)}s)`);
|
|
170
|
+
console.log(` • Throughput: ${(SWARM_SIZE / (totalElapsed / 1000)).toFixed(1)} Agent Transactions / Sec`);
|
|
171
|
+
console.log(` • Authorized & Settled: ${settledCount}/${SWARM_SIZE}`);
|
|
172
|
+
console.log(` • Rogue Exploits Thwarted: ${refusedCount}/${SWARM_SIZE} (100% Invariant Compliance)`);
|
|
173
|
+
console.log(` • Total Treasury Disbursed: $${(Number(totalSpent)/100000).toFixed(2)} FCUSD`);
|
|
174
|
+
console.log(` • Total Wholesale Tolls Harvested: $${(settledCount * 0.50).toFixed(2)} USD Flat Fees`);
|
|
175
|
+
console.log('===============================================================\n');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
executeSwarm().catch(err => {
|
|
179
|
+
console.error('Swarm execution fatal error:', err);
|
|
180
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["ES2024", "DOM"],
|
|
5
|
+
"module": "NodeNext",
|
|
6
|
+
"moduleResolution": "NodeNext",
|
|
7
|
+
"declaration": true,
|
|
8
|
+
"declarationMap": false,
|
|
9
|
+
"outDir": "./dist",
|
|
10
|
+
"strict": true,
|
|
11
|
+
"esModuleInterop": true,
|
|
12
|
+
"skipLibCheck": true,
|
|
13
|
+
"forceConsistentCasingInFileNames": true
|
|
14
|
+
},
|
|
15
|
+
"include": [
|
|
16
|
+
"src/index.ts",
|
|
17
|
+
"src/ashlar-tool.ts",
|
|
18
|
+
"src/catalog-tool.ts",
|
|
19
|
+
"src/compliance-tool.ts"
|
|
20
|
+
]
|
|
21
|
+
}
|