@symerian/symi 2.0.2 → 2.0.3
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/{accounts-tNElYrCH.js → accounts-CI6zQTJj.js} +14 -14
- package/dist/{accounts-qtxJ-6em.js → accounts-CJR8j_Kq.js} +1 -1
- package/dist/{accounts-CWktKM8a.js → accounts-ChTFYj8Q.js} +1 -1
- package/dist/{active-listener-C9r8ZB9m.js → active-listener-D6sXIjAg.js} +1 -1
- package/dist/{agent-scope-BxoUQqgM.js → agent-scope-Bw1Ed8W9.js} +3 -3
- package/dist/{audio-preflight-DL5FZnXU.js → audio-preflight-C1uyo4vM.js} +29 -29
- package/dist/{bindings-B7Ke6LJi.js → bindings-BU2hsBd9.js} +2 -2
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +53 -53
- package/dist/bundled/bootstrap-extra-files/handler.js +5 -5
- package/dist/bundled/command-logger/handler.js +1 -1
- package/dist/bundled/session-memory/handler.js +53 -53
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-activity-CsM_hJ_s.js → channel-activity-C9-gaquj.js} +1 -1
- package/dist/{chrome-DuXtddnV.js → chrome-CTMkDHCZ.js} +20 -20
- package/dist/{chunk-BW5f05BR.js → chunk-ClbN9Pqy.js} +1 -1
- package/dist/{command-format-BaxDnULz.js → command-format-UKHV-j0K.js} +1 -1
- package/dist/{commands-registry-CurvwtTw.js → commands-registry-D1zSleL6.js} +4 -4
- package/dist/{config-CwDeZVre.js → config-B4Di8ISR.js} +12 -12
- package/dist/{deliver-D7lL85xc.js → deliver-CtTfl32o.js} +20 -20
- package/dist/{diagnostic-CI0kRQkt.js → diagnostic-C3nsWaw3.js} +1 -1
- package/dist/{frontmatter-C_bv_0P8.js → frontmatter-DPlG6yha.js} +2 -2
- package/dist/{gemini-auth-DDojfpIT.js → gemini-auth-BBWa_f-c.js} +1 -1
- package/dist/{github-copilot-token-C_qUP7p5.js → github-copilot-token-DJqsJ2-r.js} +7 -7
- package/dist/{image-Bw9ZjAgJ.js → image-WVlJkWYO.js} +4 -4
- package/dist/{image-ops-CvJzsyvE.js → image-ops-S8-8dAhx.js} +1 -1
- package/dist/{ir-DccrnjsE.js → ir-CbFUkv_T.js} +4 -4
- package/dist/llm-slug-generator.js +53 -53
- package/dist/{local-roots-DMwIh5cS.js → local-roots-C7OCYACU.js} +5 -5
- package/dist/{login-B6HY_3uV.js → login-CLnFYUir.js} +7 -7
- package/dist/{login-qr-cno8SVBt.js → login-qr-N6iHqtov.js} +12 -12
- package/dist/{manager-BmXaGyON.js → manager-BSlYwG4Q.js} +13 -13
- package/dist/{manifest-registry-D0IQ3WuX.js → manifest-registry-CneMHk0N.js} +19 -19
- package/dist/{markdown-tables-iMQQZu4Q.js → markdown-tables-DSHvnTLx.js} +1 -1
- package/dist/{message-channel-Dz5lr5b0.js → message-channel-DbsRltF2.js} +1 -1
- package/dist/{model-auth-Cbvnb5vf.js → model-auth-B55liYhg.js} +9 -9
- package/dist/{outbound-DnUbG06K.js → outbound-Bc4wVSZG.js} +7 -7
- package/dist/{outbound-attachment-DjNDa3zn.js → outbound-attachment-Co2diKdP.js} +2 -2
- package/dist/{paths-DLyHUt31.js → paths-Cb87-LzP.js} +1 -1
- package/dist/{paths-Cce4PUkG.js → paths-CySxpNhH.js} +5 -5
- package/dist/{pi-auth-json-C7Sd8IAl.js → pi-auth-json-b4xaJSBk.js} +8 -8
- package/dist/{pi-embedded-helpers-CMPwkzmk.js → pi-embedded-helpers-CCMgxLVl.js} +52 -52
- package/dist/{pi-embedded-4Uw7vlcF.js → pi-embedded-vSF1ziRD.js} +162 -162
- package/dist/{plugins-DQYI3Fr-.js → plugins-C4C9637U.js} +9 -9
- package/dist/{pw-ai-DQ6HUvz0.js → pw-ai-DMa09vvy.js} +11 -11
- package/dist/{qmd-manager-QHUP-_em.js → qmd-manager-DdZh9PHs.js} +7 -7
- package/dist/{registry-CK4e9hn8.js → registry-DP24za6g.js} +17 -17
- package/dist/{replies-CdijMW_S.js → replies-CoV8InBa.js} +3 -3
- package/dist/{reply-prefix-XlyuyChD.js → reply-prefix-CtL0omgM.js} +1 -1
- package/dist/{resolve-route-CZ-1eqw0.js → resolve-route-BVikmvWO.js} +4 -4
- package/dist/{retry-Cly39XZB.js → retry-dGG-MbxL.js} +1 -1
- package/dist/{runner-Duym_W6W.js → runner-CseBozoP.js} +9 -9
- package/dist/{send-BtxXqho0.js → send-BK3EV4tO.js} +6 -6
- package/dist/{send-Iv1YQSmf.js → send-Bh5ssTkU.js} +18 -18
- package/dist/{send-CFMDO5ON.js → send-C00dpYCF.js} +6 -6
- package/dist/{send-OoNECFaf.js → send-DrUqe5-S.js} +7 -7
- package/dist/{send-D0qx7lbT.js → send-i0x7Ywhx.js} +10 -10
- package/dist/{session-wQ18mpJ_.js → session-BFFxC5wi.js} +8 -8
- package/dist/{skill-commands-CY3SUdWj.js → skill-commands-SDwv3aAY.js} +9 -9
- package/dist/{skills-BFekKL7i.js → skills-o5WVqM4V.js} +21 -21
- package/dist/{sqlite-DRbx2dhW.js → sqlite-6H6Zw1cs.js} +4 -4
- package/dist/{store-C0wvOkae.js → store-vVE6N2mH.js} +2 -2
- package/dist/{subsystem-Bs9YvKLa.js → subsystem-DgpxyDQ_.js} +1 -1
- package/dist/{tables-DuZspiBu.js → tables-BIWsCKXJ.js} +1 -1
- package/dist/{target-errors-Be1SwYlW.js → target-errors-DyItGyW9.js} +2 -2
- package/dist/{thinking-CdlENGRW.js → thinking-Ni0HF-w6.js} +5 -5
- package/dist/{tokens-H1H1LiSQ.js → tokens-c_SLAkVb.js} +1 -1
- package/dist/{tool-images-DXB7tqWi.js → tool-images-DBCfXdli.js} +2 -2
- package/dist/{tool-loop-detection-Cs8_HCsx.js → tool-loop-detection-Bbc9OPFR.js} +3 -3
- package/dist/{web-B-ZZCPiM.js → web-95LpH1_H.js} +57 -57
- package/dist/{whatsapp-actions-Bc0X_rVM.js → whatsapp-actions-On9mu-j8.js} +23 -23
- package/dist/{workspace-wAaHI8-5.js → workspace-CbvamIU6.js} +6 -6
- package/docs/reference/templates/AGENTS.md +12 -0
- package/docs/reference/templates/SYMICORE.md +2 -0
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { f as DEFAULT_ACCOUNT_ID, p as normalizeAccountId } from "./session-key-BCzIW1Y2.js";
|
|
2
|
-
import { M as normalizeE164, a as normalizeAnyChannelId, l as requireActivePluginRegistry, n as CHAT_CHANNEL_ORDER } from "./registry-
|
|
3
|
-
import { m as createAccountListHelpers } from "./accounts-
|
|
2
|
+
import { M as normalizeE164, a as normalizeAnyChannelId, l as requireActivePluginRegistry, n as CHAT_CHANNEL_ORDER } from "./registry-DP24za6g.js";
|
|
3
|
+
import { m as createAccountListHelpers } from "./accounts-CI6zQTJj.js";
|
|
4
4
|
import { t as normalizeChatType } from "./chat-type-C_KiWNAH.js";
|
|
5
|
-
import { r as isTruthyEnvValue } from "./command-format-
|
|
6
|
-
import { n as listBoundAccountIds, r as resolveDefaultAgentBoundAccountId } from "./bindings-
|
|
7
|
-
import
|
|
5
|
+
import { r as isTruthyEnvValue } from "./command-format-UKHV-j0K.js";
|
|
6
|
+
import { n as listBoundAccountIds, r as resolveDefaultAgentBoundAccountId } from "./bindings-BU2hsBd9.js";
|
|
7
|
+
import fsSync from "node:fs";
|
|
8
8
|
|
|
9
9
|
//#region src/channels/plugins/account-action-gate.ts
|
|
10
10
|
function createAccountActionGate(params) {
|
|
@@ -186,7 +186,7 @@ function resolveTelegramToken(cfg, opts = {}) {
|
|
|
186
186
|
const accountCfg = resolveAccountCfg(accountId !== DEFAULT_ACCOUNT_ID ? accountId : DEFAULT_ACCOUNT_ID);
|
|
187
187
|
const accountTokenFile = accountCfg?.tokenFile?.trim();
|
|
188
188
|
if (accountTokenFile) {
|
|
189
|
-
if (!
|
|
189
|
+
if (!fsSync.existsSync(accountTokenFile)) {
|
|
190
190
|
opts.logMissingFile?.(`channels.telegram.accounts.${accountId}.tokenFile not found: ${accountTokenFile}`);
|
|
191
191
|
return {
|
|
192
192
|
token: "",
|
|
@@ -194,7 +194,7 @@ function resolveTelegramToken(cfg, opts = {}) {
|
|
|
194
194
|
};
|
|
195
195
|
}
|
|
196
196
|
try {
|
|
197
|
-
const token =
|
|
197
|
+
const token = fsSync.readFileSync(accountTokenFile, "utf-8").trim();
|
|
198
198
|
if (token) return {
|
|
199
199
|
token,
|
|
200
200
|
source: "tokenFile"
|
|
@@ -219,7 +219,7 @@ function resolveTelegramToken(cfg, opts = {}) {
|
|
|
219
219
|
const allowEnv = accountId === DEFAULT_ACCOUNT_ID;
|
|
220
220
|
const tokenFile = telegramCfg?.tokenFile?.trim();
|
|
221
221
|
if (tokenFile && allowEnv) {
|
|
222
|
-
if (!
|
|
222
|
+
if (!fsSync.existsSync(tokenFile)) {
|
|
223
223
|
opts.logMissingFile?.(`channels.telegram.tokenFile not found: ${tokenFile}`);
|
|
224
224
|
return {
|
|
225
225
|
token: "",
|
|
@@ -227,7 +227,7 @@ function resolveTelegramToken(cfg, opts = {}) {
|
|
|
227
227
|
};
|
|
228
228
|
}
|
|
229
229
|
try {
|
|
230
|
-
const token =
|
|
230
|
+
const token = fsSync.readFileSync(tokenFile, "utf-8").trim();
|
|
231
231
|
if (token) return {
|
|
232
232
|
token,
|
|
233
233
|
source: "tokenFile"
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import "./paths-
|
|
2
|
-
import { dt as resolvePreferredSymiTmpDir } from "./registry-
|
|
3
|
-
import "./agent-scope-
|
|
4
|
-
import "./subsystem-
|
|
5
|
-
import "./workspace-
|
|
1
|
+
import "./paths-CySxpNhH.js";
|
|
2
|
+
import { dt as resolvePreferredSymiTmpDir } from "./registry-DP24za6g.js";
|
|
3
|
+
import "./agent-scope-Bw1Ed8W9.js";
|
|
4
|
+
import "./subsystem-DgpxyDQ_.js";
|
|
5
|
+
import "./workspace-CbvamIU6.js";
|
|
6
6
|
import "./boolean-B8-BqKGQ.js";
|
|
7
|
-
import { t as formatCliCommand } from "./command-format-
|
|
8
|
-
import "./model-auth-
|
|
9
|
-
import "./github-copilot-token-
|
|
10
|
-
import "./config-
|
|
11
|
-
import "./manifest-registry-
|
|
12
|
-
import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-
|
|
7
|
+
import { t as formatCliCommand } from "./command-format-UKHV-j0K.js";
|
|
8
|
+
import "./model-auth-B55liYhg.js";
|
|
9
|
+
import "./github-copilot-token-DJqsJ2-r.js";
|
|
10
|
+
import "./config-B4Di8ISR.js";
|
|
11
|
+
import "./manifest-registry-CneMHk0N.js";
|
|
12
|
+
import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-CTMkDHCZ.js";
|
|
13
13
|
import "./redact-jSxx6Ep2.js";
|
|
14
14
|
import { n as formatErrorMessage } from "./errors-BoQgnc8X.js";
|
|
15
15
|
import "./ssrf-BTMDZjHT.js";
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { s as resolveStateDir } from "./paths-
|
|
1
|
+
import { s as resolveStateDir } from "./paths-CySxpNhH.js";
|
|
2
2
|
import { y as parseAgentSessionKey } from "./session-key-BCzIW1Y2.js";
|
|
3
|
-
import "./registry-
|
|
4
|
-
import { s as resolveAgentWorkspaceDir } from "./agent-scope-
|
|
5
|
-
import { t as createSubsystemLogger } from "./subsystem-
|
|
6
|
-
import "./workspace-
|
|
3
|
+
import "./registry-DP24za6g.js";
|
|
4
|
+
import { s as resolveAgentWorkspaceDir } from "./agent-scope-Bw1Ed8W9.js";
|
|
5
|
+
import { t as createSubsystemLogger } from "./subsystem-DgpxyDQ_.js";
|
|
6
|
+
import "./workspace-CbvamIU6.js";
|
|
7
7
|
import "./redact-jSxx6Ep2.js";
|
|
8
|
-
import "./paths-
|
|
9
|
-
import { _ as isFileMissingError, n as buildSessionEntry, r as listSessionFilesForAgent, t as requireNodeSqlite, v as statRegularFile } from "./sqlite-
|
|
8
|
+
import "./paths-Cb87-LzP.js";
|
|
9
|
+
import { _ as isFileMissingError, n as buildSessionEntry, r as listSessionFilesForAgent, t as requireNodeSqlite, v as statRegularFile } from "./sqlite-6H6Zw1cs.js";
|
|
10
10
|
import fs from "node:fs/promises";
|
|
11
11
|
import os from "node:os";
|
|
12
12
|
import path from "node:path";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as resolveOAuthDir, c as expandHomePrefix, l as resolveEffectiveHomeDir, n as resolveConfigPath, u as resolveRequiredHomeDir } from "./paths-
|
|
1
|
+
import { a as resolveOAuthDir, c as expandHomePrefix, l as resolveEffectiveHomeDir, n as resolveConfigPath, u as resolveRequiredHomeDir } from "./paths-CySxpNhH.js";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import
|
|
4
|
+
import fsSync from "node:fs";
|
|
5
5
|
import { Logger } from "tslog";
|
|
6
6
|
import JSON5 from "json5";
|
|
7
7
|
import chalk, { Chalk } from "chalk";
|
|
@@ -12,9 +12,9 @@ function isNodeErrorWithCode(err, code) {
|
|
|
12
12
|
return typeof err === "object" && err !== null && "code" in err && err.code === code;
|
|
13
13
|
}
|
|
14
14
|
function resolvePreferredSymiTmpDir(options = {}) {
|
|
15
|
-
const accessSync = options.accessSync ??
|
|
16
|
-
const lstatSync = options.lstatSync ??
|
|
17
|
-
const mkdirSync = options.mkdirSync ??
|
|
15
|
+
const accessSync = options.accessSync ?? fsSync.accessSync;
|
|
16
|
+
const lstatSync = options.lstatSync ?? fsSync.lstatSync;
|
|
17
|
+
const mkdirSync = options.mkdirSync ?? fsSync.mkdirSync;
|
|
18
18
|
const getuid = options.getuid ?? (() => {
|
|
19
19
|
try {
|
|
20
20
|
return typeof process.getuid === "function" ? process.getuid() : void 0;
|
|
@@ -38,14 +38,14 @@ function resolvePreferredSymiTmpDir(options = {}) {
|
|
|
38
38
|
try {
|
|
39
39
|
const preferred = lstatSync(POSIX_SYMI_TMP_DIR);
|
|
40
40
|
if (!preferred.isDirectory() || preferred.isSymbolicLink()) return fallback();
|
|
41
|
-
accessSync(POSIX_SYMI_TMP_DIR,
|
|
41
|
+
accessSync(POSIX_SYMI_TMP_DIR, fsSync.constants.W_OK | fsSync.constants.X_OK);
|
|
42
42
|
if (!isSecureDirForUser(preferred)) return fallback();
|
|
43
43
|
return POSIX_SYMI_TMP_DIR;
|
|
44
44
|
} catch (err) {
|
|
45
45
|
if (!isNodeErrorWithCode(err, "ENOENT")) return fallback();
|
|
46
46
|
}
|
|
47
47
|
try {
|
|
48
|
-
accessSync("/tmp",
|
|
48
|
+
accessSync("/tmp", fsSync.constants.W_OK | fsSync.constants.X_OK);
|
|
49
49
|
mkdirSync(POSIX_SYMI_TMP_DIR, {
|
|
50
50
|
recursive: true,
|
|
51
51
|
mode: 448
|
|
@@ -68,8 +68,8 @@ function resolvePreferredSymiTmpDir(options = {}) {
|
|
|
68
68
|
function readLoggingConfig() {
|
|
69
69
|
const configPath = resolveConfigPath();
|
|
70
70
|
try {
|
|
71
|
-
if (!
|
|
72
|
-
const raw =
|
|
71
|
+
if (!fsSync.existsSync(configPath)) return;
|
|
72
|
+
const raw = fsSync.readFileSync(configPath, "utf-8");
|
|
73
73
|
const logging = JSON5.parse(raw)?.logging;
|
|
74
74
|
if (!logging || typeof logging !== "object" || Array.isArray(logging)) return;
|
|
75
75
|
return logging;
|
|
@@ -172,7 +172,7 @@ function isFileLogLevelEnabled(level) {
|
|
|
172
172
|
return levelToMinLevel(level) <= levelToMinLevel(settings.level);
|
|
173
173
|
}
|
|
174
174
|
function buildLogger(settings) {
|
|
175
|
-
|
|
175
|
+
fsSync.mkdirSync(path.dirname(settings.file), { recursive: true });
|
|
176
176
|
if (isRollingPath(settings.file)) pruneOldRollingLogs(path.dirname(settings.file));
|
|
177
177
|
const logger = new Logger({
|
|
178
178
|
name: "symi",
|
|
@@ -186,7 +186,7 @@ function buildLogger(settings) {
|
|
|
186
186
|
...logObj,
|
|
187
187
|
time
|
|
188
188
|
});
|
|
189
|
-
|
|
189
|
+
fsSync.appendFileSync(settings.file, `${line}\n`, { encoding: "utf8" });
|
|
190
190
|
} catch {}
|
|
191
191
|
});
|
|
192
192
|
for (const transport of externalTransports) attachExternalTransport(logger, transport);
|
|
@@ -238,14 +238,14 @@ function isRollingPath(file) {
|
|
|
238
238
|
}
|
|
239
239
|
function pruneOldRollingLogs(dir) {
|
|
240
240
|
try {
|
|
241
|
-
const entries =
|
|
241
|
+
const entries = fsSync.readdirSync(dir, { withFileTypes: true });
|
|
242
242
|
const cutoff = Date.now() - MAX_LOG_AGE_MS;
|
|
243
243
|
for (const entry of entries) {
|
|
244
244
|
if (!entry.isFile()) continue;
|
|
245
245
|
if (!entry.name.startsWith(`${LOG_PREFIX}-`) || !entry.name.endsWith(LOG_SUFFIX)) continue;
|
|
246
246
|
const fullPath = path.join(dir, entry.name);
|
|
247
247
|
try {
|
|
248
|
-
if (
|
|
248
|
+
if (fsSync.statSync(fullPath).mtimeMs < cutoff) fsSync.rmSync(fullPath, { force: true });
|
|
249
249
|
} catch {}
|
|
250
250
|
}
|
|
251
251
|
} catch {}
|
|
@@ -326,14 +326,14 @@ function isPlainObject(value) {
|
|
|
326
326
|
//#endregion
|
|
327
327
|
//#region src/utils.ts
|
|
328
328
|
async function ensureDir(dir) {
|
|
329
|
-
await
|
|
329
|
+
await fsSync.promises.mkdir(dir, { recursive: true });
|
|
330
330
|
}
|
|
331
331
|
/**
|
|
332
332
|
* Check if a file or directory exists at the given path.
|
|
333
333
|
*/
|
|
334
334
|
async function pathExists(targetPath) {
|
|
335
335
|
try {
|
|
336
|
-
await
|
|
336
|
+
await fsSync.promises.access(targetPath);
|
|
337
337
|
return true;
|
|
338
338
|
} catch {
|
|
339
339
|
return false;
|
|
@@ -416,7 +416,7 @@ function readLidReverseMapping(lid, opts) {
|
|
|
416
416
|
for (const dir of mappingDirs) {
|
|
417
417
|
const mappingPath = path.join(dir, mappingFilename);
|
|
418
418
|
try {
|
|
419
|
-
const data =
|
|
419
|
+
const data = fsSync.readFileSync(mappingPath, "utf8");
|
|
420
420
|
const phone = JSON.parse(data);
|
|
421
421
|
if (phone === null || phone === void 0) continue;
|
|
422
422
|
return normalizeE164(String(phone));
|
|
@@ -500,7 +500,7 @@ function resolveConfigDir(env = process.env, homedir = os.homedir) {
|
|
|
500
500
|
if (override) return resolveUserPath(override);
|
|
501
501
|
const newDir = path.join(resolveRequiredHomeDir(env, homedir), ".symi");
|
|
502
502
|
try {
|
|
503
|
-
if (
|
|
503
|
+
if (fsSync.existsSync(newDir)) return newDir;
|
|
504
504
|
} catch {}
|
|
505
505
|
return newDir;
|
|
506
506
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-
|
|
3
|
-
import { r as markdownToSlackMrkdwnChunks, t as sendMessageSlack } from "./send-
|
|
4
|
-
import { i as chunkMarkdownTextWithMode } from "./chunk-
|
|
2
|
+
import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-c_SLAkVb.js";
|
|
3
|
+
import { r as markdownToSlackMrkdwnChunks, t as sendMessageSlack } from "./send-BK3EV4tO.js";
|
|
4
|
+
import { i as chunkMarkdownTextWithMode } from "./chunk-ClbN9Pqy.js";
|
|
5
5
|
|
|
6
6
|
//#region src/auto-reply/reply/reply-reference.ts
|
|
7
7
|
function createReplyReferencePlanner(options) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { n as resolveAgentConfig } from "./agent-scope-
|
|
2
|
+
import { n as resolveAgentConfig } from "./agent-scope-Bw1Ed8W9.js";
|
|
3
3
|
|
|
4
4
|
//#region src/agents/identity.ts
|
|
5
5
|
const DEFAULT_ACK_REACTION = "👀";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
2
|
import { d as sanitizeAgentId, f as DEFAULT_ACCOUNT_ID, i as buildAgentPeerSessionKey, n as DEFAULT_MAIN_KEY, p as normalizeAccountId, r as buildAgentMainSessionKey, s as normalizeAgentId, t as DEFAULT_AGENT_ID } from "./session-key-BCzIW1Y2.js";
|
|
3
|
-
import { Z as shouldLogVerbose } from "./registry-
|
|
4
|
-
import { c as resolveDefaultAgentId } from "./agent-scope-
|
|
5
|
-
import { y as logDebug } from "./workspace-
|
|
3
|
+
import { Z as shouldLogVerbose } from "./registry-DP24za6g.js";
|
|
4
|
+
import { c as resolveDefaultAgentId } from "./agent-scope-Bw1Ed8W9.js";
|
|
5
|
+
import { y as logDebug } from "./workspace-CbvamIU6.js";
|
|
6
6
|
import { t as normalizeChatType } from "./chat-type-C_KiWNAH.js";
|
|
7
|
-
import { t as listBindings } from "./bindings-
|
|
7
|
+
import { t as listBindings } from "./bindings-BU2hsBd9.js";
|
|
8
8
|
|
|
9
9
|
//#region src/routing/resolve-route.ts
|
|
10
10
|
var resolve_route_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { J as logVerbose, Z as shouldLogVerbose } from "./registry-
|
|
2
|
-
import { _ as runExec } from "./workspace-
|
|
1
|
+
import { J as logVerbose, Z as shouldLogVerbose } from "./registry-DP24za6g.js";
|
|
2
|
+
import { _ as runExec } from "./workspace-CbvamIU6.js";
|
|
3
3
|
import { t as normalizeChatType } from "./chat-type-C_KiWNAH.js";
|
|
4
|
-
import { _ as kindFromMime, d as detectMime, h as isAudioFileName, p as getFileExtension } from "./image-ops-
|
|
5
|
-
import { A as normalizeProviderId, L as normalizeGoogleModelId, i as resolveApiKeyForProvider, r as requireApiKey, y as resolveSymiAgentDir } from "./model-auth-
|
|
6
|
-
import { d as DEFAULT_IMESSAGE_ATTACHMENT_ROOTS, f as isInboundPathAllowed, m as resolveIMessageAttachmentRoots, n as loadConfig, p as mergeInboundPathRoots } from "./config-
|
|
7
|
-
import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-
|
|
8
|
-
import { n as collectProviderApiKeysForExecution, r as executeWithApiKeyRotation, t as parseGeminiAuth } from "./gemini-auth-
|
|
4
|
+
import { _ as kindFromMime, d as detectMime, h as isAudioFileName, p as getFileExtension } from "./image-ops-S8-8dAhx.js";
|
|
5
|
+
import { A as normalizeProviderId, L as normalizeGoogleModelId, i as resolveApiKeyForProvider, r as requireApiKey, y as resolveSymiAgentDir } from "./model-auth-B55liYhg.js";
|
|
6
|
+
import { d as DEFAULT_IMESSAGE_ATTACHMENT_ROOTS, f as isInboundPathAllowed, m as resolveIMessageAttachmentRoots, n as loadConfig, p as mergeInboundPathRoots } from "./config-B4Di8ISR.js";
|
|
7
|
+
import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-WVlJkWYO.js";
|
|
8
|
+
import { n as collectProviderApiKeysForExecution, r as executeWithApiKeyRotation, t as parseGeminiAuth } from "./gemini-auth-BBWa_f-c.js";
|
|
9
9
|
import { n as fetchWithTimeout } from "./fetch-timeout-DL3f_O53.js";
|
|
10
|
-
import { i as fetchRemoteMedia, n as getDefaultMediaLocalRoots, o as fetchWithSsrFGuard, r as MediaFetchError } from "./local-roots-
|
|
10
|
+
import { i as fetchRemoteMedia, n as getDefaultMediaLocalRoots, o as fetchWithSsrFGuard, r as MediaFetchError } from "./local-roots-C7OCYACU.js";
|
|
11
11
|
import fs from "node:fs/promises";
|
|
12
12
|
import os from "node:os";
|
|
13
13
|
import path from "node:path";
|
|
@@ -882,7 +882,7 @@ async function loadModelCatalog(params) {
|
|
|
882
882
|
});
|
|
883
883
|
try {
|
|
884
884
|
await ensureSymiModelsJson(params?.config ?? loadConfig());
|
|
885
|
-
await (await import("./pi-auth-json-
|
|
885
|
+
await (await import("./pi-auth-json-b4xaJSBk.js")).ensurePiAuthJsonFromAuthProfiles(resolveSymiAgentDir());
|
|
886
886
|
const piSdk = await importPiSdk();
|
|
887
887
|
const agentDir = resolveSymiAgentDir();
|
|
888
888
|
const { join } = await import("node:path");
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { J as logVerbose } from "./registry-
|
|
3
|
-
import { d as resolveSlackAccount, m as resolveSlackBotToken } from "./plugins-
|
|
2
|
+
import { J as logVerbose } from "./registry-DP24za6g.js";
|
|
3
|
+
import { d as resolveSlackAccount, m as resolveSlackBotToken } from "./plugins-C4C9637U.js";
|
|
4
4
|
import { a as requireTargetKind, i as parseTargetPrefixes, n as ensureTargetId, r as parseTargetMention, t as buildMessagingTarget } from "./targets-CFovdgJI.js";
|
|
5
|
-
import { n as loadConfig } from "./config-
|
|
6
|
-
import { c as resolveChunkMode, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit } from "./chunk-
|
|
7
|
-
import { n as resolveMarkdownTableMode } from "./markdown-tables-
|
|
8
|
-
import { a as loadWebMedia, n as markdownToIR, t as chunkMarkdownIR } from "./ir-
|
|
5
|
+
import { n as loadConfig } from "./config-B4Di8ISR.js";
|
|
6
|
+
import { c as resolveChunkMode, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit } from "./chunk-ClbN9Pqy.js";
|
|
7
|
+
import { n as resolveMarkdownTableMode } from "./markdown-tables-DSHvnTLx.js";
|
|
8
|
+
import { a as loadWebMedia, n as markdownToIR, t as chunkMarkdownIR } from "./ir-CbFUkv_T.js";
|
|
9
9
|
import { t as renderMarkdownWithMarkers } from "./render-CDCvpfhh.js";
|
|
10
10
|
import { WebClient } from "@slack/web-api";
|
|
11
11
|
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { a as resolveOAuthDir, s as resolveStateDir, u as resolveRequiredHomeDir } from "./paths-
|
|
3
|
-
import { G as danger, J as logVerbose, L as safeParseJson } from "./registry-
|
|
4
|
-
import { t as createSubsystemLogger } from "./subsystem-
|
|
5
|
-
import { l as resolveTelegramAccount, n as listChannelPlugins, t as getChannelPlugin } from "./plugins-
|
|
6
|
-
import { r as isTruthyEnvValue } from "./command-format-
|
|
7
|
-
import { g as isGifMedia, p as getFileExtension, v as normalizeMimeType, x as mediaKindFromMime } from "./image-ops-
|
|
8
|
-
import { b as withFileLock$1 } from "./model-auth-
|
|
9
|
-
import { n as loadConfig } from "./config-
|
|
2
|
+
import { a as resolveOAuthDir, s as resolveStateDir, u as resolveRequiredHomeDir } from "./paths-CySxpNhH.js";
|
|
3
|
+
import { G as danger, J as logVerbose, L as safeParseJson } from "./registry-DP24za6g.js";
|
|
4
|
+
import { t as createSubsystemLogger } from "./subsystem-DgpxyDQ_.js";
|
|
5
|
+
import { l as resolveTelegramAccount, n as listChannelPlugins, t as getChannelPlugin } from "./plugins-C4C9637U.js";
|
|
6
|
+
import { r as isTruthyEnvValue } from "./command-format-UKHV-j0K.js";
|
|
7
|
+
import { g as isGifMedia, p as getFileExtension, v as normalizeMimeType, x as mediaKindFromMime } from "./image-ops-S8-8dAhx.js";
|
|
8
|
+
import { b as withFileLock$1 } from "./model-auth-B55liYhg.js";
|
|
9
|
+
import { n as loadConfig } from "./config-B4Di8ISR.js";
|
|
10
10
|
import { t as redactSensitiveText } from "./redact-jSxx6Ep2.js";
|
|
11
11
|
import { n as formatErrorMessage, r as formatUncaughtError, t as extractErrorCode } from "./errors-BoQgnc8X.js";
|
|
12
|
-
import { n as resolveMarkdownTableMode } from "./markdown-tables-
|
|
13
|
-
import { a as loadWebMedia, n as markdownToIR, t as chunkMarkdownIR } from "./ir-
|
|
12
|
+
import { n as resolveMarkdownTableMode } from "./markdown-tables-DSHvnTLx.js";
|
|
13
|
+
import { a as loadWebMedia, n as markdownToIR, t as chunkMarkdownIR } from "./ir-CbFUkv_T.js";
|
|
14
14
|
import { t as renderMarkdownWithMarkers } from "./render-CDCvpfhh.js";
|
|
15
15
|
import { t as resolveFetch } from "./fetch-Bso4i15F.js";
|
|
16
|
-
import { i as createTelegramRetryRunner, n as recordChannelActivity } from "./channel-activity-
|
|
16
|
+
import { i as createTelegramRetryRunner, n as recordChannelActivity } from "./channel-activity-C9-gaquj.js";
|
|
17
17
|
import { n as normalizePollInput } from "./polls-CCuCaqgv.js";
|
|
18
18
|
import { t as makeProxyFetch } from "./proxy-CBJ1upuz.js";
|
|
19
19
|
import os from "node:os";
|
|
20
20
|
import path from "node:path";
|
|
21
|
-
import
|
|
21
|
+
import fsSync from "node:fs";
|
|
22
22
|
import crypto from "node:crypto";
|
|
23
23
|
import process$1 from "node:process";
|
|
24
24
|
import * as net$1 from "node:net";
|
|
@@ -131,7 +131,7 @@ function getPairingAdapter(channelId) {
|
|
|
131
131
|
//#region src/plugin-sdk/json-store.ts
|
|
132
132
|
async function readJsonFileWithFallback(filePath, fallback) {
|
|
133
133
|
try {
|
|
134
|
-
const parsed = safeParseJson(await
|
|
134
|
+
const parsed = safeParseJson(await fsSync.promises.readFile(filePath, "utf-8"));
|
|
135
135
|
if (parsed == null) return {
|
|
136
136
|
value: fallback,
|
|
137
137
|
exists: true
|
|
@@ -153,14 +153,14 @@ async function readJsonFileWithFallback(filePath, fallback) {
|
|
|
153
153
|
}
|
|
154
154
|
async function writeJsonFileAtomically(filePath, value) {
|
|
155
155
|
const dir = path.dirname(filePath);
|
|
156
|
-
await
|
|
156
|
+
await fsSync.promises.mkdir(dir, {
|
|
157
157
|
recursive: true,
|
|
158
158
|
mode: 448
|
|
159
159
|
});
|
|
160
160
|
const tmp = path.join(dir, `${path.basename(filePath)}.${crypto.randomUUID()}.tmp`);
|
|
161
|
-
await
|
|
162
|
-
await
|
|
163
|
-
await
|
|
161
|
+
await fsSync.promises.writeFile(tmp, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf-8" });
|
|
162
|
+
await fsSync.promises.chmod(tmp, 384);
|
|
163
|
+
await fsSync.promises.rename(tmp, filePath);
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
//#endregion
|
|
@@ -221,7 +221,7 @@ async function readPairingRequests(filePath) {
|
|
|
221
221
|
}
|
|
222
222
|
async function ensureJsonFile(filePath, fallback) {
|
|
223
223
|
try {
|
|
224
|
-
await
|
|
224
|
+
await fsSync.promises.access(filePath);
|
|
225
225
|
} catch {
|
|
226
226
|
await writeJsonFile(filePath, fallback);
|
|
227
227
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { n as resolveSignalAccount } from "./accounts-
|
|
3
|
-
import { x as mediaKindFromMime } from "./image-ops-
|
|
4
|
-
import { n as loadConfig } from "./config-
|
|
5
|
-
import { n as resolveMarkdownTableMode } from "./markdown-tables-
|
|
2
|
+
import { n as resolveSignalAccount } from "./accounts-ChTFYj8Q.js";
|
|
3
|
+
import { x as mediaKindFromMime } from "./image-ops-S8-8dAhx.js";
|
|
4
|
+
import { n as loadConfig } from "./config-B4Di8ISR.js";
|
|
5
|
+
import { n as resolveMarkdownTableMode } from "./markdown-tables-DSHvnTLx.js";
|
|
6
6
|
import { n as fetchWithTimeout } from "./fetch-timeout-DL3f_O53.js";
|
|
7
|
-
import { n as markdownToIR, t as chunkMarkdownIR } from "./ir-
|
|
7
|
+
import { n as markdownToIR, t as chunkMarkdownIR } from "./ir-CbFUkv_T.js";
|
|
8
8
|
import { t as resolveFetch } from "./fetch-Bso4i15F.js";
|
|
9
|
-
import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-
|
|
9
|
+
import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-Co2diKdP.js";
|
|
10
10
|
import { randomUUID } from "node:crypto";
|
|
11
11
|
|
|
12
12
|
//#region src/signal/format.ts
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { I as resolveUserPath, M as normalizeE164 } from "./registry-
|
|
3
|
-
import { x as mediaKindFromMime } from "./image-ops-
|
|
4
|
-
import { n as loadConfig } from "./config-
|
|
5
|
-
import { t as resolveIMessageAccount } from "./accounts-
|
|
6
|
-
import { n as resolveMarkdownTableMode } from "./markdown-tables-
|
|
7
|
-
import { t as convertMarkdownTables } from "./tables-
|
|
8
|
-
import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-
|
|
2
|
+
import { I as resolveUserPath, M as normalizeE164 } from "./registry-DP24za6g.js";
|
|
3
|
+
import { x as mediaKindFromMime } from "./image-ops-S8-8dAhx.js";
|
|
4
|
+
import { n as loadConfig } from "./config-B4Di8ISR.js";
|
|
5
|
+
import { t as resolveIMessageAccount } from "./accounts-CJR8j_Kq.js";
|
|
6
|
+
import { n as resolveMarkdownTableMode } from "./markdown-tables-DSHvnTLx.js";
|
|
7
|
+
import { t as convertMarkdownTables } from "./tables-BIWsCKXJ.js";
|
|
8
|
+
import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-Co2diKdP.js";
|
|
9
9
|
import { spawn } from "node:child_process";
|
|
10
10
|
import { createInterface } from "node:readline";
|
|
11
11
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { dt as resolvePreferredSymiTmpDir } from "./registry-
|
|
3
|
-
import { _ as resolveDiscordAccount, v as normalizeDiscordToken } from "./plugins-
|
|
2
|
+
import { dt as resolvePreferredSymiTmpDir } from "./registry-DP24za6g.js";
|
|
3
|
+
import { _ as resolveDiscordAccount, v as normalizeDiscordToken } from "./plugins-C4C9637U.js";
|
|
4
4
|
import { a as requireTargetKind, i as parseTargetPrefixes, n as ensureTargetId, r as parseTargetMention, t as buildMessagingTarget } from "./targets-CFovdgJI.js";
|
|
5
|
-
import { b as maxBytesForKind, f as extensionForMime } from "./image-ops-
|
|
6
|
-
import { n as loadConfig } from "./config-
|
|
7
|
-
import { n as retryAsync, t as resolveRetryConfig } from "./retry-
|
|
8
|
-
import { c as resolveChunkMode, i as chunkMarkdownTextWithMode } from "./chunk-
|
|
9
|
-
import { n as resolveMarkdownTableMode } from "./markdown-tables-
|
|
10
|
-
import { a as loadWebMedia, o as loadWebMediaRaw } from "./ir-
|
|
5
|
+
import { b as maxBytesForKind, f as extensionForMime } from "./image-ops-S8-8dAhx.js";
|
|
6
|
+
import { n as loadConfig } from "./config-B4Di8ISR.js";
|
|
7
|
+
import { n as retryAsync, t as resolveRetryConfig } from "./retry-dGG-MbxL.js";
|
|
8
|
+
import { c as resolveChunkMode, i as chunkMarkdownTextWithMode } from "./chunk-ClbN9Pqy.js";
|
|
9
|
+
import { n as resolveMarkdownTableMode } from "./markdown-tables-DSHvnTLx.js";
|
|
10
|
+
import { a as loadWebMedia, o as loadWebMediaRaw } from "./ir-CbFUkv_T.js";
|
|
11
11
|
import { t as resolveFetch } from "./fetch-Bso4i15F.js";
|
|
12
|
-
import { n as recordChannelActivity, r as createDiscordRetryRunner } from "./channel-activity-
|
|
12
|
+
import { n as recordChannelActivity, r as createDiscordRetryRunner } from "./channel-activity-C9-gaquj.js";
|
|
13
13
|
import { n as normalizePollInput, t as normalizePollDurationHours } from "./polls-CCuCaqgv.js";
|
|
14
|
-
import { t as convertMarkdownTables } from "./tables-
|
|
14
|
+
import { t as convertMarkdownTables } from "./tables-BIWsCKXJ.js";
|
|
15
15
|
import fs from "node:fs/promises";
|
|
16
16
|
import path from "node:path";
|
|
17
17
|
import { execFile } from "node:child_process";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { E as ensureDir, G as danger, I as resolveUserPath, Q as success, ot as toPinoLikeLogger, rt as getChildLogger } from "./registry-
|
|
2
|
-
import { c as readCredsJsonRaw, d as resolveWebCredsBackupPath, f as resolveWebCredsPath, o as maybeRestoreCredsFromBackup, u as resolveDefaultWebAuthDir } from "./accounts-
|
|
3
|
-
import { t as formatCliCommand } from "./command-format-
|
|
4
|
-
import { A as VERSION } from "./config-
|
|
5
|
-
import
|
|
1
|
+
import { E as ensureDir, G as danger, I as resolveUserPath, Q as success, ot as toPinoLikeLogger, rt as getChildLogger } from "./registry-DP24za6g.js";
|
|
2
|
+
import { c as readCredsJsonRaw, d as resolveWebCredsBackupPath, f as resolveWebCredsPath, o as maybeRestoreCredsFromBackup, u as resolveDefaultWebAuthDir } from "./accounts-CI6zQTJj.js";
|
|
3
|
+
import { t as formatCliCommand } from "./command-format-UKHV-j0K.js";
|
|
4
|
+
import { A as VERSION } from "./config-B4Di8ISR.js";
|
|
5
|
+
import fsSync from "node:fs";
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
7
|
import { DisconnectReason, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, makeWASocket, useMultiFileAuthState } from "@whiskeysockets/baileys";
|
|
8
8
|
import qrcode from "qrcode-terminal";
|
|
@@ -21,16 +21,16 @@ async function safeSaveCreds(authDir, saveCreds, logger) {
|
|
|
21
21
|
const raw = readCredsJsonRaw(credsPath);
|
|
22
22
|
if (raw) try {
|
|
23
23
|
JSON.parse(raw);
|
|
24
|
-
|
|
24
|
+
fsSync.copyFileSync(credsPath, backupPath);
|
|
25
25
|
try {
|
|
26
|
-
|
|
26
|
+
fsSync.chmodSync(backupPath, 384);
|
|
27
27
|
} catch {}
|
|
28
28
|
} catch {}
|
|
29
29
|
} catch {}
|
|
30
30
|
try {
|
|
31
31
|
await Promise.resolve(saveCreds());
|
|
32
32
|
try {
|
|
33
|
-
|
|
33
|
+
fsSync.chmodSync(resolveWebCredsPath(authDir), 384);
|
|
34
34
|
} catch {}
|
|
35
35
|
} catch (err) {
|
|
36
36
|
logger.warn({ error: String(err) }, "failed saving WhatsApp creds");
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { s as resolveStateDir } from "./paths-
|
|
3
|
-
import { I as resolveUserPath, S as CONFIG_DIR } from "./registry-
|
|
4
|
-
import { s as resolveAgentWorkspaceDir, t as listAgentIds } from "./agent-scope-
|
|
5
|
-
import { t as createSubsystemLogger } from "./subsystem-
|
|
6
|
-
import { o as resolvePluginSkillDirs, t as buildWorkspaceSkillCommandSpecs } from "./skills-
|
|
7
|
-
import { i as listChatCommands } from "./commands-registry-
|
|
2
|
+
import { s as resolveStateDir } from "./paths-CySxpNhH.js";
|
|
3
|
+
import { I as resolveUserPath, S as CONFIG_DIR } from "./registry-DP24za6g.js";
|
|
4
|
+
import { s as resolveAgentWorkspaceDir, t as listAgentIds } from "./agent-scope-Bw1Ed8W9.js";
|
|
5
|
+
import { t as createSubsystemLogger } from "./subsystem-DgpxyDQ_.js";
|
|
6
|
+
import { o as resolvePluginSkillDirs, t as buildWorkspaceSkillCommandSpecs } from "./skills-o5WVqM4V.js";
|
|
7
|
+
import { i as listChatCommands } from "./commands-registry-D1zSleL6.js";
|
|
8
8
|
import fs from "node:fs/promises";
|
|
9
9
|
import os from "node:os";
|
|
10
10
|
import path from "node:path";
|
|
11
|
-
import
|
|
11
|
+
import fsSync from "node:fs";
|
|
12
12
|
import { randomUUID } from "node:crypto";
|
|
13
13
|
import chokidar from "chokidar";
|
|
14
14
|
|
|
@@ -283,8 +283,8 @@ function listSkillCommandsForAgents(params) {
|
|
|
283
283
|
const visitedDirs = /* @__PURE__ */ new Set();
|
|
284
284
|
for (const agentId of agentIds) {
|
|
285
285
|
const workspaceDir = resolveAgentWorkspaceDir(params.cfg, agentId);
|
|
286
|
-
if (!
|
|
287
|
-
const canonicalDir =
|
|
286
|
+
if (!fsSync.existsSync(workspaceDir)) continue;
|
|
287
|
+
const canonicalDir = fsSync.realpathSync(workspaceDir);
|
|
288
288
|
if (visitedDirs.has(canonicalDir)) continue;
|
|
289
289
|
visitedDirs.add(canonicalDir);
|
|
290
290
|
const commands = buildWorkspaceSkillCommandSpecs(workspaceDir, {
|