@xopcai/xopc 0.0.104 → 0.0.105
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/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +396 -0
- package/dist/gateway/static/root/assets/{apps-page-L-IwQTe0.js → apps-page-B7Us3RMl.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +1 -0
- package/dist/gateway/static/root/assets/{dist-C6vclgEL.js → dist-DJDkNhu5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-D4JYAbsX.js → extension-debug-page-DI1XJTJi.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-_T62gi6e.js → extension-page-SuafGTT_.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CkJbjyM-.js → extension-settings-page-cKmGax9v.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-B5aiIguv.js → fetch-CkvRO30i.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DqmLXhs6.js → gateway-startup-retry-BkKyRDrF.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-HwJV1K_Y.js → heartbeat-config-api-CRiDcxtt.js} +1 -1
- package/dist/gateway/static/root/assets/index-50FVtgXU.js +4845 -0
- package/dist/gateway/static/root/assets/{logs-page-DsjtTjBy.js → logs-page-DM8o5-Bm.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-B2V7RhgD.js → note-detail-page-j53jtvq9.js} +54 -54
- package/dist/gateway/static/root/assets/{note-time-BG8GCTr4.js → note-time-Ck2H2Qpw.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-xrcVBQ6Z.js → notes-page-CsWIw35Q.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-S-QUvhul.js → schema-form-BvmGNxiJ.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +1 -0
- package/dist/gateway/static/root/assets/{settings-advanced-gate-DujQl9c7.js → settings-advanced-gate-DRdayl8P.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-r1V7dRV6.js → settings-form-section-BlIYg2gZ.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +3 -0
- package/dist/gateway/static/root/assets/{share-preview-page-DOFy0FNt.js → share-preview-page-BlT6Akvk.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-Bo3j5Ovv.js → theme-store-DYgVdRB4.js} +1 -1
- package/dist/gateway/static/root/assets/url-DPEStU4M.js +3 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-AjmUAlEQ.js → voice-api-key-field-CJGTidqc.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-DLEJ92gK.js → workflow-page.utils-_sjXCMvi.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +27 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/prompt/memory/index.js +30 -2
- package/dist/src/agent/prompt/memory/index.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +2 -0
- package/dist/src/agent/service/direct-turn-helpers.js +5 -2
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -0
- package/dist/src/agent/service/process-direct-streaming.js +15 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.js +2 -1
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +3 -0
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/source-context/index.d.ts +2 -0
- package/dist/src/agent/source-context/index.js +3 -0
- package/dist/src/agent/source-context/injector.d.ts +3 -0
- package/dist/src/agent/source-context/injector.js +36 -0
- package/dist/src/agent/source-context/injector.js.map +1 -0
- package/dist/src/agent/source-context/types.d.ts +19 -0
- package/dist/src/agent/source-context/types.js +10 -0
- package/dist/src/agent/source-context/types.js.map +1 -0
- package/dist/src/agent/tools/factory.js +5 -5
- package/dist/src/agent/tools/index.js +3 -3
- package/dist/src/agent/tools/session-search-tool.js +1 -1
- package/dist/src/agent/tools/shell.js +1 -1
- package/dist/src/agent/tools/web-extract.js +2 -2
- package/dist/src/agent/tools/web.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/registry.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/index.js +3 -3
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/paths.d.ts +1 -0
- package/dist/src/config/paths.js +5 -1
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/document-understanding/extract.d.ts +13 -0
- package/dist/src/document-understanding/extract.js +63 -0
- package/dist/src/document-understanding/extract.js.map +1 -0
- package/dist/src/gateway/hono/routes/notes.js +46 -27
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/service.js +11 -0
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/notes/agent-context.d.ts +40 -0
- package/dist/src/notes/agent-context.js +383 -0
- package/dist/src/notes/agent-context.js.map +1 -0
- package/dist/src/notes/index.d.ts +2 -0
- package/dist/src/notes/index.js +2 -1
- package/dist/src/notes/service.d.ts +5 -0
- package/dist/src/notes/service.js +22 -0
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/notes/store.js +2 -0
- package/dist/src/notes/store.js.map +1 -1
- package/dist/src/share/share-thumbnail.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/migrations/005_add_note_agent_contexts.sql +10 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/note-agent-context-repository.d.ts +10 -0
- package/dist/src/storage/sqlite/note-agent-context-repository.js +35 -0
- package/dist/src/storage/sqlite/note-agent-context-repository.js.map +1 -0
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +0 -396
- package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +0 -1
- package/dist/gateway/static/root/assets/index-DvTb6wNR.js +0 -4845
- package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +0 -2
- package/dist/gateway/static/root/assets/url-WgQIjFZu.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +0 -27
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
4
|
-
import { resolveBrowserBackendFromConfig } from "../../browser/backend-from-config.js";
|
|
5
|
-
import { CdpSupervisor } from "../../browser/cdp-supervisor.js";
|
|
6
|
-
import { BrowserManager } from "../../browser/manager.js";
|
|
7
|
-
import { checkBrowserReadiness } from "../../browser/readiness.js";
|
|
8
|
-
import "../../browser/index.js";
|
|
9
4
|
import { createReadFileTool } from "./read.js";
|
|
10
5
|
import { createWriteFileTool } from "./write.js";
|
|
11
6
|
import { createEditFileTool } from "./edit.js";
|
|
@@ -26,6 +21,11 @@ import { createTodoTool } from "./todo-tool.js";
|
|
|
26
21
|
import { createSessionStatusTool } from "./session-status-tool.js";
|
|
27
22
|
import { createDreamingTool } from "./dreaming-tool.js";
|
|
28
23
|
import { createClarifyTool } from "./clarify-tool.js";
|
|
24
|
+
import { BrowserManager } from "../../browser/manager.js";
|
|
25
|
+
import { resolveBrowserBackendFromConfig } from "../../browser/backend-from-config.js";
|
|
26
|
+
import { checkBrowserReadiness } from "../../browser/readiness.js";
|
|
27
|
+
import { CdpSupervisor } from "../../browser/cdp-supervisor.js";
|
|
28
|
+
import "../../browser/index.js";
|
|
29
29
|
import { createDelegateTool } from "./delegate-tool.js";
|
|
30
30
|
import { createWorkflowCatalog } from "../workflow/catalog.js";
|
|
31
31
|
import { createWorkflowTool } from "./workflow-tool.js";
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { BrowserManager } from "../../browser/manager.js";
|
|
2
|
-
import { assertBrowserUrlAllowed } from "../../browser/url-policy.js";
|
|
3
|
-
import "../../browser/index.js";
|
|
4
1
|
import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, GREP_MAX_LINE_LENGTH, formatSize, truncateHead, truncateLine, truncateTail } from "./truncate.js";
|
|
5
2
|
import { createReadFileTool } from "./read.js";
|
|
6
3
|
import { createWriteFileTool, writeFileTool } from "./write.js";
|
|
@@ -23,6 +20,9 @@ import { TodoStore, createTodoTool } from "./todo-tool.js";
|
|
|
23
20
|
import { createSessionStatusTool } from "./session-status-tool.js";
|
|
24
21
|
import { createDreamingTool } from "./dreaming-tool.js";
|
|
25
22
|
import { createClarifyTool } from "./clarify-tool.js";
|
|
23
|
+
import { BrowserManager } from "../../browser/manager.js";
|
|
24
|
+
import { assertBrowserUrlAllowed } from "../../browser/url-policy.js";
|
|
25
|
+
import "../../browser/index.js";
|
|
26
26
|
import { DEFAULT_DELEGATE_TOOLS, DELEGATE_BLOCKED_TOOLS, createDelegateTool } from "./delegate-tool.js";
|
|
27
27
|
import { createWorkflowTool } from "./workflow-tool.js";
|
|
28
28
|
import { SANDBOX_ALLOWED_TOOLS, buildSandboxToolMap, createExecuteCodeTool } from "./execute-code-tool.js";
|
|
@@ -2,8 +2,8 @@ import { createLogger } from "../../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
|
|
4
4
|
import { readAgentMessageContent } from "../memory/agent-message-access.js";
|
|
5
|
-
import { Type } from "@sinclair/typebox";
|
|
6
5
|
import { complete } from "@earendil-works/pi-ai";
|
|
6
|
+
import { Type } from "@sinclair/typebox";
|
|
7
7
|
//#region src/agent/tools/session-search-tool.ts
|
|
8
8
|
init_providers();
|
|
9
9
|
init_logger();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { evaluateExecPolicy } from "../sandbox/exec-policy.js";
|
|
2
|
-
import { Type } from "@sinclair/typebox";
|
|
3
2
|
import { spawn } from "child_process";
|
|
3
|
+
import { Type } from "@sinclair/typebox";
|
|
4
4
|
//#region src/agent/tools/shell.ts
|
|
5
5
|
const MAX_SHELL_TIMEOUT = 300;
|
|
6
6
|
const DEFAULT_MAX_BYTES = 50 * 1024;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { checkUrlSafety, checkWebsiteBlocklist, cleanBase64Images } from "./url-safety.js";
|
|
4
3
|
import { getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
|
|
5
|
-
import {
|
|
4
|
+
import { checkUrlSafety, checkWebsiteBlocklist, cleanBase64Images } from "./url-safety.js";
|
|
6
5
|
import { complete } from "@earendil-works/pi-ai";
|
|
6
|
+
import { Type } from "@sinclair/typebox";
|
|
7
7
|
//#region src/agent/tools/web-extract.ts
|
|
8
8
|
init_providers();
|
|
9
9
|
init_logger();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { checkUrlSafety, checkWebsiteBlocklist } from "./url-safety.js";
|
|
2
1
|
import { SearchProviderRegistry } from "./search/registry.js";
|
|
3
2
|
import { resolveWebSearchConfig } from "./search/resolve-config.js";
|
|
3
|
+
import { checkUrlSafety, checkWebsiteBlocklist } from "./url-safety.js";
|
|
4
4
|
import { Type } from "@sinclair/typebox";
|
|
5
5
|
//#region src/agent/tools/web.ts
|
|
6
6
|
const WebSearchSchema = Type.Object({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { checkWebsiteBlocklist } from "../../agent/tools/url-safety.js";
|
|
1
2
|
import { resolveBrowserCommandTimeoutMs } from "../browser-command-timeout.js";
|
|
2
3
|
import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from "../url-policy.js";
|
|
3
4
|
import { truncateSnapshotAtBoundary } from "../snapshot-helpers.js";
|
|
4
|
-
import { checkWebsiteBlocklist } from "../../agent/tools/url-safety.js";
|
|
5
5
|
//#region src/browser/actions/extension-registry-bridge.ts
|
|
6
6
|
/**
|
|
7
7
|
* Runs browser registry actions against the Chrome Extension bridge (no Playwright page).
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { checkWebsiteBlocklist } from "../../agent/tools/url-safety.js";
|
|
3
4
|
import { resolveBrowserCommandTimeoutMs } from "../browser-command-timeout.js";
|
|
4
|
-
import { humanizedClick, humanizedFill, humanizedScroll } from "../humanize.js";
|
|
5
5
|
import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from "../url-policy.js";
|
|
6
6
|
import { truncateSnapshotAtBoundary } from "../snapshot-helpers.js";
|
|
7
|
-
import {
|
|
7
|
+
import { humanizedClick, humanizedFill, humanizedScroll } from "../humanize.js";
|
|
8
8
|
//#region src/browser/actions/registry.ts
|
|
9
9
|
init_logger();
|
|
10
10
|
const log = createLogger("BrowserActionRegistry");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { pickFreePort } from "./free-port.js";
|
|
4
3
|
import { loadPlaywrightCoreModule } from "./providers/playwright-doctor.js";
|
|
4
|
+
import { pickFreePort } from "./free-port.js";
|
|
5
5
|
import { existsSync } from "node:fs";
|
|
6
6
|
import { mkdir, rm } from "node:fs/promises";
|
|
7
7
|
import { join } from "node:path";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import { BrowserManager } from "./manager.js";
|
|
1
2
|
import { resolveBrowserBackendFromConfig } from "./backend-from-config.js";
|
|
2
3
|
import { resolveBrowserCommandTimeoutMs } from "./browser-command-timeout.js";
|
|
3
|
-
import { CdpSupervisor } from "./cdp-supervisor.js";
|
|
4
|
-
import { generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, resolveHumanConfig } from "./humanize.js";
|
|
5
|
-
import { BrowserManager } from "./manager.js";
|
|
6
4
|
import { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness } from "./readiness.js";
|
|
7
5
|
import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern, isAlwaysBlockedUrl } from "./url-policy.js";
|
|
6
|
+
import { CdpSupervisor } from "./cdp-supervisor.js";
|
|
8
7
|
import { snapshotSummaryHeader, truncateSnapshotAtBoundary } from "./snapshot-helpers.js";
|
|
9
8
|
import { checkBotDetection, cleanupOrphanProcesses, startTracing, stopTracing } from "./session-lifecycle.js";
|
|
10
9
|
import { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserNavigateSchema, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema } from "./schemas.js";
|
|
10
|
+
import { generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, resolveHumanConfig } from "./humanize.js";
|
|
11
11
|
import { WEBDRIVER_OVERRIDE_SCRIPT, buildLocalStealthArgs, buildStealthArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "./stealth.js";
|
|
12
12
|
import { createBrowserActionRegistry } from "./actions/registry.js";
|
|
13
13
|
import { parseBrowserPipeline } from "./pipeline/schema.js";
|
|
@@ -8,8 +8,8 @@ import { resolvePackageRoot } from "../../infra/update-check.js";
|
|
|
8
8
|
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
9
9
|
import { readFile, readdir, rm } from "node:fs/promises";
|
|
10
10
|
import { dirname, join } from "node:path";
|
|
11
|
-
import { spawn } from "node:child_process";
|
|
12
11
|
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
13
|
//#region src/browser/providers/browser-ext-install.ts
|
|
14
14
|
/**
|
|
15
15
|
* Install bundled Chrome extension artifacts into {resolveBinDir()}/browser-ext/.
|
|
@@ -2,9 +2,9 @@ import { createLogger } from "../../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { init_paths, resolveBinDir } from "../../config/paths.js";
|
|
4
4
|
import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
|
|
5
|
-
import { pickFreePort } from "../free-port.js";
|
|
6
5
|
import { loadPlaywrightCoreModule } from "./playwright-doctor.js";
|
|
7
6
|
import { WEBDRIVER_OVERRIDE_SCRIPT, buildStealthArgs, filterCloakBrowserExtraArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "../stealth.js";
|
|
7
|
+
import { pickFreePort } from "../free-port.js";
|
|
8
8
|
import { createHash } from "node:crypto";
|
|
9
9
|
import { createReadStream, createWriteStream } from "node:fs";
|
|
10
10
|
import { mkdir, mkdtemp, rm, stat } from "node:fs/promises";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { init_loader, loadConfig } from "../../config/loader.js";
|
|
2
|
-
import { resolveBrowserBackendFromConfig } from "../../browser/backend-from-config.js";
|
|
3
2
|
import { loadPlaywrightCoreModule } from "../../browser/providers/playwright-doctor.js";
|
|
4
3
|
import { BrowserManager } from "../../browser/manager.js";
|
|
4
|
+
import { resolveBrowserBackendFromConfig } from "../../browser/backend-from-config.js";
|
|
5
5
|
import { createBrowserActionRegistry } from "../../browser/actions/registry.js";
|
|
6
6
|
import { runBrowserPipeline, validateBrowserPipeline } from "../../browser/pipeline/runner.js";
|
|
7
7
|
import { loadBrowserPipelineSource } from "../../browser/pipeline/source.js";
|
|
@@ -52,7 +52,7 @@ async function checkDatabaseSchema(ctx) {
|
|
|
52
52
|
id: "database-schema",
|
|
53
53
|
label: "Database schema",
|
|
54
54
|
status: "pass",
|
|
55
|
-
message: `SQLite schema v${status.dbVersion} (current release
|
|
55
|
+
message: `SQLite schema v${status.dbVersion} (current release v5).`,
|
|
56
56
|
hints: []
|
|
57
57
|
};
|
|
58
58
|
}
|
|
@@ -183,6 +183,7 @@ export declare function resolveSkillsCachePath(config: Config, agentId: string):
|
|
|
183
183
|
* Resolve the bundled extensions directory (shipped with xopc).
|
|
184
184
|
*
|
|
185
185
|
* Layout-dependent candidates (first existing wins):
|
|
186
|
+
* - `XOPC_BUNDLED_EXTENSIONS_ROOT` (Electron packaged gateway override)
|
|
186
187
|
* - `dist/src/config` → `dist/extensions` (npm / gateway)
|
|
187
188
|
* - `src/config` → `extensions/` (dev, tsx)
|
|
188
189
|
* - `out/server` → `dist/extensions` (Electron esbuild bundle)
|
package/dist/src/config/paths.js
CHANGED
|
@@ -237,11 +237,14 @@ function resolveSkillsCachePath(config, agentId) {
|
|
|
237
237
|
* Resolve the bundled extensions directory (shipped with xopc).
|
|
238
238
|
*
|
|
239
239
|
* Layout-dependent candidates (first existing wins):
|
|
240
|
+
* - `XOPC_BUNDLED_EXTENSIONS_ROOT` (Electron packaged gateway override)
|
|
240
241
|
* - `dist/src/config` → `dist/extensions` (npm / gateway)
|
|
241
242
|
* - `src/config` → `extensions/` (dev, tsx)
|
|
242
243
|
* - `out/server` → `dist/extensions` (Electron esbuild bundle)
|
|
243
244
|
*/
|
|
244
245
|
function resolveBundledExtensionsDir() {
|
|
246
|
+
const envDir = process.env[ENV_BUNDLED_EXTENSIONS_ROOT];
|
|
247
|
+
if (envDir && existsSync(envDir)) return envDir;
|
|
245
248
|
try {
|
|
246
249
|
const srcDir = dirname(fileURLToPath(import.meta.url));
|
|
247
250
|
const candidates = [
|
|
@@ -287,11 +290,12 @@ function resolveExtensionSdkPath() {
|
|
|
287
290
|
return join(process.cwd(), "src", "extensions", "sdk", "index.ts");
|
|
288
291
|
}
|
|
289
292
|
}
|
|
290
|
-
var FILENAMES, WORKSPACE_FILES;
|
|
293
|
+
var ENV_BUNDLED_EXTENSIONS_ROOT, FILENAMES, WORKSPACE_FILES;
|
|
291
294
|
var init_paths = __esmMin((() => {
|
|
292
295
|
init_agent_scope();
|
|
293
296
|
init_paths_state();
|
|
294
297
|
init_workspace_defaults();
|
|
298
|
+
ENV_BUNDLED_EXTENSIONS_ROOT = "XOPC_BUNDLED_EXTENSIONS_ROOT";
|
|
295
299
|
FILENAMES = {
|
|
296
300
|
CONFIG: "xopc.json",
|
|
297
301
|
MODELS_JSON: "models.json",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","names":["resolveAgentDirScoped","resolveAgentHomeScoped","resolveAgentProfileDirScoped","resolveAgentProfileMarkdownPathScoped"],"sources":["../../../src/config/paths.ts"],"sourcesContent":["import { join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { dirname } from 'path';\nimport { existsSync } from 'fs';\n\nimport type { Config } from './schema.js';\nimport {\n resolveAgentDir as resolveAgentDirScoped,\n resolveAgentHomeDir as resolveAgentHomeScoped,\n resolveAgentProfileDir as resolveAgentProfileDirScoped,\n resolveAgentProfileMarkdownPath as resolveAgentProfileMarkdownPathScoped,\n resolveAgentWorkspaceDir,\n} from '../agent/agent-scope.js';\nimport { ENV_VARS, resolveStateDir } from './paths-state.js';\n\nexport { ENV_VARS, resolveHomeDir, resolveStateDir, resolveXopcDatabasePath, XOPC_DB_FILENAME } from './paths-state.js';\nexport { resolveDefaultAgentWorkspaceDir } from './workspace-defaults.js';\nexport {\n resolveAgentWorkspaceDir,\n resolveAgentDir as resolveAgentDirFromConfig,\n resolveAgentHomeDir as resolveAgentHomeDirFromConfig,\n} from '../agent/agent-scope.js';\n\n// ============================================\n// File Names\n// ============================================\nexport const FILENAMES = {\n CONFIG: 'xopc.json',\n MODELS_JSON: 'models.json',\n /** Primary SQLite state database (`~/.xopc/xopc.db`). */\n XOPC_DB: 'xopc.db',\n EXTENSIONS_LOCK: 'extensions-lock.json',\n CREDENTIALS_PROFILES: 'auth-profiles.json',\n CRON_JOBS: 'jobs.json',\n WORKSPACE_STATE: 'workspace.json',\n SKILLS_CACHE: 'skills-cache.json',\n /** Hub / CLI install provenance for ~/.xopc/skills/<id>. */\n SKILLS_LOCK: 'skills-lock.json',\n PID: 'pid',\n STATUS: 'status.json',\n SOCKET: 'agent.sock',\n} as const;\n\n// ============================================\n// Workspace Files\n// ============================================\nexport const WORKSPACE_FILES = {\n SOUL: 'SOUL.md',\n IDENTITY: 'IDENTITY.md',\n USER: 'USER.md',\n AGENTS: 'AGENTS.md',\n TOOLS: 'TOOLS.md',\n HEARTBEAT: 'HEARTBEAT.md',\n MEMORY: 'MEMORY.md',\n} as const;\n\n// ============================================\n// Path Resolution Functions\n// ============================================\n\n/**\n * Resolve the main config file path\n */\nexport function resolveConfigPath(): string {\n return process.env[ENV_VARS.CONFIG_PATH] ?? join(resolveStateDir(), FILENAMES.CONFIG);\n}\n\n/**\n * Resolve the credentials directory\n */\nexport function resolveCredentialsDir(): string {\n return process.env[ENV_VARS.CREDENTIALS_DIR] ?? join(resolveStateDir(), 'credentials');\n}\n\n/**\n * Resolve the global auth-profiles.json path\n */\nexport function resolveAuthProfilesPath(): string {\n return join(resolveCredentialsDir(), FILENAMES.CREDENTIALS_PROFILES);\n}\n\n/**\n * Resolve OAuth token file path for a provider\n */\nexport function resolveOAuthPath(provider: string): string {\n return join(resolveCredentialsDir(), 'oauth', `${provider}.json`);\n}\n\n/**\n * Internal agent state dir: `stateDir/agents/<id>/agent/`\n * (credentials, inbox IPC, pid, agent.json — not the Markdown workspace).\n */\nexport function resolveAgentDir(config: Config, agentId: string): string {\n return resolveAgentDirScoped(config, agentId);\n}\n\n/**\n * Per-agent home: `stateDir/agents/<id>/` (sessions + `agent/`).\n */\nexport function resolveAgentHomeDir(config: Config, agentId: string): string {\n return resolveAgentHomeScoped(config, agentId);\n}\n\n/** Agent profile Markdown root: `stateDir/agents/<id>/profile/`. */\nexport function resolveAgentProfileDir(config: Config, agentId: string): string {\n return resolveAgentProfileDirScoped(config, agentId);\n}\n\n/** Single file under {@link resolveAgentProfileDir} (basename only). */\nexport function resolveAgentProfileMarkdownPath(config: Config, agentId: string, filename: string): string {\n return resolveAgentProfileMarkdownPathScoped(config, agentId, filename);\n}\n\n/**\n * Resolve a profile system Markdown path (SOUL.md, …) under the agent `profile/` directory.\n */\nexport function resolveWorkspaceFile(config: Config, filename: string, agentId: string): string {\n return join(resolveAgentProfileDirScoped(config, agentId), filename);\n}\n\n/**\n * OpenClaw-aligned: per-agent auth-profiles.json directly under agent dir (no credentials subdirectory).\n */\nexport function resolveAgentAuthProfilesPath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), FILENAMES.CREDENTIALS_PROFILES);\n}\n\n/**\n * Resolve the inbox directory for an agent\n */\nexport function resolveInboxDir(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), 'inbox');\n}\n\n/**\n * Resolve the pending inbox directory\n */\nexport function resolveInboxPendingDir(config: Config, agentId: string): string {\n return join(resolveInboxDir(config, agentId), 'pending');\n}\n\n/**\n * Resolve the processed inbox directory\n */\nexport function resolveInboxProcessedDir(config: Config, agentId: string): string {\n return join(resolveInboxDir(config, agentId), 'processed');\n}\n\n/**\n * Resolve a specific inbox message path\n */\nexport function resolveInboxMessagePath(\n config: Config,\n messageId: string,\n pending: boolean,\n agentId: string,\n): string {\n const dir = pending ? resolveInboxPendingDir(config, agentId) : resolveInboxProcessedDir(config, agentId);\n return join(dir, `${messageId}.json`);\n}\n\n/**\n * Resolve the pid file path\n */\nexport function resolvePidPath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), FILENAMES.PID);\n}\n\n/**\n * Resolve the status.json path\n */\nexport function resolveStatusPath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), FILENAMES.STATUS);\n}\n\n/**\n * Resolve the Unix socket path\n */\nexport function resolveSocketPath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), FILENAMES.SOCKET);\n}\n\n/**\n * Resolve the extensions directory (global)\n */\nexport function resolveExtensionsDir(): string {\n return join(resolveStateDir(), 'extensions');\n}\n\n/**\n * Resolve the extensions lockfile path\n */\nexport function resolveExtensionsLockPath(): string {\n return join(resolveExtensionsDir(), FILENAMES.EXTENSIONS_LOCK);\n}\n\n/**\n * Per-agent extensions directory (`…/agents/<id>/agent/extensions/`) — used for discovery of\n * legacy or manually placed copies. CLI, web store, and `extensions dev` symlink installs use\n * {@link resolveExtensionsDir} (`~/.xopc/extensions`) only.\n */\nexport function resolveWorkspaceExtensionsDir(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), 'extensions');\n}\n\n/**\n * Resolve the skills directory (global)\n */\nexport function resolveSkillsDir(): string {\n return join(resolveStateDir(), 'skills');\n}\n\n/**\n * Resolve a specific skill path\n */\nexport function resolveSkillPath(skillId: string): string {\n return join(resolveSkillsDir(), skillId, 'SKILL.md');\n}\n\n/**\n * Skills hub lock file (~/.xopc/skills-lock.json): install source + content hash per managed skill id.\n */\nexport function resolveSkillsLockPath(): string {\n return join(resolveStateDir(), FILENAMES.SKILLS_LOCK);\n}\n\n/**\n * Resolve the cron directory\n */\nexport function resolveCronDir(): string {\n return join(resolveStateDir(), 'cron');\n}\n\n/**\n * Resolve the cron jobs file path\n */\nexport function resolveCronJobsPath(): string {\n return join(resolveCronDir(), FILENAMES.CRON_JOBS);\n}\n\n/**\n * Resolve the logs directory\n */\nexport function resolveLogsDir(): string {\n return process.env[ENV_VARS.LOG_DIR] ?? join(resolveStateDir(), 'logs');\n}\n\n/**\n * Resolve a specific log file path\n */\nexport function resolveLogPath(date: string): string {\n return join(resolveLogsDir(), `xopc-${date}.log`);\n}\n\n/**\n * Resolve the bin directory\n */\nexport function resolveBinDir(): string {\n return join(resolveStateDir(), 'bin');\n}\n\n/**\n * Resolve the xopc CLI path\n */\nexport function resolveXopcBinPath(): string {\n return join(resolveBinDir(), 'xopc');\n}\n\n/**\n * Resolve the tools directory\n */\nexport function resolveToolsDir(): string {\n return join(resolveStateDir(), 'tools');\n}\n\n/**\n * Resolve the Node.js tools directory\n */\nexport function resolveNodeToolsDir(): string {\n return join(resolveToolsDir(), 'node');\n}\n\n/**\n * Resolve the current Node.js bin directory\n */\nexport function resolveNodeBinDir(): string {\n return join(resolveNodeToolsDir(), 'current', 'bin');\n}\n\n/**\n * Resolve the node binary path\n */\nexport function resolveNodeBinPath(): string {\n return join(resolveNodeBinDir(), 'node');\n}\n\n/**\n * Resolve the npm binary path\n */\nexport function resolveNpmBinPath(): string {\n return join(resolveNodeBinDir(), 'npm');\n}\n\n/**\n * Resolve the models.json path\n */\nexport function resolveModelsJsonPath(): string {\n return join(resolveStateDir(), FILENAMES.MODELS_JSON);\n}\n\n/**\n * OpenClaw-aligned: workspace setup state directory (`<workspace>/.xopc/`).\n */\nexport function resolveWorkspaceStateDir(config: Config, agentId: string): string {\n return join(resolveAgentWorkspaceDir(config, agentId), '.xopc');\n}\n\n/**\n * OpenClaw-aligned: workspace setup state file (`<workspace>/.xopc/workspace.json`).\n */\nexport function resolveWorkspaceStatePath(config: Config, agentId: string): string {\n return join(resolveWorkspaceStateDir(config, agentId), FILENAMES.WORKSPACE_STATE);\n}\n\n/**\n * Resolve the skills cache file path (internal agent state, under agent dir).\n */\nexport function resolveSkillsCachePath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), 'state', FILENAMES.SKILLS_CACHE);\n}\n\n/**\n * Resolve the bundled extensions directory (shipped with xopc).\n *\n * Layout-dependent candidates (first existing wins):\n * - `dist/src/config` → `dist/extensions` (npm / gateway)\n * - `src/config` → `extensions/` (dev, tsx)\n * - `out/server` → `dist/extensions` (Electron esbuild bundle)\n */\nexport function resolveBundledExtensionsDir(): string | null {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n const srcDir = dirname(currentFile);\n const candidates = [\n join(srcDir, '..', '..', 'extensions'),\n join(srcDir, '..', '..', 'dist', 'extensions'),\n join(srcDir, '..', '..', '..', 'extensions'),\n ];\n for (const dir of candidates) {\n if (existsSync(dir)) {\n return dir;\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve the bundled skills directory (shipped with xopc)\n */\nexport function resolveBundledSkillsDir(): string | null {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n const srcDir = dirname(currentFile);\n \n // Production (npm): dist/config/paths.js -> ../../ -> package root -> skills\n const packageRoot = join(srcDir, '..', '..');\n const skillsDir = join(packageRoot, 'skills');\n if (existsSync(skillsDir)) {\n return skillsDir;\n }\n \n // Development (source): src/config/paths.js -> ../../../ -> package root -> skills\n const devPackageRoot = join(srcDir, '..', '..', '..');\n const devSkillsDir = join(devPackageRoot, 'skills');\n if (existsSync(devSkillsDir)) {\n return devSkillsDir;\n }\n \n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Path to extension-sdk entry (for jiti / extension loader aliases).\n */\nexport function resolveExtensionSdkPath(): string {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n const srcDir = dirname(currentFile);\n const adjacent = join(srcDir, '..', 'extensions', 'sdk', 'index.ts');\n if (existsSync(adjacent)) {\n return adjacent;\n }\n const fromPackageRoot = join(srcDir, '..', '..', 'src', 'extensions', 'sdk', 'index.ts');\n if (existsSync(fromPackageRoot)) {\n return fromPackageRoot;\n }\n const cwd = join(process.cwd(), 'src', 'extensions', 'sdk', 'index.ts');\n if (existsSync(cwd)) {\n return cwd;\n }\n return adjacent;\n } catch {\n return join(process.cwd(), 'src', 'extensions', 'sdk', 'index.ts');\n }\n}\n\n// Re-export existsSync for bundled paths\nexport { existsSync };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paths.js","names":["resolveAgentDirScoped","resolveAgentHomeScoped","resolveAgentProfileDirScoped","resolveAgentProfileMarkdownPathScoped"],"sources":["../../../src/config/paths.ts"],"sourcesContent":["import { join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { dirname } from 'path';\nimport { existsSync } from 'fs';\n\nimport type { Config } from './schema.js';\nimport {\n resolveAgentDir as resolveAgentDirScoped,\n resolveAgentHomeDir as resolveAgentHomeScoped,\n resolveAgentProfileDir as resolveAgentProfileDirScoped,\n resolveAgentProfileMarkdownPath as resolveAgentProfileMarkdownPathScoped,\n resolveAgentWorkspaceDir,\n} from '../agent/agent-scope.js';\nimport { ENV_VARS, resolveStateDir } from './paths-state.js';\n\nexport { ENV_VARS, resolveHomeDir, resolveStateDir, resolveXopcDatabasePath, XOPC_DB_FILENAME } from './paths-state.js';\nexport { resolveDefaultAgentWorkspaceDir } from './workspace-defaults.js';\nexport {\n resolveAgentWorkspaceDir,\n resolveAgentDir as resolveAgentDirFromConfig,\n resolveAgentHomeDir as resolveAgentHomeDirFromConfig,\n} from '../agent/agent-scope.js';\n\n// ============================================\n// File Names\n// ============================================\nconst ENV_BUNDLED_EXTENSIONS_ROOT = 'XOPC_BUNDLED_EXTENSIONS_ROOT';\n\nexport const FILENAMES = {\n CONFIG: 'xopc.json',\n MODELS_JSON: 'models.json',\n /** Primary SQLite state database (`~/.xopc/xopc.db`). */\n XOPC_DB: 'xopc.db',\n EXTENSIONS_LOCK: 'extensions-lock.json',\n CREDENTIALS_PROFILES: 'auth-profiles.json',\n CRON_JOBS: 'jobs.json',\n WORKSPACE_STATE: 'workspace.json',\n SKILLS_CACHE: 'skills-cache.json',\n /** Hub / CLI install provenance for ~/.xopc/skills/<id>. */\n SKILLS_LOCK: 'skills-lock.json',\n PID: 'pid',\n STATUS: 'status.json',\n SOCKET: 'agent.sock',\n} as const;\n\n// ============================================\n// Workspace Files\n// ============================================\nexport const WORKSPACE_FILES = {\n SOUL: 'SOUL.md',\n IDENTITY: 'IDENTITY.md',\n USER: 'USER.md',\n AGENTS: 'AGENTS.md',\n TOOLS: 'TOOLS.md',\n HEARTBEAT: 'HEARTBEAT.md',\n MEMORY: 'MEMORY.md',\n} as const;\n\n// ============================================\n// Path Resolution Functions\n// ============================================\n\n/**\n * Resolve the main config file path\n */\nexport function resolveConfigPath(): string {\n return process.env[ENV_VARS.CONFIG_PATH] ?? join(resolveStateDir(), FILENAMES.CONFIG);\n}\n\n/**\n * Resolve the credentials directory\n */\nexport function resolveCredentialsDir(): string {\n return process.env[ENV_VARS.CREDENTIALS_DIR] ?? join(resolveStateDir(), 'credentials');\n}\n\n/**\n * Resolve the global auth-profiles.json path\n */\nexport function resolveAuthProfilesPath(): string {\n return join(resolveCredentialsDir(), FILENAMES.CREDENTIALS_PROFILES);\n}\n\n/**\n * Resolve OAuth token file path for a provider\n */\nexport function resolveOAuthPath(provider: string): string {\n return join(resolveCredentialsDir(), 'oauth', `${provider}.json`);\n}\n\n/**\n * Internal agent state dir: `stateDir/agents/<id>/agent/`\n * (credentials, inbox IPC, pid, agent.json — not the Markdown workspace).\n */\nexport function resolveAgentDir(config: Config, agentId: string): string {\n return resolveAgentDirScoped(config, agentId);\n}\n\n/**\n * Per-agent home: `stateDir/agents/<id>/` (sessions + `agent/`).\n */\nexport function resolveAgentHomeDir(config: Config, agentId: string): string {\n return resolveAgentHomeScoped(config, agentId);\n}\n\n/** Agent profile Markdown root: `stateDir/agents/<id>/profile/`. */\nexport function resolveAgentProfileDir(config: Config, agentId: string): string {\n return resolveAgentProfileDirScoped(config, agentId);\n}\n\n/** Single file under {@link resolveAgentProfileDir} (basename only). */\nexport function resolveAgentProfileMarkdownPath(config: Config, agentId: string, filename: string): string {\n return resolveAgentProfileMarkdownPathScoped(config, agentId, filename);\n}\n\n/**\n * Resolve a profile system Markdown path (SOUL.md, …) under the agent `profile/` directory.\n */\nexport function resolveWorkspaceFile(config: Config, filename: string, agentId: string): string {\n return join(resolveAgentProfileDirScoped(config, agentId), filename);\n}\n\n/**\n * OpenClaw-aligned: per-agent auth-profiles.json directly under agent dir (no credentials subdirectory).\n */\nexport function resolveAgentAuthProfilesPath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), FILENAMES.CREDENTIALS_PROFILES);\n}\n\n/**\n * Resolve the inbox directory for an agent\n */\nexport function resolveInboxDir(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), 'inbox');\n}\n\n/**\n * Resolve the pending inbox directory\n */\nexport function resolveInboxPendingDir(config: Config, agentId: string): string {\n return join(resolveInboxDir(config, agentId), 'pending');\n}\n\n/**\n * Resolve the processed inbox directory\n */\nexport function resolveInboxProcessedDir(config: Config, agentId: string): string {\n return join(resolveInboxDir(config, agentId), 'processed');\n}\n\n/**\n * Resolve a specific inbox message path\n */\nexport function resolveInboxMessagePath(\n config: Config,\n messageId: string,\n pending: boolean,\n agentId: string,\n): string {\n const dir = pending ? resolveInboxPendingDir(config, agentId) : resolveInboxProcessedDir(config, agentId);\n return join(dir, `${messageId}.json`);\n}\n\n/**\n * Resolve the pid file path\n */\nexport function resolvePidPath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), FILENAMES.PID);\n}\n\n/**\n * Resolve the status.json path\n */\nexport function resolveStatusPath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), FILENAMES.STATUS);\n}\n\n/**\n * Resolve the Unix socket path\n */\nexport function resolveSocketPath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), FILENAMES.SOCKET);\n}\n\n/**\n * Resolve the extensions directory (global)\n */\nexport function resolveExtensionsDir(): string {\n return join(resolveStateDir(), 'extensions');\n}\n\n/**\n * Resolve the extensions lockfile path\n */\nexport function resolveExtensionsLockPath(): string {\n return join(resolveExtensionsDir(), FILENAMES.EXTENSIONS_LOCK);\n}\n\n/**\n * Per-agent extensions directory (`…/agents/<id>/agent/extensions/`) — used for discovery of\n * legacy or manually placed copies. CLI, web store, and `extensions dev` symlink installs use\n * {@link resolveExtensionsDir} (`~/.xopc/extensions`) only.\n */\nexport function resolveWorkspaceExtensionsDir(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), 'extensions');\n}\n\n/**\n * Resolve the skills directory (global)\n */\nexport function resolveSkillsDir(): string {\n return join(resolveStateDir(), 'skills');\n}\n\n/**\n * Resolve a specific skill path\n */\nexport function resolveSkillPath(skillId: string): string {\n return join(resolveSkillsDir(), skillId, 'SKILL.md');\n}\n\n/**\n * Skills hub lock file (~/.xopc/skills-lock.json): install source + content hash per managed skill id.\n */\nexport function resolveSkillsLockPath(): string {\n return join(resolveStateDir(), FILENAMES.SKILLS_LOCK);\n}\n\n/**\n * Resolve the cron directory\n */\nexport function resolveCronDir(): string {\n return join(resolveStateDir(), 'cron');\n}\n\n/**\n * Resolve the cron jobs file path\n */\nexport function resolveCronJobsPath(): string {\n return join(resolveCronDir(), FILENAMES.CRON_JOBS);\n}\n\n/**\n * Resolve the logs directory\n */\nexport function resolveLogsDir(): string {\n return process.env[ENV_VARS.LOG_DIR] ?? join(resolveStateDir(), 'logs');\n}\n\n/**\n * Resolve a specific log file path\n */\nexport function resolveLogPath(date: string): string {\n return join(resolveLogsDir(), `xopc-${date}.log`);\n}\n\n/**\n * Resolve the bin directory\n */\nexport function resolveBinDir(): string {\n return join(resolveStateDir(), 'bin');\n}\n\n/**\n * Resolve the xopc CLI path\n */\nexport function resolveXopcBinPath(): string {\n return join(resolveBinDir(), 'xopc');\n}\n\n/**\n * Resolve the tools directory\n */\nexport function resolveToolsDir(): string {\n return join(resolveStateDir(), 'tools');\n}\n\n/**\n * Resolve the Node.js tools directory\n */\nexport function resolveNodeToolsDir(): string {\n return join(resolveToolsDir(), 'node');\n}\n\n/**\n * Resolve the current Node.js bin directory\n */\nexport function resolveNodeBinDir(): string {\n return join(resolveNodeToolsDir(), 'current', 'bin');\n}\n\n/**\n * Resolve the node binary path\n */\nexport function resolveNodeBinPath(): string {\n return join(resolveNodeBinDir(), 'node');\n}\n\n/**\n * Resolve the npm binary path\n */\nexport function resolveNpmBinPath(): string {\n return join(resolveNodeBinDir(), 'npm');\n}\n\n/**\n * Resolve the models.json path\n */\nexport function resolveModelsJsonPath(): string {\n return join(resolveStateDir(), FILENAMES.MODELS_JSON);\n}\n\n/**\n * OpenClaw-aligned: workspace setup state directory (`<workspace>/.xopc/`).\n */\nexport function resolveWorkspaceStateDir(config: Config, agentId: string): string {\n return join(resolveAgentWorkspaceDir(config, agentId), '.xopc');\n}\n\n/**\n * OpenClaw-aligned: workspace setup state file (`<workspace>/.xopc/workspace.json`).\n */\nexport function resolveWorkspaceStatePath(config: Config, agentId: string): string {\n return join(resolveWorkspaceStateDir(config, agentId), FILENAMES.WORKSPACE_STATE);\n}\n\n/**\n * Resolve the skills cache file path (internal agent state, under agent dir).\n */\nexport function resolveSkillsCachePath(config: Config, agentId: string): string {\n return join(resolveAgentDir(config, agentId), 'state', FILENAMES.SKILLS_CACHE);\n}\n\n/**\n * Resolve the bundled extensions directory (shipped with xopc).\n *\n * Layout-dependent candidates (first existing wins):\n * - `XOPC_BUNDLED_EXTENSIONS_ROOT` (Electron packaged gateway override)\n * - `dist/src/config` → `dist/extensions` (npm / gateway)\n * - `src/config` → `extensions/` (dev, tsx)\n * - `out/server` → `dist/extensions` (Electron esbuild bundle)\n */\nexport function resolveBundledExtensionsDir(): string | null {\n const envDir = process.env[ENV_BUNDLED_EXTENSIONS_ROOT];\n if (envDir && existsSync(envDir)) {\n return envDir;\n }\n\n try {\n const currentFile = fileURLToPath(import.meta.url);\n const srcDir = dirname(currentFile);\n const candidates = [\n join(srcDir, '..', '..', 'extensions'),\n join(srcDir, '..', '..', 'dist', 'extensions'),\n join(srcDir, '..', '..', '..', 'extensions'),\n ];\n for (const dir of candidates) {\n if (existsSync(dir)) {\n return dir;\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve the bundled skills directory (shipped with xopc)\n */\nexport function resolveBundledSkillsDir(): string | null {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n const srcDir = dirname(currentFile);\n \n // Production (npm): dist/config/paths.js -> ../../ -> package root -> skills\n const packageRoot = join(srcDir, '..', '..');\n const skillsDir = join(packageRoot, 'skills');\n if (existsSync(skillsDir)) {\n return skillsDir;\n }\n \n // Development (source): src/config/paths.js -> ../../../ -> package root -> skills\n const devPackageRoot = join(srcDir, '..', '..', '..');\n const devSkillsDir = join(devPackageRoot, 'skills');\n if (existsSync(devSkillsDir)) {\n return devSkillsDir;\n }\n \n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Path to extension-sdk entry (for jiti / extension loader aliases).\n */\nexport function resolveExtensionSdkPath(): string {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n const srcDir = dirname(currentFile);\n const adjacent = join(srcDir, '..', 'extensions', 'sdk', 'index.ts');\n if (existsSync(adjacent)) {\n return adjacent;\n }\n const fromPackageRoot = join(srcDir, '..', '..', 'src', 'extensions', 'sdk', 'index.ts');\n if (existsSync(fromPackageRoot)) {\n return fromPackageRoot;\n }\n const cwd = join(process.cwd(), 'src', 'extensions', 'sdk', 'index.ts');\n if (existsSync(cwd)) {\n return cwd;\n }\n return adjacent;\n } catch {\n return join(process.cwd(), 'src', 'extensions', 'sdk', 'index.ts');\n }\n}\n\n// Re-export existsSync for bundled paths\nexport { existsSync };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type DocumentExtractionResult = {
|
|
2
|
+
ok: true;
|
|
3
|
+
text: string;
|
|
4
|
+
kind: 'plain' | 'pdf';
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function extractDocumentText(params: {
|
|
10
|
+
buffer: Buffer;
|
|
11
|
+
fileName: string;
|
|
12
|
+
mimeType?: string;
|
|
13
|
+
}): DocumentExtractionResult;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { extname } from "node:path";
|
|
2
|
+
//#region src/document-understanding/extract.ts
|
|
3
|
+
const MAX_EXTRACTED_CHARS = 6e4;
|
|
4
|
+
function truncate(text) {
|
|
5
|
+
return text.length > MAX_EXTRACTED_CHARS ? `${text.slice(0, MAX_EXTRACTED_CHARS)}\n\n[document extraction truncated ${text.length - MAX_EXTRACTED_CHARS} chars]` : text;
|
|
6
|
+
}
|
|
7
|
+
function decodePdfEscapedString(input) {
|
|
8
|
+
return input.replace(/\\n/g, "\n").replace(/\\r/g, "\n").replace(/\\t/g, " ").replace(/\\\(/g, "(").replace(/\\\)/g, ")").replace(/\\\\/g, "\\");
|
|
9
|
+
}
|
|
10
|
+
function extractPdfLiteralStrings(raw) {
|
|
11
|
+
const out = [];
|
|
12
|
+
for (const match of raw.matchAll(/\((?:\\.|[^\\()])*\)\s*T[Jj]/g)) {
|
|
13
|
+
const token = match[0];
|
|
14
|
+
const text = decodePdfEscapedString(token.slice(1, token.lastIndexOf(")"))).trim();
|
|
15
|
+
if (text.length >= 2) out.push(text);
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
function extractPdfHexStrings(raw) {
|
|
20
|
+
const out = [];
|
|
21
|
+
for (const match of raw.matchAll(/<([0-9a-fA-F\s]{6,})>\s*T[Jj]/g)) {
|
|
22
|
+
const hex = (match[1] ?? "").replace(/\s+/g, "");
|
|
23
|
+
if (hex.length < 6 || hex.length % 2 !== 0) continue;
|
|
24
|
+
const bytes = [];
|
|
25
|
+
for (let i = 0; i < hex.length; i += 2) bytes.push(Number.parseInt(hex.slice(i, i + 2), 16));
|
|
26
|
+
const buf = Buffer.from(bytes);
|
|
27
|
+
const text = (buf.length >= 2 && (buf[0] === 254 && buf[1] === 255 || buf[0] === 255 && buf[1] === 254) ? buf.toString("utf16le") : buf.toString("utf8")).replace(/[\u0000-\u001f]+/g, " ").trim();
|
|
28
|
+
if (text.length >= 2) out.push(text);
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
function extractPdfText(buffer) {
|
|
33
|
+
const raw = buffer.toString("latin1");
|
|
34
|
+
const parts = [...extractPdfLiteralStrings(raw), ...extractPdfHexStrings(raw)].map((line) => line.replace(/\s+/g, " ").trim()).filter(Boolean);
|
|
35
|
+
const text = Array.from(new Set(parts)).join("\n");
|
|
36
|
+
if (!text.trim()) return {
|
|
37
|
+
ok: false,
|
|
38
|
+
reason: "PDF text extraction found no text; scanned or compressed PDFs require a dedicated extractor."
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
ok: true,
|
|
42
|
+
kind: "pdf",
|
|
43
|
+
text: truncate(text)
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function extractDocumentText(params) {
|
|
47
|
+
const ext = extname(params.fileName).toLowerCase();
|
|
48
|
+
const mime = params.mimeType?.toLowerCase() ?? "";
|
|
49
|
+
if (mime === "application/pdf" || ext === ".pdf") return extractPdfText(params.buffer);
|
|
50
|
+
if (mime.startsWith("text/")) return {
|
|
51
|
+
ok: true,
|
|
52
|
+
kind: "plain",
|
|
53
|
+
text: truncate(params.buffer.toString("utf8"))
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
ok: false,
|
|
57
|
+
reason: `No document extractor registered for ${params.mimeType || ext || "unknown type"}.`
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { extractDocumentText };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../src/document-understanding/extract.ts"],"sourcesContent":["import { extname } from 'node:path';\n\nexport type DocumentExtractionResult =\n | { ok: true; text: string; kind: 'plain' | 'pdf' }\n | { ok: false; reason: string };\n\nconst MAX_EXTRACTED_CHARS = 60_000;\n\nfunction truncate(text: string): string {\n return text.length > MAX_EXTRACTED_CHARS\n ? `${text.slice(0, MAX_EXTRACTED_CHARS)}\\n\\n[document extraction truncated ${text.length - MAX_EXTRACTED_CHARS} chars]`\n : text;\n}\n\nfunction decodePdfEscapedString(input: string): string {\n return input\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\r/g, '\\n')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\\\(/g, '(')\n .replace(/\\\\\\)/g, ')')\n .replace(/\\\\\\\\/g, '\\\\');\n}\n\nfunction extractPdfLiteralStrings(raw: string): string[] {\n const out: string[] = [];\n const re = /\\((?:\\\\.|[^\\\\()])*\\)\\s*T[Jj]/g;\n for (const match of raw.matchAll(re)) {\n const token = match[0];\n const body = token.slice(1, token.lastIndexOf(')'));\n const text = decodePdfEscapedString(body).trim();\n if (text.length >= 2) out.push(text);\n }\n return out;\n}\n\nfunction extractPdfHexStrings(raw: string): string[] {\n const out: string[] = [];\n const re = /<([0-9a-fA-F\\s]{6,})>\\s*T[Jj]/g;\n for (const match of raw.matchAll(re)) {\n const hex = (match[1] ?? '').replace(/\\s+/g, '');\n if (hex.length < 6 || hex.length % 2 !== 0) continue;\n const bytes: number[] = [];\n for (let i = 0; i < hex.length; i += 2) bytes.push(Number.parseInt(hex.slice(i, i + 2), 16));\n const buf = Buffer.from(bytes);\n const utf16 = buf.length >= 2 && ((buf[0] === 0xfe && buf[1] === 0xff) || (buf[0] === 0xff && buf[1] === 0xfe));\n const text = (utf16 ? buf.toString('utf16le') : buf.toString('utf8')).replace(/[\\u0000-\\u001f]+/g, ' ').trim();\n if (text.length >= 2) out.push(text);\n }\n return out;\n}\n\nfunction extractPdfText(buffer: Buffer): DocumentExtractionResult {\n const raw = buffer.toString('latin1');\n const parts = [...extractPdfLiteralStrings(raw), ...extractPdfHexStrings(raw)]\n .map((line) => line.replace(/\\s+/g, ' ').trim())\n .filter(Boolean);\n const text = Array.from(new Set(parts)).join('\\n');\n if (!text.trim()) {\n return { ok: false, reason: 'PDF text extraction found no text; scanned or compressed PDFs require a dedicated extractor.' };\n }\n return { ok: true, kind: 'pdf', text: truncate(text) };\n}\n\nexport function extractDocumentText(params: {\n buffer: Buffer;\n fileName: string;\n mimeType?: string;\n}): DocumentExtractionResult {\n const ext = extname(params.fileName).toLowerCase();\n const mime = params.mimeType?.toLowerCase() ?? '';\n if (mime === 'application/pdf' || ext === '.pdf') return extractPdfText(params.buffer);\n if (mime.startsWith('text/')) return { ok: true, kind: 'plain', text: truncate(params.buffer.toString('utf8')) };\n return { ok: false, reason: `No document extractor registered for ${params.mimeType || ext || 'unknown type'}.` };\n}\n"],"mappings":";;AAMA,MAAM,sBAAsB;AAE5B,SAAS,SAAS,MAAsB;AACtC,QAAO,KAAK,SAAS,sBACjB,GAAG,KAAK,MAAM,GAAG,oBAAoB,CAAC,qCAAqC,KAAK,SAAS,oBAAoB,WAC7G;;AAGN,SAAS,uBAAuB,OAAuB;AACrD,QAAO,MACJ,QAAQ,QAAQ,KAAK,CACrB,QAAQ,QAAQ,KAAK,CACrB,QAAQ,QAAQ,IAAK,CACrB,QAAQ,SAAS,IAAI,CACrB,QAAQ,SAAS,IAAI,CACrB,QAAQ,SAAS,KAAK;;AAG3B,SAAS,yBAAyB,KAAuB;CACvD,MAAM,MAAgB,EAAE;AAExB,MAAK,MAAM,SAAS,IAAI,SAAS,gCAAG,EAAE;EACpC,MAAM,QAAQ,MAAM;EAEpB,MAAM,OAAO,uBADA,MAAM,MAAM,GAAG,MAAM,YAAY,IAAI,CACV,CAAC,CAAC,MAAM;AAChD,MAAI,KAAK,UAAU,EAAG,KAAI,KAAK,KAAK;;AAEtC,QAAO;;AAGT,SAAS,qBAAqB,KAAuB;CACnD,MAAM,MAAgB,EAAE;AAExB,MAAK,MAAM,SAAS,IAAI,SAAS,iCAAG,EAAE;EACpC,MAAM,OAAO,MAAM,MAAM,IAAI,QAAQ,QAAQ,GAAG;AAChD,MAAI,IAAI,SAAS,KAAK,IAAI,SAAS,MAAM,EAAG;EAC5C,MAAM,QAAkB,EAAE;AAC1B,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,EAAG,OAAM,KAAK,OAAO,SAAS,IAAI,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC;EAC5F,MAAM,MAAM,OAAO,KAAK,MAAM;EAE9B,MAAM,QADQ,IAAI,UAAU,MAAO,IAAI,OAAO,OAAQ,IAAI,OAAO,OAAU,IAAI,OAAO,OAAQ,IAAI,OAAO,OACnF,IAAI,SAAS,UAAU,GAAG,IAAI,SAAS,OAAO,EAAE,QAAQ,qBAAqB,IAAI,CAAC,MAAM;AAC9G,MAAI,KAAK,UAAU,EAAG,KAAI,KAAK,KAAK;;AAEtC,QAAO;;AAGT,SAAS,eAAe,QAA0C;CAChE,MAAM,MAAM,OAAO,SAAS,SAAS;CACrC,MAAM,QAAQ,CAAC,GAAG,yBAAyB,IAAI,EAAE,GAAG,qBAAqB,IAAI,CAAC,CAC3E,KAAK,SAAS,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM,CAAC,CAC/C,OAAO,QAAQ;CAClB,MAAM,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK,KAAK;AAClD,KAAI,CAAC,KAAK,MAAM,CACd,QAAO;EAAE,IAAI;EAAO,QAAQ;EAAgG;AAE9H,QAAO;EAAE,IAAI;EAAM,MAAM;EAAO,MAAM,SAAS,KAAK;EAAE;;AAGxD,SAAgB,oBAAoB,QAIP;CAC3B,MAAM,MAAM,QAAQ,OAAO,SAAS,CAAC,aAAa;CAClD,MAAM,OAAO,OAAO,UAAU,aAAa,IAAI;AAC/C,KAAI,SAAS,qBAAqB,QAAQ,OAAQ,QAAO,eAAe,OAAO,OAAO;AACtF,KAAI,KAAK,WAAW,QAAQ,CAAE,QAAO;EAAE,IAAI;EAAM,MAAM;EAAS,MAAM,SAAS,OAAO,OAAO,SAAS,OAAO,CAAC;EAAE;AAChH,QAAO;EAAE,IAAI;EAAO,QAAQ,wCAAwC,OAAO,YAAY,OAAO,eAAe;EAAI"}
|
|
@@ -50,15 +50,6 @@ function buildNotePatch(body) {
|
|
|
50
50
|
if (body.aiDeep && typeof body.aiDeep === "object") patch.aiDeep = body.aiDeep;
|
|
51
51
|
return patch;
|
|
52
52
|
}
|
|
53
|
-
function buildNoteThreadContext(note) {
|
|
54
|
-
const title = note.title?.trim() || "未命名笔记";
|
|
55
|
-
const body = note.markdown.trim() || "这条笔记暂无正文。";
|
|
56
|
-
return [
|
|
57
|
-
`来源 Note:${title}`,
|
|
58
|
-
"",
|
|
59
|
-
body
|
|
60
|
-
].join("\n");
|
|
61
|
-
}
|
|
62
53
|
function noteThreadName(note) {
|
|
63
54
|
return `讨论:${note.title?.trim() || note.markdown.trim().slice(0, 28) || "未命名笔记"}`;
|
|
64
55
|
}
|
|
@@ -188,14 +179,29 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
188
179
|
const routingCfg = service.currentConfig;
|
|
189
180
|
let agentId = typeof body.agentId === "string" && body.agentId.trim() ? body.agentId.trim().toLowerCase() : getDefaultAgentId(routingCfg);
|
|
190
181
|
if (!agentExists(agentId, routingCfg)) agentId = getDefaultAgentId(routingCfg);
|
|
182
|
+
const sourceBinding = {
|
|
183
|
+
kind: "note",
|
|
184
|
+
sourceId: noteId,
|
|
185
|
+
version: String(note.updatedAt),
|
|
186
|
+
attachedAt: Date.now()
|
|
187
|
+
};
|
|
188
|
+
const forceNew = body.forceNew === true;
|
|
191
189
|
const existingKey = note.aiDeep?.catalysis?.sourceSessionKey;
|
|
192
|
-
if (existingKey) {
|
|
190
|
+
if (!forceNew && existingKey) {
|
|
193
191
|
const existingSession = await service.sessions.getSession(existingKey);
|
|
194
|
-
if (existingSession)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
192
|
+
if (existingSession) {
|
|
193
|
+
const meta = await service.sessionIndexInstance.getSessionMetadata(existingKey);
|
|
194
|
+
await service.sessionIndexInstance.updateSessionMetadata(existingKey, { customData: {
|
|
195
|
+
...meta?.customData ?? {},
|
|
196
|
+
sourceBinding
|
|
197
|
+
} });
|
|
198
|
+
return c.json({
|
|
199
|
+
session: existingSession,
|
|
200
|
+
sessionKey: existingKey,
|
|
201
|
+
reused: true,
|
|
202
|
+
sourceBinding
|
|
203
|
+
});
|
|
204
|
+
}
|
|
199
205
|
}
|
|
200
206
|
const sessionKey = buildSessionKey({
|
|
201
207
|
agentId,
|
|
@@ -205,23 +211,13 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
205
211
|
peerId: `note_${noteId}_${Date.now()}`
|
|
206
212
|
});
|
|
207
213
|
await service.sessionIndexInstance.saveMessages(sessionKey, []);
|
|
208
|
-
await service.sessionIndexInstance.appendTranscriptContextEntry(sessionKey, {
|
|
209
|
-
id: `source-note:${noteId}`,
|
|
210
|
-
text: buildNoteThreadContext(note),
|
|
211
|
-
data: {
|
|
212
|
-
kind: "source_note",
|
|
213
|
-
noteId,
|
|
214
|
-
title: note.title ?? ""
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
214
|
const meta = await service.sessionIndexInstance.getSessionMetadata(sessionKey);
|
|
218
215
|
await service.sessionIndexInstance.updateSessionMetadata(sessionKey, {
|
|
219
216
|
name: noteThreadName(note),
|
|
220
217
|
tags: Array.from(new Set([...meta?.tags ?? [], "note"])),
|
|
221
218
|
customData: {
|
|
222
219
|
...meta?.customData ?? {},
|
|
223
|
-
|
|
224
|
-
sourceNoteTitle: note.title ?? ""
|
|
220
|
+
sourceBinding
|
|
225
221
|
}
|
|
226
222
|
});
|
|
227
223
|
await service.notesServiceInstance.linkNoteThread(noteId, sessionKey);
|
|
@@ -229,9 +225,32 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
229
225
|
return c.json({
|
|
230
226
|
session,
|
|
231
227
|
sessionKey,
|
|
232
|
-
reused: false
|
|
228
|
+
reused: false,
|
|
229
|
+
sourceBinding
|
|
233
230
|
}, 201);
|
|
234
231
|
});
|
|
232
|
+
function noteContextStatusPayload(result) {
|
|
233
|
+
const artifact = result.artifact;
|
|
234
|
+
return {
|
|
235
|
+
noteUpdatedAt: result.noteUpdatedAt,
|
|
236
|
+
stale: result.stale,
|
|
237
|
+
status: artifact?.status ?? "failed",
|
|
238
|
+
generatedAt: artifact?.generatedAt,
|
|
239
|
+
tokenEstimate: artifact?.tokenEstimate,
|
|
240
|
+
truncated: artifact?.truncated ?? false,
|
|
241
|
+
attachments: artifact?.attachments ?? []
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
authenticated.get("/api/notes/:id/context-status", async (c) => {
|
|
245
|
+
const result = await service.notesServiceInstance.getAgentContextStatus(c.req.param("id"), service.currentConfig);
|
|
246
|
+
if (!result) return c.json({ error: "Note not found" }, 404);
|
|
247
|
+
return c.json(noteContextStatusPayload(result));
|
|
248
|
+
});
|
|
249
|
+
authenticated.post("/api/notes/:id/context-rebuild", async (c) => {
|
|
250
|
+
const result = await service.notesServiceInstance.getAgentContextStatus(c.req.param("id"), service.currentConfig, true);
|
|
251
|
+
if (!result) return c.json({ error: "Note not found" }, 404);
|
|
252
|
+
return c.json(noteContextStatusPayload(result));
|
|
253
|
+
});
|
|
235
254
|
authenticated.get("/api/notes/:id/threads", async (c) => {
|
|
236
255
|
const noteId = c.req.param("id");
|
|
237
256
|
const keys = await service.notesServiceInstance.listNoteThreads(noteId);
|