agentlang 0.10.9 → 0.11.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 +60 -0
- package/out/api/http.d.ts.map +1 -1
- package/out/api/http.js +64 -39
- package/out/api/http.js.map +1 -1
- package/out/cli/main.d.ts +1 -1
- package/out/cli/main.d.ts.map +1 -1
- package/out/cli/main.js +7 -3
- package/out/cli/main.js.map +1 -1
- package/out/extension/main.cjs +250 -250
- package/out/extension/main.cjs.map +2 -2
- package/out/language/main.cjs +504 -504
- package/out/language/main.cjs.map +3 -3
- package/out/runtime/auth/cognito.d.ts.map +1 -1
- package/out/runtime/auth/cognito.js +129 -64
- package/out/runtime/auth/cognito.js.map +1 -1
- package/out/runtime/defs.d.ts +22 -9
- package/out/runtime/defs.d.ts.map +1 -1
- package/out/runtime/defs.js +44 -9
- package/out/runtime/defs.js.map +1 -1
- package/out/runtime/document-retriever.d.ts +24 -0
- package/out/runtime/document-retriever.d.ts.map +1 -0
- package/out/runtime/document-retriever.js +258 -0
- package/out/runtime/document-retriever.js.map +1 -0
- package/out/runtime/errors/coded-error.d.ts +8 -0
- package/out/runtime/errors/coded-error.d.ts.map +1 -0
- package/out/runtime/errors/coded-error.js +13 -0
- package/out/runtime/errors/coded-error.js.map +1 -0
- package/out/runtime/errors/http-error.d.ts +25 -0
- package/out/runtime/errors/http-error.d.ts.map +1 -0
- package/out/runtime/errors/http-error.js +169 -0
- package/out/runtime/errors/http-error.js.map +1 -0
- package/out/runtime/excel-resolver.d.ts +4 -0
- package/out/runtime/excel-resolver.d.ts.map +1 -0
- package/out/runtime/excel-resolver.js +96 -0
- package/out/runtime/excel-resolver.js.map +1 -0
- package/out/runtime/excel.d.ts +25 -0
- package/out/runtime/excel.d.ts.map +1 -0
- package/out/runtime/excel.js +127 -0
- package/out/runtime/excel.js.map +1 -0
- package/out/runtime/interpreter.d.ts.map +1 -1
- package/out/runtime/interpreter.js +26 -25
- package/out/runtime/interpreter.js.map +1 -1
- package/out/runtime/logger.d.ts +6 -0
- package/out/runtime/logger.d.ts.map +1 -1
- package/out/runtime/logger.js +21 -0
- package/out/runtime/logger.js.map +1 -1
- package/out/runtime/module.d.ts.map +1 -1
- package/out/runtime/module.js +14 -13
- package/out/runtime/module.js.map +1 -1
- package/out/runtime/modules/ai.d.ts +1 -0
- package/out/runtime/modules/ai.d.ts.map +1 -1
- package/out/runtime/modules/ai.js +1 -0
- package/out/runtime/modules/ai.js.map +1 -1
- package/out/runtime/modules/auth.d.ts.map +1 -1
- package/out/runtime/modules/auth.js +35 -12
- package/out/runtime/modules/auth.js.map +1 -1
- package/out/runtime/modules/core.d.ts +6 -0
- package/out/runtime/modules/core.d.ts.map +1 -1
- package/out/runtime/modules/core.js +20 -0
- package/out/runtime/modules/core.js.map +1 -1
- package/out/runtime/resolvers/sqldb/database.d.ts.map +1 -1
- package/out/runtime/resolvers/sqldb/database.js +76 -39
- package/out/runtime/resolvers/sqldb/database.js.map +1 -1
- package/out/runtime/resolvers/sqldb/db-errors.d.ts +6 -0
- package/out/runtime/resolvers/sqldb/db-errors.d.ts.map +1 -0
- package/out/runtime/resolvers/sqldb/db-errors.js +100 -0
- package/out/runtime/resolvers/sqldb/db-errors.js.map +1 -0
- package/out/runtime/resolvers/vector/lancedb-store.d.ts +16 -0
- package/out/runtime/resolvers/vector/lancedb-store.d.ts.map +1 -0
- package/out/runtime/resolvers/vector/lancedb-store.js +159 -0
- package/out/runtime/resolvers/vector/lancedb-store.js.map +1 -0
- package/out/runtime/resolvers/vector/types.d.ts +32 -0
- package/out/runtime/resolvers/vector/types.d.ts.map +1 -0
- package/out/runtime/resolvers/vector/types.js +2 -0
- package/out/runtime/resolvers/vector/types.js.map +1 -0
- package/out/runtime/state.d.ts +3 -0
- package/out/runtime/state.d.ts.map +1 -1
- package/out/runtime/state.js +7 -0
- package/out/runtime/state.js.map +1 -1
- package/out/setupClassic.d.ts +98 -0
- package/out/setupClassic.d.ts.map +1 -0
- package/out/setupClassic.js +38 -0
- package/out/setupClassic.js.map +1 -0
- package/out/setupCommon.d.ts +2 -0
- package/out/setupCommon.d.ts.map +1 -0
- package/out/setupCommon.js +33 -0
- package/out/setupCommon.js.map +1 -0
- package/out/setupExtended.d.ts +40 -0
- package/out/setupExtended.d.ts.map +1 -0
- package/out/setupExtended.js +67 -0
- package/out/setupExtended.js.map +1 -0
- package/package.json +19 -18
- package/src/api/http.ts +71 -37
- package/src/cli/main.ts +12 -4
- package/src/runtime/auth/cognito.ts +187 -65
- package/src/runtime/defs.ts +51 -18
- package/src/runtime/errors/coded-error.ts +18 -0
- package/src/runtime/errors/http-error.ts +197 -0
- package/src/runtime/interpreter.ts +70 -27
- package/src/runtime/logger.ts +27 -0
- package/src/runtime/module.ts +45 -13
- package/src/runtime/modules/ai.ts +1 -0
- package/src/runtime/modules/auth.ts +35 -12
- package/src/runtime/modules/core.ts +26 -0
- package/src/runtime/resolvers/sqldb/database.ts +88 -37
- package/src/runtime/resolvers/sqldb/db-errors.ts +113 -0
- package/src/runtime/state.ts +7 -0
- package/src/xlsx.d.ts +17 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { logger } from './logger.js';
|
|
2
|
+
import { AppConfig } from './state.js';
|
|
3
|
+
import { TextChunker } from './embeddings/chunker.js';
|
|
4
|
+
import { OpenAIEmbeddingProvider } from './embeddings/openai.js';
|
|
5
|
+
import { LanceDBVectorStore } from './resolvers/vector/lancedb-store.js';
|
|
6
|
+
import crypto from 'crypto';
|
|
7
|
+
import { readFileSync } from 'fs';
|
|
8
|
+
import { resolve as pathResolve } from 'path';
|
|
9
|
+
const VECTOR_DIMENSION = 1536;
|
|
10
|
+
function usePgvector() {
|
|
11
|
+
var _a, _b, _c;
|
|
12
|
+
if (((_a = AppConfig === null || AppConfig === void 0 ? void 0 : AppConfig.vectorStore) === null || _a === void 0 ? void 0 : _a.type) === 'pgvector')
|
|
13
|
+
return true;
|
|
14
|
+
if (((_b = AppConfig === null || AppConfig === void 0 ? void 0 : AppConfig.vectorStore) === null || _b === void 0 ? void 0 : _b.type) === 'lancedb')
|
|
15
|
+
return false;
|
|
16
|
+
return ((_c = AppConfig === null || AppConfig === void 0 ? void 0 : AppConfig.store) === null || _c === void 0 ? void 0 : _c.type) === 'postgres';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Local document retriever — embeds documents into pgvector or LanceDB
|
|
20
|
+
* and retrieves relevant chunks via vector similarity search.
|
|
21
|
+
*/
|
|
22
|
+
class DocumentRetriever {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.vectorStore = null;
|
|
25
|
+
this.embeddingProvider = null;
|
|
26
|
+
this.chunker = null;
|
|
27
|
+
this.localChunks = new Map();
|
|
28
|
+
this.processedDocuments = new Set();
|
|
29
|
+
this.initialized = false;
|
|
30
|
+
}
|
|
31
|
+
async ensureInit() {
|
|
32
|
+
var _a;
|
|
33
|
+
if (this.initialized)
|
|
34
|
+
return;
|
|
35
|
+
this.chunker = new TextChunker(1000, 200);
|
|
36
|
+
this.embeddingProvider = new OpenAIEmbeddingProvider({
|
|
37
|
+
model: 'text-embedding-3-small',
|
|
38
|
+
});
|
|
39
|
+
if (!usePgvector()) {
|
|
40
|
+
const dbPath = ((_a = AppConfig === null || AppConfig === void 0 ? void 0 : AppConfig.vectorStore) === null || _a === void 0 ? void 0 : _a.type) === 'lancedb'
|
|
41
|
+
? AppConfig.vectorStore.dbname || './data/document-vectors.lance'
|
|
42
|
+
: './data/document-vectors.lance';
|
|
43
|
+
this.vectorStore = new LanceDBVectorStore({
|
|
44
|
+
moduleName: 'documents',
|
|
45
|
+
vectorDimension: VECTOR_DIMENSION,
|
|
46
|
+
dbname: dbPath,
|
|
47
|
+
});
|
|
48
|
+
await this.vectorStore.init();
|
|
49
|
+
logger.info(`[DOCUMENT-RETRIEVER] LanceDB vector store initialized at ${dbPath}`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
try {
|
|
53
|
+
const ag = globalThis.agentlang;
|
|
54
|
+
if (ag === null || ag === void 0 ? void 0 : ag.rawQuery) {
|
|
55
|
+
await ag.rawQuery(`
|
|
56
|
+
CREATE TABLE IF NOT EXISTS document_local_chunks (
|
|
57
|
+
id TEXT PRIMARY KEY,
|
|
58
|
+
content TEXT NOT NULL,
|
|
59
|
+
document_title TEXT NOT NULL,
|
|
60
|
+
chunk_index INTEGER NOT NULL,
|
|
61
|
+
embedding vector(${VECTOR_DIMENSION})
|
|
62
|
+
)
|
|
63
|
+
`);
|
|
64
|
+
try {
|
|
65
|
+
await ag.rawQuery(`
|
|
66
|
+
CREATE INDEX IF NOT EXISTS idx_document_local_chunks_embedding
|
|
67
|
+
ON document_local_chunks USING hnsw (embedding vector_cosine_ops)
|
|
68
|
+
`);
|
|
69
|
+
}
|
|
70
|
+
catch (_b) {
|
|
71
|
+
// Index may already exist or pgvector extension not loaded
|
|
72
|
+
}
|
|
73
|
+
logger.info('[DOCUMENT-RETRIEVER] pgvector local chunks table initialized');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
logger.warn(`[DOCUMENT-RETRIEVER] Failed to initialize pgvector table: ${err}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
this.initialized = true;
|
|
81
|
+
}
|
|
82
|
+
async processDocument(title, url) {
|
|
83
|
+
if (this.processedDocuments.has(title))
|
|
84
|
+
return;
|
|
85
|
+
await this.ensureInit();
|
|
86
|
+
try {
|
|
87
|
+
let content;
|
|
88
|
+
if (url.startsWith('http://') || url.startsWith('https://')) {
|
|
89
|
+
const resp = await fetch(url);
|
|
90
|
+
if (!resp.ok) {
|
|
91
|
+
logger.warn(`[DOCUMENT-RETRIEVER] Failed to fetch "${title}" from ${url}: ${resp.status}`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
content = await resp.text();
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const filePath = pathResolve(url);
|
|
98
|
+
try {
|
|
99
|
+
content = readFileSync(filePath, 'utf-8');
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger.warn(`[DOCUMENT-RETRIEVER] Failed to read "${title}" from ${filePath}: ${err}`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (!content || content.trim().length === 0) {
|
|
107
|
+
logger.debug(`[DOCUMENT-RETRIEVER] Document "${title}" is empty, skipping`);
|
|
108
|
+
this.processedDocuments.add(title);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const chunks = this.chunker.splitText(content);
|
|
112
|
+
logger.debug(`[DOCUMENT-RETRIEVER] Document "${title}": ${chunks.length} chunks`);
|
|
113
|
+
if (chunks.length === 0) {
|
|
114
|
+
this.processedDocuments.add(title);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const embeddings = await this.embeddingProvider.embedTexts(chunks);
|
|
118
|
+
if (usePgvector()) {
|
|
119
|
+
await this.storePgvectorChunks(title, chunks, embeddings);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
await this.storeLanceDBChunks(title, chunks, embeddings);
|
|
123
|
+
}
|
|
124
|
+
this.processedDocuments.add(title);
|
|
125
|
+
logger.info(`[DOCUMENT-RETRIEVER] Processed "${title}": ${chunks.length} chunks embedded and stored`);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
logger.warn(`[DOCUMENT-RETRIEVER] Error processing "${title}": ${err}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async storePgvectorChunks(title, chunks, embeddings) {
|
|
132
|
+
const ag = globalThis.agentlang;
|
|
133
|
+
if (!(ag === null || ag === void 0 ? void 0 : ag.rawQuery))
|
|
134
|
+
return;
|
|
135
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
136
|
+
const id = crypto.randomUUID();
|
|
137
|
+
const embeddingStr = `[${embeddings[i].join(',')}]`;
|
|
138
|
+
await ag.rawQuery(`INSERT INTO document_local_chunks (id, content, document_title, chunk_index, embedding)
|
|
139
|
+
VALUES ($1, $2, $3, $4, $5::vector)
|
|
140
|
+
ON CONFLICT (id) DO NOTHING`, [id, chunks[i], title, i, embeddingStr]);
|
|
141
|
+
this.localChunks.set(id, {
|
|
142
|
+
id,
|
|
143
|
+
content: chunks[i],
|
|
144
|
+
documentTitle: title,
|
|
145
|
+
chunkIndex: i,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async storeLanceDBChunks(title, chunks, embeddings) {
|
|
150
|
+
if (!this.vectorStore)
|
|
151
|
+
return;
|
|
152
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
153
|
+
const id = crypto.randomUUID();
|
|
154
|
+
await this.vectorStore.addEmbedding({
|
|
155
|
+
id,
|
|
156
|
+
embedding: embeddings[i],
|
|
157
|
+
documentId: title,
|
|
158
|
+
});
|
|
159
|
+
this.localChunks.set(id, {
|
|
160
|
+
id,
|
|
161
|
+
content: chunks[i],
|
|
162
|
+
documentTitle: title,
|
|
163
|
+
chunkIndex: i,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async query(queryText, documentTitles, limit = 10) {
|
|
168
|
+
await this.ensureInit();
|
|
169
|
+
try {
|
|
170
|
+
const results = usePgvector()
|
|
171
|
+
? await this.queryPgvector(queryText, documentTitles, limit)
|
|
172
|
+
: await this.queryLanceDB(queryText, documentTitles, limit);
|
|
173
|
+
if (results.length === 0)
|
|
174
|
+
return '';
|
|
175
|
+
return results.map(r => r.content).join('\n\n---\n\n');
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
logger.debug(`[DOCUMENT-RETRIEVER] Query failed: ${err}`);
|
|
179
|
+
return '';
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async queryPgvector(queryText, documentTitles, limit = 10) {
|
|
183
|
+
const ag = globalThis.agentlang;
|
|
184
|
+
if (!(ag === null || ag === void 0 ? void 0 : ag.rawQuery))
|
|
185
|
+
return [];
|
|
186
|
+
const queryEmbedding = await this.embeddingProvider.embedText(queryText);
|
|
187
|
+
const embeddingStr = `[${queryEmbedding.join(',')}]`;
|
|
188
|
+
let sql;
|
|
189
|
+
let params;
|
|
190
|
+
if (documentTitles && documentTitles.length > 0) {
|
|
191
|
+
const placeholders = documentTitles.map((_, i) => `$${i + 2}`).join(', ');
|
|
192
|
+
sql = `SELECT id, content, document_title, 1 - (embedding <=> $1::vector) AS similarity
|
|
193
|
+
FROM document_local_chunks
|
|
194
|
+
WHERE document_title IN (${placeholders})
|
|
195
|
+
ORDER BY embedding <=> $1::vector
|
|
196
|
+
LIMIT ${limit}`;
|
|
197
|
+
params = [embeddingStr, ...documentTitles];
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
sql = `SELECT id, content, document_title, 1 - (embedding <=> $1::vector) AS similarity
|
|
201
|
+
FROM document_local_chunks
|
|
202
|
+
ORDER BY embedding <=> $1::vector
|
|
203
|
+
LIMIT ${limit}`;
|
|
204
|
+
params = [embeddingStr];
|
|
205
|
+
}
|
|
206
|
+
const rows = await ag.rawQuery(sql, params);
|
|
207
|
+
return (rows || []).map((r) => ({
|
|
208
|
+
id: r.id,
|
|
209
|
+
content: r.content,
|
|
210
|
+
similarity: parseFloat(r.similarity) || 0,
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
async queryLanceDB(queryText, documentTitles, limit = 10) {
|
|
214
|
+
if (!this.vectorStore)
|
|
215
|
+
return [];
|
|
216
|
+
const queryEmbedding = await this.embeddingProvider.embedText(queryText);
|
|
217
|
+
const searchResults = await this.vectorStore.search(queryEmbedding, undefined, undefined, limit);
|
|
218
|
+
const results = [];
|
|
219
|
+
for (const sr of searchResults) {
|
|
220
|
+
const chunk = this.localChunks.get(sr.id);
|
|
221
|
+
if (!chunk)
|
|
222
|
+
continue;
|
|
223
|
+
if (documentTitles && documentTitles.length > 0) {
|
|
224
|
+
if (!documentTitles.includes(chunk.documentTitle))
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
results.push({
|
|
228
|
+
id: sr.id,
|
|
229
|
+
content: chunk.content,
|
|
230
|
+
similarity: 1 - (sr.distance || 0),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
return results.slice(0, limit);
|
|
234
|
+
}
|
|
235
|
+
async close() {
|
|
236
|
+
if (this.vectorStore) {
|
|
237
|
+
await this.vectorStore.close();
|
|
238
|
+
this.vectorStore = null;
|
|
239
|
+
}
|
|
240
|
+
this.localChunks.clear();
|
|
241
|
+
this.processedDocuments.clear();
|
|
242
|
+
this.initialized = false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
let retrieverInstance = null;
|
|
246
|
+
export function getDocumentRetriever() {
|
|
247
|
+
if (!retrieverInstance) {
|
|
248
|
+
retrieverInstance = new DocumentRetriever();
|
|
249
|
+
}
|
|
250
|
+
return retrieverInstance;
|
|
251
|
+
}
|
|
252
|
+
export function resetDocumentRetriever() {
|
|
253
|
+
if (retrieverInstance) {
|
|
254
|
+
retrieverInstance.close().catch(() => { });
|
|
255
|
+
retrieverInstance = null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=document-retriever.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-retriever.js","sourceRoot":"","sources":["../../src/runtime/document-retriever.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Stable bucket for errors without an explicit code. */
|
|
2
|
+
export declare const AL_RUNTIME_UNHANDLED = "AL_RUNTIME_UNHANDLED";
|
|
3
|
+
export type CodedError = Error & {
|
|
4
|
+
agentlangCode: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function createCodedError(message: string, code: string): CodedError;
|
|
7
|
+
export declare function isCodedError(err: unknown): err is CodedError;
|
|
8
|
+
//# sourceMappingURL=coded-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coded-error.d.ts","sourceRoot":"","sources":["../../../src/runtime/errors/coded-error.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAI1E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAM5D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Stable bucket for errors without an explicit code. */
|
|
2
|
+
export const AL_RUNTIME_UNHANDLED = 'AL_RUNTIME_UNHANDLED';
|
|
3
|
+
export function createCodedError(message, code) {
|
|
4
|
+
const e = new Error(message);
|
|
5
|
+
e.agentlangCode = code;
|
|
6
|
+
return e;
|
|
7
|
+
}
|
|
8
|
+
export function isCodedError(err) {
|
|
9
|
+
return (err instanceof Error &&
|
|
10
|
+
typeof err.agentlangCode === 'string' &&
|
|
11
|
+
err.agentlangCode.length > 0);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=coded-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coded-error.js","sourceRoot":"","sources":["../../../src/runtime/errors/coded-error.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAI3D,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,IAAY;IAC5D,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,CACL,GAAG,YAAY,KAAK;QACpB,OAAQ,GAAkB,CAAC,aAAa,KAAK,QAAQ;QACpD,GAAkB,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Registry of Tier-1 HTTP-facing error codes (documentation / consistency). */
|
|
2
|
+
export declare const AgentlangErrorCodes: {
|
|
3
|
+
readonly AL_RUNTIME_UNHANDLED: "AL_RUNTIME_UNHANDLED";
|
|
4
|
+
readonly AL_HTTP_AUTH_REQUIRED: "AL_HTTP_AUTH_REQUIRED";
|
|
5
|
+
readonly AL_HTTP_HANDLER_EXCEPTION: "AL_HTTP_HANDLER_EXCEPTION";
|
|
6
|
+
};
|
|
7
|
+
/** Replace `{{code}}` and `{{message}}` with runtime values (iterates until stable). */
|
|
8
|
+
export declare function applyErrorMessageTemplate(template: string, code: string, originalMessage: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* When custom error messages are enabled, append the error to a dedicated
|
|
11
|
+
* `logs/errors-<DATE>.log` file as a single line: timestamp (added by the logger),
|
|
12
|
+
* error code, and error message. No-op when custom messages are disabled.
|
|
13
|
+
*/
|
|
14
|
+
export declare function recordCustomError(code: string, message: string): void;
|
|
15
|
+
export declare function getErrorCode(err: unknown): string;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the message for an entity-route error from the `agentlang/errorMessage`
|
|
18
|
+
* system entity. An entity-specific override (`module/Entry`) wins over a universal
|
|
19
|
+
* (`*`) one for the same code; falls back to `defaultMessage` when neither exists or
|
|
20
|
+
* when custom messages are disabled.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveEntityErrorMessage(moduleName: string, entryName: string, code: string, defaultMessage: string): Promise<string>;
|
|
23
|
+
export declare function httpStatusFromError(err: unknown): number;
|
|
24
|
+
export declare function logEntityRouteError(reason: unknown, agentlangCode: string): void;
|
|
25
|
+
//# sourceMappingURL=http-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-error.d.ts","sourceRoot":"","sources":["../../../src/runtime/errors/http-error.ts"],"names":[],"mappings":"AAiBA,gFAAgF;AAChF,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAKX,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,GACtB,MAAM,CASR;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASrE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAmCjD;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAwDxD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAOhF"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { AgentCancelledException } from '../modules/ai.js';
|
|
2
|
+
import { lookupCustomErrorMessage } from '../modules/core.js';
|
|
3
|
+
import { BadRequestError, CodeMismatchError, ExpiredCodeError, InvalidParameterError, PasswordResetRequiredError, TooManyRequestsError, UnauthorisedError, UserNotConfirmedError, UserNotFoundError, } from '../defs.js';
|
|
4
|
+
import { errorFileLogger, logger } from '../logger.js';
|
|
5
|
+
import { AppConfig } from '../state.js';
|
|
6
|
+
import { AL_RUNTIME_UNHANDLED, isCodedError } from './coded-error.js';
|
|
7
|
+
/** Registry of Tier-1 HTTP-facing error codes (documentation / consistency). */
|
|
8
|
+
export const AgentlangErrorCodes = {
|
|
9
|
+
AL_RUNTIME_UNHANDLED,
|
|
10
|
+
AL_HTTP_AUTH_REQUIRED: 'AL_HTTP_AUTH_REQUIRED',
|
|
11
|
+
AL_HTTP_HANDLER_EXCEPTION: 'AL_HTTP_HANDLER_EXCEPTION',
|
|
12
|
+
};
|
|
13
|
+
/** `target` value of an override that applies to any entity for a given code. */
|
|
14
|
+
const UNIVERSAL_TARGET = '*';
|
|
15
|
+
/** Replace `{{code}}` and `{{message}}` with runtime values (iterates until stable). */
|
|
16
|
+
export function applyErrorMessageTemplate(template, code, originalMessage) {
|
|
17
|
+
let out = template;
|
|
18
|
+
const maxPasses = 10;
|
|
19
|
+
for (let i = 0; i < maxPasses; i++) {
|
|
20
|
+
const next = out.replace(/\{\{code\}\}/g, code).replace(/\{\{message\}\}/g, originalMessage);
|
|
21
|
+
if (next === out)
|
|
22
|
+
break;
|
|
23
|
+
out = next;
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
function customMessagesEnabled() {
|
|
28
|
+
var _a;
|
|
29
|
+
return ((_a = AppConfig === null || AppConfig === void 0 ? void 0 : AppConfig.customErrorMessages) === null || _a === void 0 ? void 0 : _a.enabled) === true;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* When custom error messages are enabled, append the error to a dedicated
|
|
33
|
+
* `logs/errors-<DATE>.log` file as a single line: timestamp (added by the logger),
|
|
34
|
+
* error code, and error message. No-op when custom messages are disabled.
|
|
35
|
+
*/
|
|
36
|
+
export function recordCustomError(code, message) {
|
|
37
|
+
if (!customMessagesEnabled()) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
errorFileLogger === null || errorFileLogger === void 0 ? void 0 : errorFileLogger.error(`${code} ${message}`);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
logger.warn(`Failed to write error to errors log file: ${e}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function getErrorCode(err) {
|
|
48
|
+
if (isCodedError(err)) {
|
|
49
|
+
return err.agentlangCode;
|
|
50
|
+
}
|
|
51
|
+
if (err instanceof UnauthorisedError) {
|
|
52
|
+
return err.agentlangCode;
|
|
53
|
+
}
|
|
54
|
+
if (err instanceof BadRequestError) {
|
|
55
|
+
return err.agentlangCode;
|
|
56
|
+
}
|
|
57
|
+
if (err instanceof UserNotFoundError) {
|
|
58
|
+
return err.agentlangCode;
|
|
59
|
+
}
|
|
60
|
+
if (err instanceof UserNotConfirmedError) {
|
|
61
|
+
return err.agentlangCode;
|
|
62
|
+
}
|
|
63
|
+
if (err instanceof PasswordResetRequiredError) {
|
|
64
|
+
return err.agentlangCode;
|
|
65
|
+
}
|
|
66
|
+
if (err instanceof TooManyRequestsError) {
|
|
67
|
+
return err.agentlangCode;
|
|
68
|
+
}
|
|
69
|
+
if (err instanceof InvalidParameterError) {
|
|
70
|
+
return err.agentlangCode;
|
|
71
|
+
}
|
|
72
|
+
if (err instanceof ExpiredCodeError) {
|
|
73
|
+
return err.agentlangCode;
|
|
74
|
+
}
|
|
75
|
+
if (err instanceof CodeMismatchError) {
|
|
76
|
+
return err.agentlangCode;
|
|
77
|
+
}
|
|
78
|
+
if (err instanceof AgentCancelledException) {
|
|
79
|
+
return err.agentlangCode;
|
|
80
|
+
}
|
|
81
|
+
return AL_RUNTIME_UNHANDLED;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Resolve the message for an entity-route error from the `agentlang/errorMessage`
|
|
85
|
+
* system entity. An entity-specific override (`module/Entry`) wins over a universal
|
|
86
|
+
* (`*`) one for the same code; falls back to `defaultMessage` when neither exists or
|
|
87
|
+
* when custom messages are disabled.
|
|
88
|
+
*/
|
|
89
|
+
export async function resolveEntityErrorMessage(moduleName, entryName, code, defaultMessage) {
|
|
90
|
+
var _a;
|
|
91
|
+
if (!customMessagesEnabled()) {
|
|
92
|
+
return defaultMessage;
|
|
93
|
+
}
|
|
94
|
+
let template;
|
|
95
|
+
try {
|
|
96
|
+
const entityKey = `${moduleName}/${entryName}`;
|
|
97
|
+
template =
|
|
98
|
+
(_a = (await lookupCustomErrorMessage(entityKey, code))) !== null && _a !== void 0 ? _a : (await lookupCustomErrorMessage(UNIVERSAL_TARGET, code));
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
logger.warn(`Failed to resolve custom error message for code ${code}: ${e}`);
|
|
102
|
+
return defaultMessage;
|
|
103
|
+
}
|
|
104
|
+
if (template === undefined) {
|
|
105
|
+
return defaultMessage;
|
|
106
|
+
}
|
|
107
|
+
return applyErrorMessageTemplate(template, code, defaultMessage);
|
|
108
|
+
}
|
|
109
|
+
export function httpStatusFromError(err) {
|
|
110
|
+
const ec = getErrorCode(err);
|
|
111
|
+
if (ec === 'AL_DB_UNIQUE_VIOLATION') {
|
|
112
|
+
return 409;
|
|
113
|
+
}
|
|
114
|
+
if (ec === 'AL_DB_FOREIGN_KEY_VIOLATION' ||
|
|
115
|
+
ec === 'AL_DB_NOT_NULL_VIOLATION' ||
|
|
116
|
+
ec === 'AL_DB_CHECK_VIOLATION' ||
|
|
117
|
+
ec === 'AL_DB_INVALID_TYPE' ||
|
|
118
|
+
ec === 'AL_MOD_TYPE_MISMATCH' ||
|
|
119
|
+
ec === 'AL_MOD_INVALID_ATTR') {
|
|
120
|
+
return 400;
|
|
121
|
+
}
|
|
122
|
+
if (ec === 'AL_DB_DEADLOCK' ||
|
|
123
|
+
ec === 'AL_DB_LOCK_WAIT_TIMEOUT' ||
|
|
124
|
+
ec === 'AL_DB_SERIALIZATION_FAILURE') {
|
|
125
|
+
return 503;
|
|
126
|
+
}
|
|
127
|
+
if (ec === 'AL_DB_SYNTAX_ERROR' || ec === 'AL_DB_QUERY_FAILED') {
|
|
128
|
+
return 500;
|
|
129
|
+
}
|
|
130
|
+
if (err instanceof UserNotFoundError) {
|
|
131
|
+
return 404;
|
|
132
|
+
}
|
|
133
|
+
if (err instanceof UnauthorisedError) {
|
|
134
|
+
return 401;
|
|
135
|
+
}
|
|
136
|
+
if (err instanceof TooManyRequestsError) {
|
|
137
|
+
return 429;
|
|
138
|
+
}
|
|
139
|
+
if (err instanceof BadRequestError || err instanceof InvalidParameterError) {
|
|
140
|
+
return 400;
|
|
141
|
+
}
|
|
142
|
+
if (err instanceof ExpiredCodeError || err instanceof CodeMismatchError) {
|
|
143
|
+
return 400;
|
|
144
|
+
}
|
|
145
|
+
if (err instanceof UserNotConfirmedError || err instanceof PasswordResetRequiredError) {
|
|
146
|
+
return 403;
|
|
147
|
+
}
|
|
148
|
+
if (err instanceof Error && err.message) {
|
|
149
|
+
if (err.message.includes('temporarily unavailable') ||
|
|
150
|
+
err.message.includes('service error') ||
|
|
151
|
+
err.message.includes('configuration error')) {
|
|
152
|
+
return 503;
|
|
153
|
+
}
|
|
154
|
+
if (err.message.includes('contact support')) {
|
|
155
|
+
return 500;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return 500;
|
|
159
|
+
}
|
|
160
|
+
export function logEntityRouteError(reason, agentlangCode) {
|
|
161
|
+
if (reason instanceof Error) {
|
|
162
|
+
const stack = reason.stack ? `\n${reason.stack}` : '';
|
|
163
|
+
logger.error(`[${agentlangCode}] ${reason.name}: ${reason.message}${stack}`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
logger.error(`[${agentlangCode}] ${String(reason)}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=http-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-error.js","sourceRoot":"","sources":["../../../src/runtime/errors/http-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Instance } from './module.js';
|
|
2
|
+
export declare function querySheet(_resolver: any, inst: Instance, _queryAll?: boolean): Promise<Instance[]>;
|
|
3
|
+
export declare function createSheetRow(_resolver: any, inst: Instance): Promise<Instance>;
|
|
4
|
+
//# sourceMappingURL=excel-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excel-resolver.d.ts","sourceRoot":"","sources":["../../src/runtime/excel-resolver.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgBvC,wBAAsB,UAAU,CAC9B,SAAS,EAAE,GAAG,EACd,IAAI,EAAE,QAAQ,EACd,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoCrB;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiDtF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Excel file resolver - query and create rows in Excel sheets.
|
|
3
|
+
* Used by entities created from Excel config (agentlang.excel).
|
|
4
|
+
*/
|
|
5
|
+
import { makeInstance, newInstanceAttributes } from './module.js';
|
|
6
|
+
function isUrl(path) {
|
|
7
|
+
return typeof path === 'string' && /^https?:\/\//i.test(path);
|
|
8
|
+
}
|
|
9
|
+
async function loadWorkbook(excelPath, XLSX) {
|
|
10
|
+
if (isUrl(excelPath)) {
|
|
11
|
+
const res = await fetch(excelPath);
|
|
12
|
+
if (!res.ok)
|
|
13
|
+
throw new Error(`Failed to fetch: ${res.status} ${res.statusText}`);
|
|
14
|
+
const buf = await res.arrayBuffer();
|
|
15
|
+
return XLSX.read(buf, { type: 'arraybuffer' });
|
|
16
|
+
}
|
|
17
|
+
return XLSX.readFile(excelPath);
|
|
18
|
+
}
|
|
19
|
+
export async function querySheet(_resolver, inst, _queryAll) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
const filePath = inst.record.getMeta('excel_path');
|
|
22
|
+
const sheetName = inst.record.getMeta('sheet_name');
|
|
23
|
+
const excelHeaders = inst.record.getMeta('excel_headers');
|
|
24
|
+
if (!filePath) {
|
|
25
|
+
throw new Error('Excel file path is required for querying sheets');
|
|
26
|
+
}
|
|
27
|
+
const XLSXModule = await import('xlsx');
|
|
28
|
+
const XLSX = XLSXModule.default || XLSXModule;
|
|
29
|
+
const workbook = await loadWorkbook(filePath, XLSX);
|
|
30
|
+
const sheetNames = workbook.SheetNames || [];
|
|
31
|
+
const targetSheet = sheetName && sheetNames.includes(sheetName) ? sheetName : sheetNames[0];
|
|
32
|
+
const ws = workbook.Sheets[targetSheet];
|
|
33
|
+
const rows = XLSX.utils.sheet_to_json(ws, { raw: false, defval: null });
|
|
34
|
+
const schema = inst.record.schema;
|
|
35
|
+
const attrNames = Array.from(schema.keys()).filter(k => !k.startsWith('__') && k !== 'id');
|
|
36
|
+
const headers = excelHeaders || attrNames;
|
|
37
|
+
const result = [];
|
|
38
|
+
for (const row of rows) {
|
|
39
|
+
const attrs = newInstanceAttributes();
|
|
40
|
+
for (let i = 0; i < attrNames.length; i++) {
|
|
41
|
+
const attrName = attrNames[i];
|
|
42
|
+
const headerKey = (_a = headers[i]) !== null && _a !== void 0 ? _a : attrName;
|
|
43
|
+
const val = row[headerKey];
|
|
44
|
+
attrs.set(attrName, val === '' || val === null || val === undefined ? null : val);
|
|
45
|
+
}
|
|
46
|
+
const id = (_b = row.id) !== null && _b !== void 0 ? _b : `${filePath}|${targetSheet}|${Date.now()}-${Math.random()}`;
|
|
47
|
+
attrs.set('id', id);
|
|
48
|
+
result.push(makeInstance(inst.moduleName, inst.name, attrs));
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
export async function createSheetRow(_resolver, inst) {
|
|
53
|
+
var _a, _b;
|
|
54
|
+
const meta = (_a = inst.record) === null || _a === void 0 ? void 0 : _a.meta;
|
|
55
|
+
if (!meta) {
|
|
56
|
+
throw new Error('Meta with excel_path and sheet_name is required');
|
|
57
|
+
}
|
|
58
|
+
const filePath = meta.get('excel_path');
|
|
59
|
+
if (!filePath) {
|
|
60
|
+
throw new Error('excel_path is required in meta');
|
|
61
|
+
}
|
|
62
|
+
if (isUrl(filePath)) {
|
|
63
|
+
throw new Error('createSheetRow requires a local file path; URLs are read-only');
|
|
64
|
+
}
|
|
65
|
+
const XLSXModule = await import('xlsx');
|
|
66
|
+
const XLSX = XLSXModule.default || XLSXModule;
|
|
67
|
+
const workbook = XLSX.readFile(filePath);
|
|
68
|
+
const sheetName = meta.get('sheet_name') || workbook.SheetNames[0];
|
|
69
|
+
const ws = workbook.Sheets[sheetName];
|
|
70
|
+
if (!ws) {
|
|
71
|
+
throw new Error(`Sheet not found: ${sheetName}`);
|
|
72
|
+
}
|
|
73
|
+
const headerRows = XLSX.utils.sheet_to_json(ws, { header: 1 });
|
|
74
|
+
const headers = (headerRows[0] || []);
|
|
75
|
+
const row = {};
|
|
76
|
+
inst.attributes.forEach((value, key) => {
|
|
77
|
+
if (!key.startsWith('__')) {
|
|
78
|
+
row[key] = value != null ? String(value) : '';
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
XLSX.utils.sheet_add_json(ws, [row], {
|
|
82
|
+
skipHeader: true,
|
|
83
|
+
header: headers.length ? headers : Object.keys(row),
|
|
84
|
+
origin: -1,
|
|
85
|
+
});
|
|
86
|
+
XLSX.writeFile(workbook, filePath);
|
|
87
|
+
const created = newInstanceAttributes();
|
|
88
|
+
inst.attributes.forEach((v, k) => {
|
|
89
|
+
if (!k.startsWith('__'))
|
|
90
|
+
created.set(k, v);
|
|
91
|
+
});
|
|
92
|
+
const id = (_b = inst.attributes.get('id')) !== null && _b !== void 0 ? _b : `${filePath}|${sheetName}|${Date.now()}`;
|
|
93
|
+
created.set('id', id);
|
|
94
|
+
return makeInstance(inst.moduleName, inst.name, created);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=excel-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excel-resolver.js","sourceRoot":"","sources":["../../src/runtime/excel-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type ExcelConfigEntry = {
|
|
2
|
+
url: string;
|
|
3
|
+
sheet?: string;
|
|
4
|
+
entityName?: string;
|
|
5
|
+
};
|
|
6
|
+
export type CreateEntityFromExcelResult = {
|
|
7
|
+
entityName: string;
|
|
8
|
+
moduleName: string;
|
|
9
|
+
fqName: string;
|
|
10
|
+
headers: string[];
|
|
11
|
+
sheetName: string;
|
|
12
|
+
filePath: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Create an entity and file resolver from an Excel file at the given path.
|
|
16
|
+
* Used by config (processExcelConfig) and by the /assetUpload HTTP endpoint.
|
|
17
|
+
* @param moduleName - Target module for the entity. If omitted, uses Excel module.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createEntityFromExcelFile(filePath: string, options?: {
|
|
20
|
+
entityName?: string;
|
|
21
|
+
sheetName?: string;
|
|
22
|
+
moduleName?: string;
|
|
23
|
+
}): Promise<CreateEntityFromExcelResult>;
|
|
24
|
+
export declare function processExcelConfig(entries: ExcelConfigEntry[], basePath: string): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=excel.d.ts.map
|