@xopcai/xopc 0.0.52 → 0.0.53
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/extensions/dingtalk/src/plugin.js +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/gateway/static/root/assets/{agents-CLNe-mJX.js → agents-Dk8idifM.js} +2 -2
- package/dist/gateway/static/root/assets/{agents-CLNe-mJX.js.map → agents-Dk8idifM.js.map} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-c5XF02ek.js → apps-page-C4_ekFnF.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-c5XF02ek.js.map → apps-page-C4_ekFnF.js.map} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-BTgdsBM4.js → channels-settings-BoRUNSby.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-settings-BTgdsBM4.js.map → channels-settings-BoRUNSby.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-dreaming-jobs-CiQJHx3s.js → cron-dreaming-jobs-DjK4YEV9.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-dreaming-jobs-CiQJHx3s.js.map → cron-dreaming-jobs-DjK4YEV9.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-DJOj7JWb.js → cron-page-wQAlt7WL.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-page-DJOj7JWb.js.map → cron-page-wQAlt7WL.js.map} +1 -1
- package/dist/gateway/static/root/assets/{dist-BY3E71wk.js → dist-DfWs1l6V.js} +2 -2
- package/dist/gateway/static/root/assets/{dist-BY3E71wk.js.map → dist-DfWs1l6V.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DzkYBiW-.js → extension-debug-page-DKpIM74M.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-DzkYBiW-.js.map → extension-debug-page-DKpIM74M.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-yF0LIy5D.js → extension-page-DR980mtQ.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-yF0LIy5D.js.map → extension-page-DR980mtQ.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CS_Y4y3w.js → extension-settings-page-CZWcC3OA.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-CS_Y4y3w.js.map → extension-settings-page-CZWcC3OA.js.map} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DD2LdM_Q.js → heartbeat-config-api-D4vLbsOG.js} +2 -2
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DD2LdM_Q.js.map → heartbeat-config-api-D4vLbsOG.js.map} +1 -1
- package/dist/gateway/static/root/assets/{index-V5ZnG6RE.js → index-DZLKmP08.js} +4 -4
- package/dist/gateway/static/root/assets/{index-V5ZnG6RE.js.map → index-DZLKmP08.js.map} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-D79WclZL.js → logs-page-f_viqgaf.js} +2 -2
- package/dist/gateway/static/root/assets/{logs-page-D79WclZL.js.map → logs-page-f_viqgaf.js.map} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-R_QJy3OK.js → sessions-page-DW2-c8fv.js} +2 -2
- package/dist/gateway/static/root/assets/{sessions-page-R_QJy3OK.js.map → sessions-page-DW2-c8fv.js.map} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-CGaj_9Qb.js → settings-page-D7-piKSc.js} +2 -2
- package/dist/gateway/static/root/assets/{settings-page-CGaj_9Qb.js.map → settings-page-D7-piKSc.js.map} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-UzbTgnVY.js → skills-page-ChpOJZM1.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-UzbTgnVY.js.map → skills-page-ChpOJZM1.js.map} +1 -1
- package/dist/gateway/static/root/assets/{use-image-provider-credentials-DAx__u3a.js → use-image-provider-credentials-131rA-SV.js} +2 -2
- package/dist/gateway/static/root/assets/{use-image-provider-credentials-DAx__u3a.js.map → use-image-provider-credentials-131rA-SV.js.map} +1 -1
- package/dist/gateway/static/root/index.html +1 -1
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +6 -6
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/goals/post-turn.js +1 -1
- package/dist/src/agent/image/load-image-media.js +1 -1
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/service.js +5 -5
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/providers/extension.js +37 -3
- package/dist/src/browser/providers/extension.js.map +1 -1
- package/dist/src/channels/attachments/inbound-persist.js +1 -1
- package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +4 -4
- package/dist/src/cli/utils/init-workspace.js +2 -2
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/profile.js +2 -2
- package/dist/src/cron/executor.js +2 -2
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/cron/run-log-store.js +1 -1
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/loader.js +1 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/hono/lib/extension-store.js +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +3 -3
- package/dist/src/gateway/hono/sse.js +2 -2
- package/dist/src/gateway/lock.js +2 -2
- package/dist/src/gateway/service/run-gateway-agent.js +2 -2
- package/dist/src/gateway/service.js +18 -9
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/gateway/workspace-heartbeat-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/config-store.js +2 -2
- package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
- package/dist/src/session/parity/sessions-json-file.js +1 -1
- package/dist/src/session/parity/transcript-file-lock.js +2 -2
- package/dist/src/session/parity/transcript-paths.js +1 -1
- package/dist/src/session/search-index-cache.js +1 -1
- package/dist/src/session/search-index.js +1 -1
- package/dist/src/session/session-title.js +1 -1
- package/dist/src/session/store.js +4 -4
- package/dist/src/tui/backends/embedded-backend.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { join, relative } from "node:path";
|
|
2
|
-
import { createReadStream, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
3
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { createReadStream, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { join, relative } from "node:path";
|
|
4
4
|
//#region src/agent/skills/hub-hash.ts
|
|
5
5
|
/**
|
|
6
6
|
* Deterministic content hash for a skill directory (for hub lock / drift detection).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
|
|
2
1
|
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
|
+
import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
|
|
3
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
4
4
|
//#region src/agent/skills/hub-lock.ts
|
|
5
5
|
/**
|
|
@@ -4,9 +4,9 @@ import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
|
|
|
4
4
|
import { getSkillsLockEntry, recordSkillsHubInstall } from "./hub-lock.js";
|
|
5
5
|
import { installSkillFromZip, isValidSkillId } from "./managed-store.js";
|
|
6
6
|
import { computeSkillTreeHashSync } from "./hub-hash.js";
|
|
7
|
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
7
8
|
import { basename, join, normalize, resolve, sep } from "node:path";
|
|
8
9
|
import { tmpdir } from "node:os";
|
|
9
|
-
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
11
|
import { fetch } from "undici";
|
|
12
12
|
import { execFileSync } from "node:child_process";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { resolveStateDir } from "../../config/paths-state.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
4
|
import { init_paths } from "../../config/paths.js";
|
|
5
5
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
6
6
|
import { findInstallSpec, getDefaultInstallerPreferences, hasBinary, init_installer, installSkill } from "./installer.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { init_paths, resolveSkillsDir } from "../../config/paths.js";
|
|
2
2
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
3
3
|
import { loadSkillsLock } from "./hub-lock.js";
|
|
4
|
-
import { dirname, join, resolve, sep } from "node:path";
|
|
5
4
|
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { dirname, join, resolve, sep } from "node:path";
|
|
6
6
|
import AdmZip from "adm-zip";
|
|
7
7
|
//#region src/agent/skills/managed-store.ts
|
|
8
8
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { join } from "path";
|
|
4
3
|
import { readFile, readdir } from "fs/promises";
|
|
4
|
+
import { join } from "path";
|
|
5
5
|
//#region src/agent/skills/scanner.ts
|
|
6
6
|
/**
|
|
7
7
|
* Skill security scanner — scans skill directories for potentially dangerous code patterns.
|
|
@@ -2,9 +2,9 @@ import { init_paths, resolveSkillsDir } from "../../config/paths.js";
|
|
|
2
2
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
3
3
|
import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
|
|
4
4
|
import { fuzzyFindText, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings } from "../tools/edit-diff.js";
|
|
5
|
+
import { mkdir, writeFile } from "fs/promises";
|
|
5
6
|
import { join, resolve, sep } from "path";
|
|
6
7
|
import { existsSync, realpathSync } from "fs";
|
|
7
|
-
import { mkdir, writeFile } from "fs/promises";
|
|
8
8
|
//#region src/agent/skills/skill-manage-ops.ts
|
|
9
9
|
/**
|
|
10
10
|
* Shared logic for the skill_manage agent tool (create / edit / patch / delete / write_file / remove_file).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { resolveStateDir } from "../../config/paths-state.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
4
|
import { init_paths, resolveBundledSkillsDir } from "../../config/paths.js";
|
|
5
5
|
import { createSkillConfigManager, isSkillEnabled } from "./config.js";
|
|
6
6
|
import { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from "./format-skills-prompt.js";
|
|
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
|
|
|
3
3
|
import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../memory/dreaming/constants.js";
|
|
4
4
|
import { loadDreamingStore, saveDreamingStore } from "../memory/dreaming/short-term-store.js";
|
|
5
5
|
import { resolveDreamingConfig } from "../memory/dreaming/config.js";
|
|
6
|
-
import path from "node:path";
|
|
7
6
|
import fs from "node:fs/promises";
|
|
7
|
+
import path from "node:path";
|
|
8
8
|
import { Type } from "@sinclair/typebox";
|
|
9
9
|
//#region src/agent/tools/dreaming-tool.ts
|
|
10
10
|
init_logger();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
4
4
|
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
5
5
|
import { createReadFileTool } from "./read.js";
|
|
6
6
|
import { createWriteFileTool } from "./write.js";
|
|
@@ -4,9 +4,9 @@ import { isFailoverError } from "../failover-error.js";
|
|
|
4
4
|
import { imageAssetFromDataUrl, imageFileExtensionForMimeType, mimeTypeFromFileName, parseImageDataUrl, sniffImageMimeType } from "../image/generation/image-assets.js";
|
|
5
5
|
import { getImageGenerationProvider } from "../image/generation/provider-registry.js";
|
|
6
6
|
import { generateImage, listImageGenerationProvidersSummary } from "../image/generation/runtime.js";
|
|
7
|
-
import path from "node:path";
|
|
8
7
|
import { randomBytes } from "node:crypto";
|
|
9
8
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
9
|
+
import path from "node:path";
|
|
10
10
|
import { Type } from "@sinclair/typebox";
|
|
11
11
|
//#region src/agent/tools/image-generate-tool.ts
|
|
12
12
|
const DEFAULT_COUNT = 1;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { checkFileSafety } from "../prompt/safety.js";
|
|
2
2
|
import { resolvePathUnderWorkspace } from "./tool-paths.js";
|
|
3
|
-
import { basename } from "node:path";
|
|
4
3
|
import { readFile } from "fs/promises";
|
|
4
|
+
import { basename } from "node:path";
|
|
5
5
|
import { Type } from "@sinclair/typebox";
|
|
6
6
|
//#region src/agent/tools/send-media.ts
|
|
7
7
|
const SendMediaSchema = Type.Object({
|
|
@@ -2,9 +2,9 @@ import { resolveStateDir } from "../../config/paths-state.js";
|
|
|
2
2
|
import { init_paths } from "../../config/paths.js";
|
|
3
3
|
import { createSkillConfigManager } from "../skills/config.js";
|
|
4
4
|
import { applyPatchToContent, atomicWriteUtf8, effectiveAgentWritePolicy, ensureCategorySegment, isPathInsideDir, maxSkillMdChars, maxSupportFileBytes, mutatableSkillOrNull, resolveCreateSkillDir, scanSkillDirOrError, validateSkillMdContent, validateSkillNameSegment, validateSupportingRelativePath } from "../skills/skill-manage-ops.js";
|
|
5
|
+
import { readFile, rm } from "fs/promises";
|
|
5
6
|
import { join } from "path";
|
|
6
7
|
import { existsSync, rmSync } from "fs";
|
|
7
|
-
import { readFile, rm } from "fs/promises";
|
|
8
8
|
import { Type } from "@sinclair/typebox";
|
|
9
9
|
//#region src/agent/tools/skill-manage-tool.ts
|
|
10
10
|
init_paths();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { checkFileSafety } from "../prompt/safety.js";
|
|
2
2
|
import { resolvePathUnderWorkspace } from "./tool-paths.js";
|
|
3
|
-
import { dirname } from "path";
|
|
4
3
|
import { mkdir, writeFile } from "fs/promises";
|
|
4
|
+
import { dirname } from "path";
|
|
5
5
|
import { Type } from "@sinclair/typebox";
|
|
6
6
|
//#region src/agent/tools/write.ts
|
|
7
7
|
const MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
2
3
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
4
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
5
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
6
5
|
import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
|
|
7
|
-
import {
|
|
6
|
+
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
8
7
|
import { mkdir, readFile } from "fs/promises";
|
|
8
|
+
import { dirname, join } from "path";
|
|
9
9
|
//#region src/auth/credentials.ts
|
|
10
10
|
function getCredentialResolver(options) {
|
|
11
11
|
return new CredentialResolver(options);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
|
-
import path from "node:path";
|
|
3
2
|
import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
4
|
import { homedir } from "os";
|
|
5
5
|
//#region src/auth/profiles/store.ts
|
|
6
6
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
3
2
|
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
|
|
4
3
|
import { init_loader, loadConfig } from "../config/loader.js";
|
|
4
|
+
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
5
5
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
6
|
//#region src/auth/sync-provider-auth.ts
|
|
7
7
|
/**
|
|
@@ -72,15 +72,49 @@ var ExtensionBrowserProvider = class {
|
|
|
72
72
|
}
|
|
73
73
|
});
|
|
74
74
|
});
|
|
75
|
+
const wssEmitter = this.wss;
|
|
75
76
|
await new Promise((resolve, reject) => {
|
|
76
|
-
|
|
77
|
+
let settled = false;
|
|
78
|
+
const disposeFailedStart = async () => {
|
|
79
|
+
if (this.wss) {
|
|
80
|
+
try {
|
|
81
|
+
this.wss.close();
|
|
82
|
+
} catch {}
|
|
83
|
+
this.wss = null;
|
|
84
|
+
}
|
|
85
|
+
if (this.server) {
|
|
86
|
+
await new Promise((r) => {
|
|
87
|
+
this.server.close(() => r());
|
|
88
|
+
});
|
|
89
|
+
this.server = null;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const onStartError = (err) => {
|
|
93
|
+
if (settled) return;
|
|
94
|
+
settled = true;
|
|
95
|
+
this.server.removeListener("error", onStartError);
|
|
96
|
+
wssEmitter.removeListener("error", onStartError);
|
|
97
|
+
disposeFailedStart().then(() => reject(err));
|
|
98
|
+
};
|
|
99
|
+
const onListening = () => {
|
|
100
|
+
if (settled) return;
|
|
101
|
+
settled = true;
|
|
102
|
+
this.server.removeListener("error", onStartError);
|
|
103
|
+
wssEmitter.removeListener("error", onStartError);
|
|
77
104
|
log.info({
|
|
78
105
|
port: this.config.port,
|
|
79
106
|
host: this.config.host
|
|
80
107
|
}, "Extension WS server started");
|
|
108
|
+
const onRuntimeError = (err) => {
|
|
109
|
+
log.error({ err }, "Extension WS bridge runtime error");
|
|
110
|
+
};
|
|
111
|
+
this.server.on("error", onRuntimeError);
|
|
112
|
+
wssEmitter.on("error", onRuntimeError);
|
|
81
113
|
resolve();
|
|
82
|
-
}
|
|
83
|
-
this.server.on("error",
|
|
114
|
+
};
|
|
115
|
+
this.server.on("error", onStartError);
|
|
116
|
+
wssEmitter.on("error", onStartError);
|
|
117
|
+
this.server.listen(this.config.port, this.config.host, onListening);
|
|
84
118
|
});
|
|
85
119
|
}
|
|
86
120
|
/** Wait for the Chrome Extension to connect. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","names":[],"sources":["../../../../src/browser/providers/extension.ts"],"sourcesContent":["/**\n * Extension browser provider — connects to the xopc Chrome Extension via WebSocket.\n *\n * The xopc process starts a WebSocket server; the Chrome Extension connects as a client.\n * Commands are sent over the WS connection and results are returned asynchronously.\n */\n\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('ExtensionProvider');\n\n// ── Protocol types (mirrored from packages/browser-ext/src/protocol.ts) ──\n\nexport type ExtensionAction =\n | 'open' | 'navigate' | 'reload' | 'back' | 'forward' | 'get_url' | 'get_title'\n | 'state' | 'snapshot' | 'screenshot' | 'content'\n | 'evaluate'\n | 'click' | 'type' | 'scroll' | 'wait'\n | 'query_selector' | 'query_selector_all' | 'wait_for_selector'\n | 'mouse_move' | 'mouse_click' | 'mouse_down' | 'mouse_up' | 'mouse_wheel'\n | 'keys' | 'keyboard_type' | 'keyboard_down' | 'keyboard_up' | 'keyboard_insert_text'\n | 'get_bounding_box' | 'get_element_text' | 'get_element_attribute'\n | 'get_elements_count' | 'set_input_files' | 'scroll_into_view'\n | 'set_viewport_size' | 'get_viewport_size'\n | 'network_start' | 'network_events' | 'network_stop'\n | 'dialog'\n | 'get_cookies' | 'set_cookies' | 'clear_cookies'\n | 'close' | 'new_tab' | 'list_tabs'\n | 'cdp'\n | 'ping';\n\nexport interface ExtensionCommand {\n id: string;\n action: ExtensionAction;\n tabId?: number;\n args?: Record<string, unknown>;\n timeout?: number;\n}\n\nexport interface ExtensionResult {\n id: string;\n ok: boolean;\n data?: unknown;\n error?: string;\n durationMs?: number;\n}\n\n// ── Configuration ────────────────────────────────────────────────────\n\nexport interface ExtensionProviderConfig {\n /** WebSocket server port. Default: 19820. */\n port?: number;\n /** Host to bind. Default: 127.0.0.1. */\n host?: string;\n /** Timeout waiting for extension connection (ms). Default: 30000. */\n connectionTimeout?: number;\n /** Default command timeout (ms). Default: 30000. */\n commandTimeout?: number;\n}\n\nconst DEFAULT_PORT = 19820;\nconst DEFAULT_HOST = '127.0.0.1';\nconst DEFAULT_CONNECTION_TIMEOUT = 30_000;\nconst DEFAULT_COMMAND_TIMEOUT = 30_000;\n\n// ── Provider ─────────────────────────────────────────────────────────\n\ninterface PendingRequest {\n resolve: (result: ExtensionResult) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Manages a WebSocket server that the Chrome Extension connects to.\n * Sends commands and receives results over the connection.\n */\nexport class ExtensionBrowserProvider {\n readonly name = 'extension';\n\n private server: import('http').Server | null = null;\n private wss: unknown = null; // WebSocketServer instance\n private clientWs: unknown = null; // connected client WebSocket\n private pending = new Map<string, PendingRequest>();\n private commandCounter = 0;\n private connected = false;\n private readonly config: Required<ExtensionProviderConfig>;\n private connectionWaiters: Array<{ resolve: () => void; reject: (e: Error) => void }> = [];\n\n constructor(config?: ExtensionProviderConfig) {\n this.config = {\n port: config?.port ?? DEFAULT_PORT,\n host: config?.host ?? DEFAULT_HOST,\n connectionTimeout: config?.connectionTimeout ?? DEFAULT_CONNECTION_TIMEOUT,\n commandTimeout: config?.commandTimeout ?? DEFAULT_COMMAND_TIMEOUT,\n };\n }\n\n /** Start the WebSocket server and wait for the extension to connect. */\n async start(): Promise<void> {\n if (this.server) return;\n\n // Handle CJS/ESM interop: tsx wraps CJS modules so WebSocketServer may need `.default`\n const wsModule: Record<string, unknown> = await import('ws') as never;\n let WssClass = wsModule.WebSocketServer;\n if (typeof WssClass !== 'function') {\n const def = wsModule.default as Record<string, unknown> | undefined;\n WssClass = def?.WebSocketServer ?? def;\n }\n if (typeof WssClass !== 'function') {\n throw new Error('Failed to resolve WebSocketServer from \"ws\" package');\n }\n const WebSocketServer = WssClass as unknown as new (opts: Record<string, unknown>) => unknown;\n const http = await import('node:http');\n\n this.server = http.createServer((_req, res) => {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ ok: true, connected: this.connected }));\n });\n\n this.wss = new WebSocketServer({ server: this.server, path: '/browser-ext' });\n\n (this.wss as { on: Function }).on('connection', (ws: unknown) => {\n log.info('Chrome Extension connected');\n this.clientWs = ws;\n this.connected = true;\n\n // Resolve any pending connection waiters\n for (const waiter of this.connectionWaiters) {\n waiter.resolve();\n }\n this.connectionWaiters = [];\n\n (ws as { on: Function }).on('message', (data: Buffer | string) => {\n this._handleMessage(data.toString());\n });\n\n (ws as { on: Function }).on('close', () => {\n log.warn('Chrome Extension disconnected');\n this.clientWs = null;\n this.connected = false;\n // Reject all pending requests\n for (const [id, req] of this.pending) {\n clearTimeout(req.timer);\n req.reject(new Error('Extension disconnected'));\n this.pending.delete(id);\n }\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(this.config.port, this.config.host, () => {\n log.info({ port: this.config.port, host: this.config.host }, 'Extension WS server started');\n resolve();\n });\n this.server!.on('error', reject);\n });\n }\n\n /** Wait for the Chrome Extension to connect. */\n async waitForConnection(timeoutMs?: number): Promise<void> {\n if (this.connected) return;\n\n const timeout = timeoutMs ?? this.config.connectionTimeout;\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n const idx = this.connectionWaiters.findIndex(w => w.resolve === resolve);\n if (idx >= 0) this.connectionWaiters.splice(idx, 1);\n reject(new Error(`Extension connection timeout after ${timeout}ms. Is the Chrome Extension installed and enabled?`));\n }, timeout);\n\n this.connectionWaiters.push({\n resolve: () => { clearTimeout(timer); resolve(); },\n reject: (e) => { clearTimeout(timer); reject(e); },\n });\n });\n }\n\n /** Send a command to the extension and wait for the result. */\n async sendCommand(action: ExtensionAction, args?: Record<string, unknown>, options?: { tabId?: number; timeout?: number }): Promise<ExtensionResult> {\n if (!this.connected || !this.clientWs) {\n throw new Error('Extension not connected. Ensure the Chrome Extension is installed and connected.');\n }\n\n const id = `cmd_${++this.commandCounter}_${Date.now()}`;\n const cmd: ExtensionCommand = {\n id,\n action,\n args,\n tabId: options?.tabId,\n timeout: options?.timeout ?? this.config.commandTimeout,\n };\n\n return new Promise<ExtensionResult>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`Command timeout: ${action} (${cmd.timeout}ms)`));\n }, cmd.timeout!);\n\n this.pending.set(id, { resolve, reject, timer });\n\n try {\n (this.clientWs as { send: Function }).send(JSON.stringify(cmd));\n } catch (e) {\n clearTimeout(timer);\n this.pending.delete(id);\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n });\n }\n\n /** Whether the extension is currently connected. */\n isConnected(): boolean {\n return this.connected;\n }\n\n /** Shutdown the WebSocket server. */\n async shutdown(): Promise<void> {\n // Reject pending waiters\n for (const waiter of this.connectionWaiters) {\n waiter.reject(new Error('Provider shutting down'));\n }\n this.connectionWaiters = [];\n\n // Reject pending requests\n for (const [id, req] of this.pending) {\n clearTimeout(req.timer);\n req.reject(new Error('Provider shutting down'));\n this.pending.delete(id);\n }\n\n if (this.clientWs) {\n try { (this.clientWs as { close: Function }).close(); } catch { /* */ }\n this.clientWs = null;\n }\n\n if (this.wss) {\n try { (this.wss as { close: Function }).close(); } catch { /* */ }\n this.wss = null;\n }\n\n if (this.server) {\n await new Promise<void>((resolve) => {\n this.server!.close(() => resolve());\n });\n this.server = null;\n }\n\n this.connected = false;\n log.info('Extension provider shut down');\n }\n\n private _handleMessage(raw: string): void {\n try {\n const msg = JSON.parse(raw);\n\n // Status events from extension (fire-and-forget, no pending match)\n if (msg.type === 'status') {\n log.debug(msg, 'Extension status');\n return;\n }\n\n // Network events\n if (msg.type === 'network_event') {\n log.debug({ listenerId: msg.listenerId, eventType: msg.eventType }, 'Network event');\n return;\n }\n\n // Command result\n const id = msg.id as string;\n const pending = this.pending.get(id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pending.delete(id);\n pending.resolve(msg as ExtensionResult);\n }\n } catch (e) {\n log.error({ err: e }, 'Failed to parse extension message');\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extension.js","names":[],"sources":["../../../../src/browser/providers/extension.ts"],"sourcesContent":["/**\n * Extension browser provider — connects to the xopc Chrome Extension via WebSocket.\n *\n * The xopc process starts a WebSocket server; the Chrome Extension connects as a client.\n * Commands are sent over the WS connection and results are returned asynchronously.\n */\n\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('ExtensionProvider');\n\n// ── Protocol types (mirrored from packages/browser-ext/src/protocol.ts) ──\n\nexport type ExtensionAction =\n | 'open' | 'navigate' | 'reload' | 'back' | 'forward' | 'get_url' | 'get_title'\n | 'state' | 'snapshot' | 'screenshot' | 'content'\n | 'evaluate'\n | 'click' | 'type' | 'scroll' | 'wait'\n | 'query_selector' | 'query_selector_all' | 'wait_for_selector'\n | 'mouse_move' | 'mouse_click' | 'mouse_down' | 'mouse_up' | 'mouse_wheel'\n | 'keys' | 'keyboard_type' | 'keyboard_down' | 'keyboard_up' | 'keyboard_insert_text'\n | 'get_bounding_box' | 'get_element_text' | 'get_element_attribute'\n | 'get_elements_count' | 'set_input_files' | 'scroll_into_view'\n | 'set_viewport_size' | 'get_viewport_size'\n | 'network_start' | 'network_events' | 'network_stop'\n | 'dialog'\n | 'get_cookies' | 'set_cookies' | 'clear_cookies'\n | 'close' | 'new_tab' | 'list_tabs'\n | 'cdp'\n | 'ping';\n\nexport interface ExtensionCommand {\n id: string;\n action: ExtensionAction;\n tabId?: number;\n args?: Record<string, unknown>;\n timeout?: number;\n}\n\nexport interface ExtensionResult {\n id: string;\n ok: boolean;\n data?: unknown;\n error?: string;\n durationMs?: number;\n}\n\n// ── Configuration ────────────────────────────────────────────────────\n\nexport interface ExtensionProviderConfig {\n /** WebSocket server port. Default: 19820. */\n port?: number;\n /** Host to bind. Default: 127.0.0.1. */\n host?: string;\n /** Timeout waiting for extension connection (ms). Default: 30000. */\n connectionTimeout?: number;\n /** Default command timeout (ms). Default: 30000. */\n commandTimeout?: number;\n}\n\nconst DEFAULT_PORT = 19820;\nconst DEFAULT_HOST = '127.0.0.1';\nconst DEFAULT_CONNECTION_TIMEOUT = 30_000;\nconst DEFAULT_COMMAND_TIMEOUT = 30_000;\n\n// ── Provider ─────────────────────────────────────────────────────────\n\ninterface PendingRequest {\n resolve: (result: ExtensionResult) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Manages a WebSocket server that the Chrome Extension connects to.\n * Sends commands and receives results over the connection.\n */\nexport class ExtensionBrowserProvider {\n readonly name = 'extension';\n\n private server: import('http').Server | null = null;\n private wss: unknown = null; // WebSocketServer instance\n private clientWs: unknown = null; // connected client WebSocket\n private pending = new Map<string, PendingRequest>();\n private commandCounter = 0;\n private connected = false;\n private readonly config: Required<ExtensionProviderConfig>;\n private connectionWaiters: Array<{ resolve: () => void; reject: (e: Error) => void }> = [];\n\n constructor(config?: ExtensionProviderConfig) {\n this.config = {\n port: config?.port ?? DEFAULT_PORT,\n host: config?.host ?? DEFAULT_HOST,\n connectionTimeout: config?.connectionTimeout ?? DEFAULT_CONNECTION_TIMEOUT,\n commandTimeout: config?.commandTimeout ?? DEFAULT_COMMAND_TIMEOUT,\n };\n }\n\n /** Start the WebSocket server and wait for the extension to connect. */\n async start(): Promise<void> {\n if (this.server) return;\n\n // Handle CJS/ESM interop: tsx wraps CJS modules so WebSocketServer may need `.default`\n const wsModule: Record<string, unknown> = await import('ws') as never;\n let WssClass = wsModule.WebSocketServer;\n if (typeof WssClass !== 'function') {\n const def = wsModule.default as Record<string, unknown> | undefined;\n WssClass = def?.WebSocketServer ?? def;\n }\n if (typeof WssClass !== 'function') {\n throw new Error('Failed to resolve WebSocketServer from \"ws\" package');\n }\n const WebSocketServer = WssClass as unknown as new (opts: Record<string, unknown>) => unknown;\n const http = await import('node:http');\n\n this.server = http.createServer((_req, res) => {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ ok: true, connected: this.connected }));\n });\n\n this.wss = new WebSocketServer({ server: this.server, path: '/browser-ext' });\n\n (this.wss as { on: Function }).on('connection', (ws: unknown) => {\n log.info('Chrome Extension connected');\n this.clientWs = ws;\n this.connected = true;\n\n // Resolve any pending connection waiters\n for (const waiter of this.connectionWaiters) {\n waiter.resolve();\n }\n this.connectionWaiters = [];\n\n (ws as { on: Function }).on('message', (data: Buffer | string) => {\n this._handleMessage(data.toString());\n });\n\n (ws as { on: Function }).on('close', () => {\n log.warn('Chrome Extension disconnected');\n this.clientWs = null;\n this.connected = false;\n // Reject all pending requests\n for (const [id, req] of this.pending) {\n clearTimeout(req.timer);\n req.reject(new Error('Extension disconnected'));\n this.pending.delete(id);\n }\n });\n });\n\n const wssEmitter = this.wss as import('node:events').EventEmitter;\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const disposeFailedStart = async () => {\n if (this.wss) {\n try {\n (this.wss as { close: (cb?: () => void) => void }).close();\n } catch {\n /* */\n }\n this.wss = null;\n }\n if (this.server) {\n await new Promise<void>((r) => {\n this.server!.close(() => r());\n });\n this.server = null;\n }\n };\n\n const onStartError = (err: Error) => {\n if (settled) return;\n settled = true;\n this.server!.removeListener('error', onStartError);\n wssEmitter.removeListener('error', onStartError);\n void disposeFailedStart().then(() => reject(err));\n };\n\n const onListening = () => {\n if (settled) return;\n settled = true;\n this.server!.removeListener('error', onStartError);\n wssEmitter.removeListener('error', onStartError);\n\n log.info({ port: this.config.port, host: this.config.host }, 'Extension WS server started');\n\n const onRuntimeError = (err: Error) => {\n log.error({ err }, 'Extension WS bridge runtime error');\n };\n this.server!.on('error', onRuntimeError);\n wssEmitter.on('error', onRuntimeError);\n\n resolve();\n };\n\n // `listen` failures may surface on `http.Server` or on `ws` WebSocketServer; only\n // attaching `server.on('error')` leaves `error` on `wss` unhandled (process crash).\n this.server!.on('error', onStartError);\n wssEmitter.on('error', onStartError);\n this.server!.listen(this.config.port, this.config.host, onListening);\n });\n }\n\n /** Wait for the Chrome Extension to connect. */\n async waitForConnection(timeoutMs?: number): Promise<void> {\n if (this.connected) return;\n\n const timeout = timeoutMs ?? this.config.connectionTimeout;\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n const idx = this.connectionWaiters.findIndex(w => w.resolve === resolve);\n if (idx >= 0) this.connectionWaiters.splice(idx, 1);\n reject(new Error(`Extension connection timeout after ${timeout}ms. Is the Chrome Extension installed and enabled?`));\n }, timeout);\n\n this.connectionWaiters.push({\n resolve: () => { clearTimeout(timer); resolve(); },\n reject: (e) => { clearTimeout(timer); reject(e); },\n });\n });\n }\n\n /** Send a command to the extension and wait for the result. */\n async sendCommand(action: ExtensionAction, args?: Record<string, unknown>, options?: { tabId?: number; timeout?: number }): Promise<ExtensionResult> {\n if (!this.connected || !this.clientWs) {\n throw new Error('Extension not connected. Ensure the Chrome Extension is installed and connected.');\n }\n\n const id = `cmd_${++this.commandCounter}_${Date.now()}`;\n const cmd: ExtensionCommand = {\n id,\n action,\n args,\n tabId: options?.tabId,\n timeout: options?.timeout ?? this.config.commandTimeout,\n };\n\n return new Promise<ExtensionResult>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`Command timeout: ${action} (${cmd.timeout}ms)`));\n }, cmd.timeout!);\n\n this.pending.set(id, { resolve, reject, timer });\n\n try {\n (this.clientWs as { send: Function }).send(JSON.stringify(cmd));\n } catch (e) {\n clearTimeout(timer);\n this.pending.delete(id);\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n });\n }\n\n /** Whether the extension is currently connected. */\n isConnected(): boolean {\n return this.connected;\n }\n\n /** Shutdown the WebSocket server. */\n async shutdown(): Promise<void> {\n // Reject pending waiters\n for (const waiter of this.connectionWaiters) {\n waiter.reject(new Error('Provider shutting down'));\n }\n this.connectionWaiters = [];\n\n // Reject pending requests\n for (const [id, req] of this.pending) {\n clearTimeout(req.timer);\n req.reject(new Error('Provider shutting down'));\n this.pending.delete(id);\n }\n\n if (this.clientWs) {\n try { (this.clientWs as { close: Function }).close(); } catch { /* */ }\n this.clientWs = null;\n }\n\n if (this.wss) {\n try { (this.wss as { close: Function }).close(); } catch { /* */ }\n this.wss = null;\n }\n\n if (this.server) {\n await new Promise<void>((resolve) => {\n this.server!.close(() => resolve());\n });\n this.server = null;\n }\n\n this.connected = false;\n log.info('Extension provider shut down');\n }\n\n private _handleMessage(raw: string): void {\n try {\n const msg = JSON.parse(raw);\n\n // Status events from extension (fire-and-forget, no pending match)\n if (msg.type === 'status') {\n log.debug(msg, 'Extension status');\n return;\n }\n\n // Network events\n if (msg.type === 'network_event') {\n log.debug({ listenerId: msg.listenerId, eventType: msg.eventType }, 'Network event');\n return;\n }\n\n // Command result\n const id = msg.id as string;\n const pending = this.pending.get(id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pending.delete(id);\n pending.resolve(msg as ExtensionResult);\n }\n } catch (e) {\n log.error({ err: e }, 'Failed to parse extension message');\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { join, resolve } from "path";
|
|
4
3
|
import { mkdir, writeFile } from "fs/promises";
|
|
4
|
+
import { join, resolve } from "path";
|
|
5
5
|
import { randomBytes } from "crypto";
|
|
6
6
|
//#region src/channels/attachments/inbound-persist.ts
|
|
7
7
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { join, resolve } from "path";
|
|
4
3
|
import { mkdir, writeFile } from "fs/promises";
|
|
4
|
+
import { join, resolve } from "path";
|
|
5
5
|
import { randomBytes } from "crypto";
|
|
6
6
|
//#region src/channels/attachments/outbound-tts-persist.ts
|
|
7
7
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
2
3
|
import { join } from "path";
|
|
3
4
|
import { existsSync, mkdirSync, readFileSync } from "fs";
|
|
4
|
-
import { randomUUID } from "node:crypto";
|
|
5
5
|
//#region src/channels/outbound/persist-store.ts
|
|
6
6
|
/**
|
|
7
7
|
* Durable outbound queue (crash recovery): JSON file under agent internal dir.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { appendAllowFromIdSync } from "./allow-from-file.js";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import fsSync from "node:fs";
|
|
4
2
|
import crypto from "node:crypto";
|
|
3
|
+
import fsSync from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
5
|
//#region src/channels/pairing/pairing-store.ts
|
|
6
6
|
const PAIRING_CODE_LENGTH = 8;
|
|
7
7
|
const PAIRING_CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ConfigSchema, init_schema } from "../../config/schema.js";
|
|
2
|
-
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
3
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
4
2
|
import { init_logger } from "../../utils/logger.js";
|
|
5
3
|
import { init_paths, resolveConfigPath } from "../../config/paths.js";
|
|
4
|
+
import { ConfigSchema, init_schema } from "../../config/schema.js";
|
|
6
5
|
import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
|
|
6
|
+
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
7
7
|
import { commandRegistry } from "../registry.js";
|
|
8
8
|
import { resolveAllowlistMatchSimple } from "../../channels/security.js";
|
|
9
9
|
import { parseConfigValue } from "../config-value.js";
|
|
@@ -4,8 +4,8 @@ import { init_loader, saveConfig } from "../config/loader.js";
|
|
|
4
4
|
import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
|
|
5
5
|
import { getRoutingInfo, getSessionDisplayName } from "./session-key.js";
|
|
6
6
|
import { wrapMarkdownExportAsHtml } from "../session/chat-export.js";
|
|
7
|
-
import { join } from "path";
|
|
8
7
|
import { mkdir, writeFile } from "fs/promises";
|
|
8
|
+
import { join } from "path";
|
|
9
9
|
//#region src/chat-commands/context.ts
|
|
10
10
|
init_logger();
|
|
11
11
|
init_loader();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { getWorkspacePath } from "../../config/schema.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { getWorkspacePath } from "../../config/schema.js";
|
|
4
4
|
import { loadConfig } from "../../config/loader.js";
|
|
5
5
|
import { MessageBus, MessageBusShutdownError } from "../../infra/bus/queue.js";
|
|
6
6
|
import "../../infra/bus/index.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
4
4
|
import { loadConfig } from "../../config/loader.js";
|
|
5
5
|
import { formatExamples, register } from "../registry.js";
|
|
6
6
|
import "../../config/index.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ConfigSchema, init_schema } from "../../../../config/schema.js";
|
|
2
2
|
import { init_loader, loadConfig, saveConfig } from "../../../../config/loader.js";
|
|
3
|
-
import { dirname } from "node:path";
|
|
4
3
|
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
5
|
//#region src/cli/commands/doctor/checks/config-health.ts
|
|
6
6
|
init_loader();
|
|
7
7
|
init_schema();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
|
|
1
2
|
import { getAgentDefaultModelRef, init_schema, parseModelRef } from "../../../../config/schema.js";
|
|
2
3
|
import { init_loader, loadConfig } from "../../../../config/loader.js";
|
|
3
|
-
import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
//#region src/cli/commands/doctor/checks/provider-auth.ts
|
|
6
6
|
init_loader();
|
|
@@ -2,8 +2,8 @@ import { init_agent_scope, resolveDefaultAgentId } from "../../../../agent/agent
|
|
|
2
2
|
import { init_transcript_paths, resolveSessionFilePath } from "../../../../session/parity/transcript-paths.js";
|
|
3
3
|
import { FILENAMES, init_paths, resolveSessionsDir } from "../../../../config/paths.js";
|
|
4
4
|
import { init_loader, loadConfig } from "../../../../config/loader.js";
|
|
5
|
-
import { join } from "node:path";
|
|
6
5
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
7
|
//#region src/cli/commands/doctor/checks/session-integrity.ts
|
|
8
8
|
init_agent_scope();
|
|
9
9
|
init_loader();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { init_agent_scope, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../../../agent/agent-scope.js";
|
|
2
2
|
import { WORKSPACE_FILES, init_paths } from "../../../../config/paths.js";
|
|
3
3
|
import { init_loader, loadConfig } from "../../../../config/loader.js";
|
|
4
|
-
import { join } from "node:path";
|
|
5
4
|
import { existsSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
6
|
//#region src/cli/commands/doctor/checks/workspace-status.ts
|
|
7
7
|
init_agent_scope();
|
|
8
8
|
init_loader();
|
|
@@ -12,8 +12,8 @@ import { GatewayServer } from "../../gateway/server.js";
|
|
|
12
12
|
import { runGatewayLoop } from "../../gateway/run-loop.js";
|
|
13
13
|
import "../../gateway/index.js";
|
|
14
14
|
import { getContextWithOpts } from "../index.js";
|
|
15
|
-
import { join, resolve } from "node:path";
|
|
16
15
|
import { existsSync, mkdirSync, readFileSync, symlinkSync, unlinkSync, watch } from "node:fs";
|
|
16
|
+
import { join, resolve } from "node:path";
|
|
17
17
|
import { Command } from "commander";
|
|
18
18
|
//#region src/cli/commands/extension-dev.ts
|
|
19
19
|
init_loader();
|
|
@@ -7,8 +7,8 @@ import { getExtensionLockfileManager } from "../../extensions/lockfile.js";
|
|
|
7
7
|
import { downloadExtensionStoreZipBuffer, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl } from "../../agent/skills/marketplace/adapters/store/store-api-client.js";
|
|
8
8
|
import { fetchRegistry, findExtension, getExtensionMarketplaceStoreBaseUrl, listExtensions, searchExtensions } from "../../extensions/marketplace.js";
|
|
9
9
|
import { getContextWithOpts } from "../index.js";
|
|
10
|
-
import { join, resolve } from "node:path";
|
|
11
10
|
import { existsSync, readFileSync, rmSync, statSync } from "node:fs";
|
|
11
|
+
import { join, resolve } from "node:path";
|
|
12
12
|
import { Command } from "commander";
|
|
13
13
|
import { execSync } from "node:child_process";
|
|
14
14
|
import semver from "semver";
|
|
@@ -4,8 +4,8 @@ import { init_logger } from "../../utils/logger.js";
|
|
|
4
4
|
import { normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
|
|
5
5
|
import { checkEngineCompatibility } from "../../extensions/engine-check.js";
|
|
6
6
|
import { colors } from "../utils/colors.js";
|
|
7
|
-
import { isAbsolute, join, resolve } from "node:path";
|
|
8
7
|
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync } from "node:fs";
|
|
8
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
9
9
|
import { Command } from "commander";
|
|
10
10
|
import { execSync } from "node:child_process";
|
|
11
11
|
//#region src/cli/commands/extension-pack.ts
|
|
@@ -8,8 +8,8 @@ import { formatExamples, register } from "../registry.js";
|
|
|
8
8
|
import { colors } from "../utils/colors.js";
|
|
9
9
|
import "../../agent/image/index.js";
|
|
10
10
|
import { getContextWithOpts } from "../index.js";
|
|
11
|
-
import { join, resolve } from "node:path";
|
|
12
11
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
12
|
+
import { join, resolve } from "node:path";
|
|
13
13
|
import { Command } from "commander";
|
|
14
14
|
//#region src/cli/commands/image.ts
|
|
15
15
|
init_loader();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { resolveAgentWorkspaceDir } from "../../agent/agent-scope.js";
|
|
1
|
+
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
3
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
4
3
|
import { init_logger } from "../../utils/logger.js";
|
|
4
|
+
import { resolveStateDir } from "../../config/paths-state.js";
|
|
5
|
+
import { resolveAgentWorkspaceDir } from "../../agent/agent-scope.js";
|
|
5
6
|
import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveBinDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveExtensionsDir, resolveInboxDir, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogsDir, resolveSessionsDir, resolveSkillsDir, resolveToolsDir, resolveWorkspaceStateDir, resolveWorkspaceStatePath } from "../../config/paths.js";
|
|
6
|
-
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
7
7
|
import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
|
|
8
|
+
import { mkdir, writeFile } from "fs/promises";
|
|
8
9
|
import { join } from "path";
|
|
9
10
|
import { existsSync } from "fs";
|
|
10
|
-
import { mkdir, writeFile } from "fs/promises";
|
|
11
11
|
//#region src/cli/commands/init.ts
|
|
12
12
|
init_write_file_atomic();
|
|
13
13
|
init_logger();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ConfigSchema, init_schema } from "../../config/schema.js";
|
|
2
2
|
import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
|
|
3
|
-
import { dirname, join } from "node:path";
|
|
4
|
-
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
5
3
|
import { randomBytes } from "node:crypto";
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
6
|
//#region src/cli/utils/init-workspace.ts
|
|
7
7
|
init_schema();
|
|
8
8
|
init_loader();
|
package/dist/src/config/index.js
CHANGED
|
@@ -2,15 +2,15 @@ import { ENV_VARS, resolveHomeDir, resolveStateDir } from "./paths-state.js";
|
|
|
2
2
|
import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
|
|
3
3
|
import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
|
|
4
4
|
import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir, resolveSessionsDir as resolveSessionsDir$1 } from "../agent/agent-scope.js";
|
|
5
|
+
import { resolveSessionFilePath, resolveSessionTranscriptPathInDir } from "../session/parity/transcript-paths.js";
|
|
6
|
+
import { FILENAMES, WORKSPACE_FILES, existsSync, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveCronLogPath, resolveCronLogsDir, resolveCronRunsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMemoryDir, resolveMemoryPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSessionTranscriptPath, resolveSessionsArchiveDir, resolveSessionsDir, resolveSessionsMapPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
|
|
5
7
|
import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
|
|
6
8
|
import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
|
|
7
9
|
import { DingtalkConfigSchema } from "../../extensions/dingtalk/src/config-schema.js";
|
|
8
10
|
import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, getAgentDefaultModelRef, getWorkspacePath, init_schema, parseModelRef } from "./schema.js";
|
|
11
|
+
import { init_loader, loadConfig, registerChannelConfigValidator, saveConfig } from "./loader.js";
|
|
9
12
|
import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
|
|
10
13
|
import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
|
|
11
|
-
import { resolveSessionFilePath, resolveSessionTranscriptPathInDir } from "../session/parity/transcript-paths.js";
|
|
12
|
-
import { FILENAMES, WORKSPACE_FILES, existsSync, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveCronLogPath, resolveCronLogsDir, resolveCronRunsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMemoryDir, resolveMemoryPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSessionTranscriptPath, resolveSessionsArchiveDir, resolveSessionsDir, resolveSessionsMapPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
|
|
13
|
-
import { init_loader, loadConfig, registerChannelConfigValidator, saveConfig } from "./loader.js";
|
|
14
14
|
import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
|
|
15
15
|
import { CustomModelSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
|
|
16
16
|
import { formatThinkingLevels, listThinkingLevels, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, thinkLevelToNumber } from "../agent/transcript/thinking-types.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import {
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
3
3
|
import { createLogger } from "../utils/logger/index.js";
|
|
4
4
|
import { init_logger } from "../utils/logger.js";
|
|
5
5
|
import { init_paths, resolveConfigPath } from "./paths.js";
|
|
6
|
-
import {
|
|
6
|
+
import { ConfigSchema, init_schema } from "./schema.js";
|
|
7
7
|
import { dirname } from "path";
|
|
8
8
|
import { existsSync, mkdirSync, promises, readFileSync } from "fs";
|
|
9
9
|
import { config } from "dotenv";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_paths, resolveModelsJsonPath } from "./paths.js";
|
|
3
2
|
import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
|
|
4
|
-
import {
|
|
3
|
+
import { init_paths, resolveModelsJsonPath } from "./paths.js";
|
|
5
4
|
import { existsSync, readFileSync } from "fs";
|
|
5
|
+
import { z } from "zod";
|
|
6
6
|
//#region src/config/models-json.ts
|
|
7
7
|
/**
|
|
8
8
|
* Models.json configuration types and schema
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ENV_VARS, init_paths_state, resolveHomeDir } from "./paths-state.js";
|
|
2
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { ENV_VARS, init_paths_state, resolveHomeDir } from "./paths-state.js";
|
|
4
|
+
import { mkdir, readdir, rm, stat } from "fs/promises";
|
|
4
5
|
import { join } from "path";
|
|
5
6
|
import { existsSync } from "fs";
|
|
6
|
-
import { mkdir, readdir, rm, stat } from "fs/promises";
|
|
7
7
|
//#region src/config/profile.ts
|
|
8
8
|
init_logger();
|
|
9
9
|
init_paths_state();
|