@chozzz/vargos 2.0.4 → 2.0.6
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/dist/lib/async-handlers.d.ts +13 -0
- package/dist/lib/async-handlers.d.ts.map +1 -0
- package/dist/lib/async-handlers.js +6 -0
- package/dist/lib/async-handlers.js.map +1 -0
- package/dist/lib/error-store.d.ts +19 -0
- package/dist/lib/error-store.d.ts.map +1 -0
- package/dist/lib/error-store.js +19 -0
- package/dist/lib/error-store.js.map +1 -0
- package/dist/lib/error.d.ts +11 -0
- package/dist/lib/error.d.ts.map +1 -0
- package/dist/lib/error.js +41 -0
- package/dist/lib/error.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +23 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +136 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/glob.d.ts +14 -0
- package/dist/lib/glob.d.ts.map +1 -0
- package/dist/lib/glob.js +22 -0
- package/dist/lib/glob.js.map +1 -0
- package/dist/lib/heartbeat.d.ts +23 -0
- package/dist/lib/heartbeat.d.ts.map +1 -0
- package/dist/lib/heartbeat.js +62 -0
- package/dist/lib/heartbeat.js.map +1 -0
- package/dist/lib/html.d.ts +8 -0
- package/dist/lib/html.d.ts.map +1 -0
- package/dist/lib/html.js +28 -0
- package/dist/lib/html.js.map +1 -0
- package/dist/lib/http-validate.d.ts +12 -0
- package/dist/lib/http-validate.d.ts.map +1 -0
- package/dist/lib/http-validate.js +11 -0
- package/dist/lib/http-validate.js.map +1 -0
- package/dist/lib/id.d.ts +3 -0
- package/dist/lib/id.d.ts.map +1 -0
- package/dist/lib/id.js +5 -0
- package/dist/lib/id.js.map +1 -0
- package/dist/lib/logger.d.ts +12 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +28 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/media-transcribe.d.ts +57 -0
- package/dist/lib/media-transcribe.d.ts.map +1 -0
- package/dist/lib/media-transcribe.js +98 -0
- package/dist/lib/media-transcribe.js.map +1 -0
- package/dist/lib/media.d.ts +7 -0
- package/dist/lib/media.d.ts.map +1 -0
- package/dist/lib/media.js +18 -0
- package/dist/lib/media.js.map +1 -0
- package/dist/lib/mime.d.ts +6 -0
- package/dist/lib/mime.d.ts.map +1 -0
- package/dist/lib/mime.js +71 -0
- package/dist/lib/mime.js.map +1 -0
- package/dist/lib/paginate.d.ts +3 -0
- package/dist/lib/paginate.d.ts.map +1 -0
- package/dist/lib/paginate.js +5 -0
- package/dist/lib/paginate.js.map +1 -0
- package/dist/lib/paths.d.ts +14 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +29 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/provider-loader.d.ts +10 -0
- package/dist/lib/provider-loader.d.ts.map +1 -0
- package/dist/lib/provider-loader.js +24 -0
- package/dist/lib/provider-loader.js.map +1 -0
- package/dist/lib/retry.d.ts +20 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +40 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/safe-async.d.ts +27 -0
- package/dist/lib/safe-async.d.ts.map +1 -0
- package/dist/lib/safe-async.js +38 -0
- package/dist/lib/safe-async.js.map +1 -0
- package/dist/lib/skills.d.ts +9 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +15 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/sleep.d.ts +6 -0
- package/dist/lib/sleep.d.ts.map +1 -0
- package/dist/lib/sleep.js +22 -0
- package/dist/lib/sleep.js.map +1 -0
- package/dist/lib/strip-markdown.d.ts +7 -0
- package/dist/lib/strip-markdown.d.ts.map +1 -0
- package/dist/lib/strip-markdown.js +32 -0
- package/dist/lib/strip-markdown.js.map +1 -0
- package/dist/lib/subagent.d.ts +14 -0
- package/dist/lib/subagent.d.ts.map +1 -0
- package/dist/lib/subagent.js +25 -0
- package/dist/lib/subagent.js.map +1 -0
- package/dist/lib/templates.d.ts +8 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +39 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/timeout.d.ts +6 -0
- package/dist/lib/timeout.d.ts.map +1 -0
- package/dist/lib/timeout.js +11 -0
- package/dist/lib/timeout.js.map +1 -0
- package/dist/lib/truncate.d.ts +11 -0
- package/dist/lib/truncate.d.ts.map +1 -0
- package/dist/lib/truncate.js +17 -0
- package/dist/lib/truncate.js.map +1 -0
- package/dist/lib/url-expand.d.ts +22 -0
- package/dist/lib/url-expand.d.ts.map +1 -0
- package/dist/lib/url-expand.js +74 -0
- package/dist/lib/url-expand.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip markdown formatting for plain-text channels (WhatsApp, Telegram).
|
|
3
|
+
* Preserves content, removes syntax characters.
|
|
4
|
+
*/
|
|
5
|
+
/** Remove markdown formatting, preserving readable plain text. */
|
|
6
|
+
export declare function stripMarkdown(text: string): string;
|
|
7
|
+
//# sourceMappingURL=strip-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strip-markdown.d.ts","sourceRoot":"","sources":["../../lib/strip-markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyBlD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip markdown formatting for plain-text channels (WhatsApp, Telegram).
|
|
3
|
+
* Preserves content, removes syntax characters.
|
|
4
|
+
*/
|
|
5
|
+
/** Remove markdown formatting, preserving readable plain text. */
|
|
6
|
+
export function stripMarkdown(text) {
|
|
7
|
+
return text
|
|
8
|
+
// Headers: "## Heading" → "Heading"
|
|
9
|
+
.replace(/^#{1,6}\s+/gm, '')
|
|
10
|
+
// Bold/italic: **text**, __text__, *text*, _text_
|
|
11
|
+
.replace(/(\*{1,3}|_{1,3})(.+?)\1/g, '$2')
|
|
12
|
+
// Strikethrough: ~~text~~
|
|
13
|
+
.replace(/~~(.+?)~~/g, '$1')
|
|
14
|
+
// Code blocks: ```lang\ncode\n``` → code (must come before inline code)
|
|
15
|
+
.replace(/```[\w]*\n?([\s\S]*?)```/g, '$1')
|
|
16
|
+
// Inline code: `code`
|
|
17
|
+
.replace(/`([^`]+)`/g, '$1')
|
|
18
|
+
// Links: [text](url) → text (url)
|
|
19
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ($2)')
|
|
20
|
+
// Images:  → alt
|
|
21
|
+
.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1')
|
|
22
|
+
// Horizontal rules
|
|
23
|
+
.replace(/^[-*_]{3,}\s*$/gm, '')
|
|
24
|
+
// Unordered list markers: "- item" or "* item" → "• item"
|
|
25
|
+
.replace(/^[\t ]*[-*+]\s+/gm, '• ')
|
|
26
|
+
// Blockquotes: "> text" → "text"
|
|
27
|
+
.replace(/^>\s?/gm, '')
|
|
28
|
+
// Collapse 3+ newlines to 2
|
|
29
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
30
|
+
.trim();
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=strip-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strip-markdown.js","sourceRoot":"","sources":["../../lib/strip-markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kEAAkE;AAClE,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;QACT,oCAAoC;SACnC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QAC5B,kDAAkD;SACjD,OAAO,CAAC,0BAA0B,EAAE,IAAI,CAAC;QAC1C,0BAA0B;SACzB,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;QAC5B,wEAAwE;SACvE,OAAO,CAAC,2BAA2B,EAAE,IAAI,CAAC;QAC3C,sBAAsB;SACrB,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;QAC5B,kCAAkC;SACjC,OAAO,CAAC,0BAA0B,EAAE,SAAS,CAAC;QAC/C,4BAA4B;SAC3B,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC;QACzC,mBAAmB;SAClB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAChC,0DAA0D;SACzD,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC;QACnC,iCAAiC;SAChC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACvB,4BAA4B;SAC3B,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure session key helpers — no domain dependencies.
|
|
3
|
+
*/
|
|
4
|
+
export declare function cronSessionKey(taskId: string): string;
|
|
5
|
+
export declare function webhookSessionKey(hookId: string): string;
|
|
6
|
+
export declare function parseSessionKey(key: string): {
|
|
7
|
+
type: string;
|
|
8
|
+
id: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function parseChannelTarget(target: string): {
|
|
11
|
+
channel: string;
|
|
12
|
+
userId: string;
|
|
13
|
+
} | null;
|
|
14
|
+
//# sourceMappingURL=subagent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../lib/subagent.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AASD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAGzE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG7F"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure session key helpers — no domain dependencies.
|
|
3
|
+
*/
|
|
4
|
+
export function cronSessionKey(taskId) {
|
|
5
|
+
return `cron:${taskId}:${new Date().toISOString().slice(0, 10)}`;
|
|
6
|
+
}
|
|
7
|
+
export function webhookSessionKey(hookId) {
|
|
8
|
+
return `webhook:${hookId}:${Date.now()}`;
|
|
9
|
+
}
|
|
10
|
+
/** Parse "type:id" format from a string, extracting first component. */
|
|
11
|
+
function parseTypeIdFormat(str) {
|
|
12
|
+
const sep = str.indexOf(':');
|
|
13
|
+
if (sep === -1)
|
|
14
|
+
return { type: str, id: '' };
|
|
15
|
+
return { type: str.slice(0, sep), id: str.slice(sep + 1) };
|
|
16
|
+
}
|
|
17
|
+
export function parseSessionKey(key) {
|
|
18
|
+
const root = key.split(':subagent')[0];
|
|
19
|
+
return parseTypeIdFormat(root);
|
|
20
|
+
}
|
|
21
|
+
export function parseChannelTarget(target) {
|
|
22
|
+
const { type: channel, id: userId } = parseTypeIdFormat(target);
|
|
23
|
+
return userId ? { channel, userId } : null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=subagent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../lib/subagent.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,QAAQ,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,WAAW,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED,wEAAwE;AACxE,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC7C,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Walk up from this module to locate `.templates/vargos/`. Works in both dev and dist layouts. */
|
|
2
|
+
export declare function findTemplatesRoot(): string | null;
|
|
3
|
+
/** Seed `dataDir` from `.templates/vargos/` — recursively copies any missing files. User edits are preserved; user deletes will be re-seeded on next boot. */
|
|
4
|
+
export declare function seedDataDir(dataDir: string, logger: {
|
|
5
|
+
info: (s: string) => void;
|
|
6
|
+
warn: (s: string) => void;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../lib/templates.ts"],"names":[],"mappings":"AAIA,mGAAmG;AACnG,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAQjD;AAqBD,8JAA8J;AAC9J,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAC/D,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { promises as fs, existsSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
/** Walk up from this module to locate `.templates/vargos/`. Works in both dev and dist layouts. */
|
|
5
|
+
export function findTemplatesRoot() {
|
|
6
|
+
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
while (dir !== path.dirname(dir)) {
|
|
8
|
+
const candidate = path.join(dir, '.templates', 'vargos');
|
|
9
|
+
if (existsSync(candidate))
|
|
10
|
+
return candidate;
|
|
11
|
+
dir = path.dirname(dir);
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
/** Walks both trees in parallel; copies only leaf files that don't exist on target. */
|
|
16
|
+
async function copyMissing(srcDir, destDir, logger) {
|
|
17
|
+
await fs.mkdir(destDir, { recursive: true });
|
|
18
|
+
for (const entry of await fs.readdir(srcDir, { withFileTypes: true })) {
|
|
19
|
+
const src = path.join(srcDir, entry.name);
|
|
20
|
+
const dest = path.join(destDir, entry.name);
|
|
21
|
+
if (entry.isDirectory()) {
|
|
22
|
+
await copyMissing(src, dest, logger);
|
|
23
|
+
}
|
|
24
|
+
else if (!existsSync(dest)) {
|
|
25
|
+
await fs.copyFile(src, dest);
|
|
26
|
+
logger.info(`seeded ${dest}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Seed `dataDir` from `.templates/vargos/` — recursively copies any missing files. User edits are preserved; user deletes will be re-seeded on next boot. */
|
|
31
|
+
export async function seedDataDir(dataDir, logger) {
|
|
32
|
+
const root = findTemplatesRoot();
|
|
33
|
+
if (!root) {
|
|
34
|
+
logger.warn('.templates/vargos not found — skipping seed');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
await copyMissing(root, dataDir, logger);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../lib/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,mGAAmG;AACnG,MAAM,UAAU,iBAAiB;IAC/B,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,OAAO,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uFAAuF;AACvF,KAAK,UAAU,WAAW,CACxB,MAAc,EACd,OAAe,EACf,MAAqC;IAErC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,MAAM,GAAG,GAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED,8JAA8J;AAC9J,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,MAAgE;IAEhE,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IACD,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute a promise with timeout protection.
|
|
3
|
+
* Rejects with an error if the promise doesn't complete within the specified time.
|
|
4
|
+
*/
|
|
5
|
+
export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message?: string): Promise<T>;
|
|
6
|
+
//# sourceMappingURL=timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../lib/timeout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAMnG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute a promise with timeout protection.
|
|
3
|
+
* Rejects with an error if the promise doesn't complete within the specified time.
|
|
4
|
+
*/
|
|
5
|
+
export function withTimeout(promise, timeoutMs, message) {
|
|
6
|
+
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
7
|
+
setTimeout(() => reject(new Error(message ?? `Timeout after ${timeoutMs}ms`)), timeoutMs);
|
|
8
|
+
});
|
|
9
|
+
return Promise.race([promise, timeoutPromise]);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../lib/timeout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAI,OAAmB,EAAE,SAAiB,EAAE,OAAgB;IACrF,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QAC7D,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,iBAAiB,SAAS,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Truncate large text content using head/tail strategy.
|
|
3
|
+
* Keeps 70% from start, 20% from end, with ellipsis indicator in middle.
|
|
4
|
+
*
|
|
5
|
+
* Useful for: log entries, large files, prompt sections, debug output.
|
|
6
|
+
*
|
|
7
|
+
* Example:
|
|
8
|
+
* truncate("very long text...", 100) → "start text...\n\n[...truncated...]\n\n...text"
|
|
9
|
+
*/
|
|
10
|
+
export declare function truncate(content: string, maxChars: number): string;
|
|
11
|
+
//# sourceMappingURL=truncate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../lib/truncate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOlE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Truncate large text content using head/tail strategy.
|
|
3
|
+
* Keeps 70% from start, 20% from end, with ellipsis indicator in middle.
|
|
4
|
+
*
|
|
5
|
+
* Useful for: log entries, large files, prompt sections, debug output.
|
|
6
|
+
*
|
|
7
|
+
* Example:
|
|
8
|
+
* truncate("very long text...", 100) → "start text...\n\n[...truncated...]\n\n...text"
|
|
9
|
+
*/
|
|
10
|
+
export function truncate(content, maxChars) {
|
|
11
|
+
if (content.length <= maxChars)
|
|
12
|
+
return content;
|
|
13
|
+
const headChars = Math.floor(maxChars * 0.7);
|
|
14
|
+
const tailChars = Math.floor(maxChars * 0.2);
|
|
15
|
+
return `${content.slice(0, headChars)}\n\n[...truncated...]\n\n${content.slice(-tailChars)}`;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=truncate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../lib/truncate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,QAAgB;IACxD,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAE7C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,4BAA4B,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL extraction and content fetching utilities.
|
|
3
|
+
* No domain imports — safe to use from any layer.
|
|
4
|
+
*/
|
|
5
|
+
/** Extract unique http/https URLs from text, up to maxUrls (default 3). */
|
|
6
|
+
export declare function extractUrls(text: string, maxUrls?: number): string[];
|
|
7
|
+
/** Return false for private/internal addresses, non-http schemes, or invalid URLs. */
|
|
8
|
+
export declare function isAllowedUrl(url: string): boolean;
|
|
9
|
+
export interface FetchedContent {
|
|
10
|
+
url: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
text: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetch URL, convert HTML to readable text, truncate to maxChars.
|
|
16
|
+
* Returns null on any error — never throws.
|
|
17
|
+
*/
|
|
18
|
+
export declare function fetchUrlContent(url: string, opts?: {
|
|
19
|
+
maxChars?: number;
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
}): Promise<FetchedContent | null>;
|
|
22
|
+
//# sourceMappingURL=url-expand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-expand.d.ts","sourceRoot":"","sources":["../../lib/url-expand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,MAAM,EAAE,CAgB/D;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYjD;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmChC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL extraction and content fetching utilities.
|
|
3
|
+
* No domain imports — safe to use from any layer.
|
|
4
|
+
*/
|
|
5
|
+
import { stripHtml } from './html.js';
|
|
6
|
+
const PRIVATE_HOSTNAME_RE = /^(localhost|127\.\d+\.\d+\.\d+|10\.\d+\.\d+\.\d+|172\.(1[6-9]|2\d|3[01])\.\d+\.\d+|192\.168\.\d+\.\d+|169\.254\.\d+\.\d+|\[::1\])$/i;
|
|
7
|
+
/** Extract unique http/https URLs from text, up to maxUrls (default 3). */
|
|
8
|
+
export function extractUrls(text, maxUrls = 3) {
|
|
9
|
+
const matches = text.match(/https?:\/\/[^\s<>[\]()]+/g) ?? [];
|
|
10
|
+
const seen = new Set();
|
|
11
|
+
const results = [];
|
|
12
|
+
for (const raw of matches) {
|
|
13
|
+
// Strip trailing punctuation that's almost never part of a URL
|
|
14
|
+
const url = raw.replace(/[.,;:!?]+$/, '');
|
|
15
|
+
if (!seen.has(url)) {
|
|
16
|
+
seen.add(url);
|
|
17
|
+
results.push(url);
|
|
18
|
+
if (results.length >= maxUrls)
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return results;
|
|
23
|
+
}
|
|
24
|
+
/** Return false for private/internal addresses, non-http schemes, or invalid URLs. */
|
|
25
|
+
export function isAllowedUrl(url) {
|
|
26
|
+
let parsed;
|
|
27
|
+
try {
|
|
28
|
+
parsed = new URL(url);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
|
|
34
|
+
return false;
|
|
35
|
+
const hostname = parsed.hostname;
|
|
36
|
+
return !PRIVATE_HOSTNAME_RE.test(hostname);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Fetch URL, convert HTML to readable text, truncate to maxChars.
|
|
40
|
+
* Returns null on any error — never throws.
|
|
41
|
+
*/
|
|
42
|
+
export async function fetchUrlContent(url, opts = {}) {
|
|
43
|
+
const { maxChars = 8000, timeoutMs = 5000 } = opts;
|
|
44
|
+
try {
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
47
|
+
let response;
|
|
48
|
+
try {
|
|
49
|
+
response = await fetch(url, { signal: controller.signal });
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
}
|
|
54
|
+
if (!response.ok)
|
|
55
|
+
return null;
|
|
56
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
57
|
+
const isHtml = contentType.includes('text/html');
|
|
58
|
+
const isText = contentType.includes('text/plain') || contentType.includes('text/markdown');
|
|
59
|
+
if (!isHtml && !isText)
|
|
60
|
+
return null;
|
|
61
|
+
const raw = await response.text();
|
|
62
|
+
if (isHtml) {
|
|
63
|
+
const titleMatch = raw.match(/<title[^>]*>([^<]*)<\/title>/i);
|
|
64
|
+
const title = titleMatch ? titleMatch[1].trim() : undefined;
|
|
65
|
+
const text = stripHtml(raw).slice(0, maxChars);
|
|
66
|
+
return { url, title, text };
|
|
67
|
+
}
|
|
68
|
+
return { url, text: raw.slice(0, maxChars) };
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=url-expand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-expand.js","sourceRoot":"","sources":["../../lib/url-expand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,mBAAmB,GAAG,qIAAqI,CAAC;AAElK,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAO,GAAG,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,+DAA+D;QAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO;gBAAE,MAAM;QACvC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE9E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,OAAkD,EAAE;IAEpD,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAE9D,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAE3F,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEpC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAElC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC/C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC9B,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chozzz/vargos",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.6",
|
|
4
4
|
"description": "Self-hosted agent OS with persistent memory, multi-channel presence, tools, scheduling, and sub-agent orchestration",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Vadi Taslim",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"dist/cli.d.ts",
|
|
29
29
|
"dist/cli.d.ts.map",
|
|
30
30
|
"dist/cli/",
|
|
31
|
+
"dist/lib/",
|
|
31
32
|
"dist/.templates/",
|
|
32
33
|
"README.md",
|
|
33
34
|
"LICENSE",
|