@yan162/changewayguard 6.8.25
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/LICENSE +21 -0
- package/OpenClaw-linux_Mac-Guide-zh.md +89 -0
- package/dashboard-dist/api/122.index.js +95 -0
- package/dashboard-dist/api/122.index.js.map +1 -0
- package/dashboard-dist/api/143.index.js +2734 -0
- package/dashboard-dist/api/143.index.js.map +1 -0
- package/dashboard-dist/api/154.index.js +4151 -0
- package/dashboard-dist/api/154.index.js.map +1 -0
- package/dashboard-dist/api/173.index.js +24112 -0
- package/dashboard-dist/api/173.index.js.map +1 -0
- package/dashboard-dist/api/217.index.js +44 -0
- package/dashboard-dist/api/217.index.js.map +1 -0
- package/dashboard-dist/api/222.index.js +90 -0
- package/dashboard-dist/api/222.index.js.map +1 -0
- package/dashboard-dist/api/280.index.js +213 -0
- package/dashboard-dist/api/280.index.js.map +1 -0
- package/dashboard-dist/api/369.index.js +115 -0
- package/dashboard-dist/api/369.index.js.map +1 -0
- package/dashboard-dist/api/374.index.js +1896 -0
- package/dashboard-dist/api/374.index.js.map +1 -0
- package/dashboard-dist/api/424.index.js +135 -0
- package/dashboard-dist/api/424.index.js.map +1 -0
- package/dashboard-dist/api/445.index.js +3562 -0
- package/dashboard-dist/api/445.index.js.map +1 -0
- package/dashboard-dist/api/555.index.js +496 -0
- package/dashboard-dist/api/555.index.js.map +1 -0
- package/dashboard-dist/api/573.index.js +806 -0
- package/dashboard-dist/api/573.index.js.map +1 -0
- package/dashboard-dist/api/580.index.js +1420 -0
- package/dashboard-dist/api/580.index.js.map +1 -0
- package/dashboard-dist/api/581.index.js +67 -0
- package/dashboard-dist/api/581.index.js.map +1 -0
- package/dashboard-dist/api/598.index.js +328 -0
- package/dashboard-dist/api/598.index.js.map +1 -0
- package/dashboard-dist/api/720.index.js +105 -0
- package/dashboard-dist/api/720.index.js.map +1 -0
- package/dashboard-dist/api/744.index.js +333 -0
- package/dashboard-dist/api/744.index.js.map +1 -0
- package/dashboard-dist/api/818.index.js +374 -0
- package/dashboard-dist/api/818.index.js.map +1 -0
- package/dashboard-dist/api/831.index.js +99 -0
- package/dashboard-dist/api/831.index.js.map +1 -0
- package/dashboard-dist/api/84.index.js +64 -0
- package/dashboard-dist/api/84.index.js.map +1 -0
- package/dashboard-dist/api/900.index.js +81 -0
- package/dashboard-dist/api/900.index.js.map +1 -0
- package/dashboard-dist/api/917.index.js +88 -0
- package/dashboard-dist/api/917.index.js.map +1 -0
- package/dashboard-dist/api/927.index.js +4250 -0
- package/dashboard-dist/api/927.index.js.map +1 -0
- package/dashboard-dist/api/948.index.js +64 -0
- package/dashboard-dist/api/948.index.js.map +1 -0
- package/dashboard-dist/api/982.index.js +67 -0
- package/dashboard-dist/api/982.index.js.map +1 -0
- package/dashboard-dist/api/99.index.js +1176 -0
- package/dashboard-dist/api/99.index.js.map +1 -0
- package/dashboard-dist/api/drizzle/sqlite/0000_short_captain_stacy.sql +70 -0
- package/dashboard-dist/api/drizzle/sqlite/0001_closed_magus.sql +10 -0
- package/dashboard-dist/api/drizzle/sqlite/0002_agent_capability_observation.sql +38 -0
- package/dashboard-dist/api/drizzle/sqlite/0003_auth_magic_link.sql +28 -0
- package/dashboard-dist/api/drizzle/sqlite/0004_static_scan_fields.sql +8 -0
- package/dashboard-dist/api/drizzle/sqlite/0005_gateway_activity.sql +24 -0
- package/dashboard-dist/api/drizzle/sqlite/0006_sour_marauders.sql +41 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0000_snapshot.json +460 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0001_snapshot.json +536 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0006_snapshot.json +1249 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/_journal.json +55 -0
- package/dashboard-dist/api/index.js +28482 -0
- package/dashboard-dist/api/index.js.map +1 -0
- package/dashboard-dist/api/package.json +16 -0
- package/dashboard-dist/api/sourcemap-register.cjs +1 -0
- package/dashboard-dist/web/assets/index-BKUfzbIg.js +148 -0
- package/dashboard-dist/web/assets/index-rHRH99IQ.css +1 -0
- package/dashboard-dist/web/changeway-logo.png +0 -0
- package/dashboard-dist/web/favicon.svg +29 -0
- package/dashboard-dist/web/index.html +15 -0
- package/dashboard-dist/web/logo.svg +16 -0
- package/dist/agent/activation.d.ts +21 -0
- package/dist/agent/activation.d.ts.map +1 -0
- package/dist/agent/activation.js +94 -0
- package/dist/agent/activation.js.map +1 -0
- package/dist/agent/auth.d.ts +73 -0
- package/dist/agent/auth.d.ts.map +1 -0
- package/dist/agent/auth.js +363 -0
- package/dist/agent/auth.js.map +1 -0
- package/dist/agent/behavior-detector.d.ts +150 -0
- package/dist/agent/behavior-detector.d.ts.map +1 -0
- package/dist/agent/behavior-detector.js +559 -0
- package/dist/agent/behavior-detector.js.map +1 -0
- package/dist/agent/business-reporter.d.ts +114 -0
- package/dist/agent/business-reporter.d.ts.map +1 -0
- package/dist/agent/business-reporter.js +359 -0
- package/dist/agent/business-reporter.js.map +1 -0
- package/dist/agent/config-sync.d.ts +70 -0
- package/dist/agent/config-sync.d.ts.map +1 -0
- package/dist/agent/config-sync.js +133 -0
- package/dist/agent/config-sync.js.map +1 -0
- package/dist/agent/config.d.ts +98 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +348 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/content-injection-scanner.d.ts +35 -0
- package/dist/agent/content-injection-scanner.d.ts.map +1 -0
- package/dist/agent/content-injection-scanner.js +270 -0
- package/dist/agent/content-injection-scanner.js.map +1 -0
- package/dist/agent/engine-log-writer.d.ts +6 -0
- package/dist/agent/engine-log-writer.d.ts.map +1 -0
- package/dist/agent/engine-log-writer.js +18 -0
- package/dist/agent/engine-log-writer.js.map +1 -0
- package/dist/agent/env.d.ts +19 -0
- package/dist/agent/env.d.ts.map +1 -0
- package/dist/agent/env.js +44 -0
- package/dist/agent/env.js.map +1 -0
- package/dist/agent/event-reporter.d.ts +87 -0
- package/dist/agent/event-reporter.d.ts.map +1 -0
- package/dist/agent/event-reporter.js +306 -0
- package/dist/agent/event-reporter.js.map +1 -0
- package/dist/agent/file-watcher.d.ts +50 -0
- package/dist/agent/file-watcher.d.ts.map +1 -0
- package/dist/agent/file-watcher.js +135 -0
- package/dist/agent/file-watcher.js.map +1 -0
- package/dist/agent/fs-utils.d.ts +22 -0
- package/dist/agent/fs-utils.d.ts.map +1 -0
- package/dist/agent/fs-utils.js +41 -0
- package/dist/agent/fs-utils.js.map +1 -0
- package/dist/agent/gateway-manager.d.ts +59 -0
- package/dist/agent/gateway-manager.d.ts.map +1 -0
- package/dist/agent/gateway-manager.js +583 -0
- package/dist/agent/gateway-manager.js.map +1 -0
- package/dist/agent/hook-types.d.ts +276 -0
- package/dist/agent/hook-types.d.ts.map +1 -0
- package/dist/agent/hook-types.js +51 -0
- package/dist/agent/hook-types.js.map +1 -0
- package/dist/agent/http-client.d.ts +19 -0
- package/dist/agent/http-client.d.ts.map +1 -0
- package/dist/agent/http-client.js +37 -0
- package/dist/agent/http-client.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/openclaw-hybrid-audit-changeway.js +1447 -0
- package/dist/agent/prompt-gate.d.ts +16 -0
- package/dist/agent/prompt-gate.d.ts.map +1 -0
- package/dist/agent/prompt-gate.js +58 -0
- package/dist/agent/prompt-gate.js.map +1 -0
- package/dist/agent/prompt-input.d.ts +9 -0
- package/dist/agent/prompt-input.d.ts.map +1 -0
- package/dist/agent/prompt-input.js +173 -0
- package/dist/agent/prompt-input.js.map +1 -0
- package/dist/agent/prompt-output.d.ts +4 -0
- package/dist/agent/prompt-output.d.ts.map +1 -0
- package/dist/agent/prompt-output.js +19 -0
- package/dist/agent/prompt-output.js.map +1 -0
- package/dist/agent/runner.d.ts +23 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +165 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/runtime-mode.d.ts +10 -0
- package/dist/agent/runtime-mode.d.ts.map +1 -0
- package/dist/agent/runtime-mode.js +19 -0
- package/dist/agent/runtime-mode.js.map +1 -0
- package/dist/agent/sanitizer.d.ts +10 -0
- package/dist/agent/sanitizer.d.ts.map +1 -0
- package/dist/agent/sanitizer.js +175 -0
- package/dist/agent/sanitizer.js.map +1 -0
- package/dist/agent/scan-activity.d.ts +19 -0
- package/dist/agent/scan-activity.d.ts.map +1 -0
- package/dist/agent/scan-activity.js +34 -0
- package/dist/agent/scan-activity.js.map +1 -0
- package/dist/agent/types.d.ts +177 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/workspace-scanner.d.ts +35 -0
- package/dist/agent/workspace-scanner.d.ts.map +1 -0
- package/dist/agent/workspace-scanner.js +137 -0
- package/dist/agent/workspace-scanner.js.map +1 -0
- package/dist/dashboard-launcher.d.ts +52 -0
- package/dist/dashboard-launcher.d.ts.map +1 -0
- package/dist/dashboard-launcher.js +363 -0
- package/dist/dashboard-launcher.js.map +1 -0
- package/dist/gateway/activity.d.ts +52 -0
- package/dist/gateway/activity.d.ts.map +1 -0
- package/dist/gateway/activity.js +111 -0
- package/dist/gateway/activity.js.map +1 -0
- package/dist/gateway/config.d.ts +50 -0
- package/dist/gateway/config.d.ts.map +1 -0
- package/dist/gateway/config.js +200 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/handlers/anthropic.d.ts +12 -0
- package/dist/gateway/handlers/anthropic.d.ts.map +1 -0
- package/dist/gateway/handlers/anthropic.js +254 -0
- package/dist/gateway/handlers/anthropic.js.map +1 -0
- package/dist/gateway/handlers/gemini.d.ts +12 -0
- package/dist/gateway/handlers/gemini.d.ts.map +1 -0
- package/dist/gateway/handlers/gemini.js +101 -0
- package/dist/gateway/handlers/gemini.js.map +1 -0
- package/dist/gateway/handlers/models.d.ts +4 -0
- package/dist/gateway/handlers/models.d.ts.map +1 -0
- package/dist/gateway/handlers/models.js +36 -0
- package/dist/gateway/handlers/models.js.map +1 -0
- package/dist/gateway/handlers/openai.d.ts +16 -0
- package/dist/gateway/handlers/openai.d.ts.map +1 -0
- package/dist/gateway/handlers/openai.js +254 -0
- package/dist/gateway/handlers/openai.js.map +1 -0
- package/dist/gateway/index.d.ts +27 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +290 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/mapping-store.d.ts +38 -0
- package/dist/gateway/mapping-store.d.ts.map +1 -0
- package/dist/gateway/mapping-store.js +74 -0
- package/dist/gateway/mapping-store.js.map +1 -0
- package/dist/gateway/restorer.d.ts +63 -0
- package/dist/gateway/restorer.d.ts.map +1 -0
- package/dist/gateway/restorer.js +284 -0
- package/dist/gateway/restorer.js.map +1 -0
- package/dist/gateway/sanitizer.d.ts +17 -0
- package/dist/gateway/sanitizer.d.ts.map +1 -0
- package/dist/gateway/sanitizer.js +228 -0
- package/dist/gateway/sanitizer.js.map +1 -0
- package/dist/gateway/types.d.ts +53 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +5 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2990 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/store.d.ts +82 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +194 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/platform-client/index.d.ts +63 -0
- package/dist/platform-client/index.d.ts.map +1 -0
- package/dist/platform-client/index.js +294 -0
- package/dist/platform-client/index.js.map +1 -0
- package/dist/platform-client/types.d.ts +109 -0
- package/dist/platform-client/types.d.ts.map +1 -0
- package/dist/platform-client/types.js +3 -0
- package/dist/platform-client/types.js.map +1 -0
- package/dist/workspace-agents-guide.d.ts +22 -0
- package/dist/workspace-agents-guide.d.ts.map +1 -0
- package/dist/workspace-agents-guide.js +92 -0
- package/dist/workspace-agents-guide.js.map +1 -0
- package/dist/workspace-agents-sync.d.ts +24 -0
- package/dist/workspace-agents-sync.d.ts.map +1 -0
- package/dist/workspace-agents-sync.js +41 -0
- package/dist/workspace-agents-sync.js.map +1 -0
- package/dist/workspace-agents-watcher.d.ts +23 -0
- package/dist/workspace-agents-watcher.d.ts.map +1 -0
- package/dist/workspace-agents-watcher.js +152 -0
- package/dist/workspace-agents-watcher.js.map +1 -0
- package/dist/workspace-discovery.d.ts +11 -0
- package/dist/workspace-discovery.d.ts.map +1 -0
- package/dist/workspace-discovery.js +116 -0
- package/dist/workspace-discovery.js.map +1 -0
- package/gateway/package-lock.json +597 -0
- package/gateway/package.json +57 -0
- package/gateway/pnpm-lock.yaml +342 -0
- package/gateway/src/activity.ts +142 -0
- package/gateway/src/config.ts +246 -0
- package/gateway/src/handlers/anthropic.ts +328 -0
- package/gateway/src/handlers/gemini.ts +122 -0
- package/gateway/src/handlers/models.ts +45 -0
- package/gateway/src/handlers/openai.ts +333 -0
- package/gateway/src/index.ts +344 -0
- package/gateway/src/mapping-store.ts +88 -0
- package/gateway/src/restorer.ts +322 -0
- package/gateway/src/sanitizer.ts +298 -0
- package/gateway/src/types.ts +73 -0
- package/gateway/tsconfig.json +20 -0
- package/openclaw.plugin.json +86 -0
- package/package.json +74 -0
- package/samples/Untitled +1 -0
- package/samples/clean-email.txt +20 -0
- package/samples/test-document.md +53 -0
- package/samples/test-email-popup.txt +44 -0
- package/samples/test-email.txt +32 -0
- package/samples/test-webpage.html +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"573.index.js","mappings":";;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACpQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sources":[".././dist/routes/discovery.js",".././dist/services/discovery.js"],"sourcesContent":["import { Router } from \"express\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { scanAgents, getAgentProfile } from \"../services/discovery.js\";\nimport { db, agentQueries } from \"@og/db\";\nconst agentsDb = agentQueries(db);\nexport const discoveryRouter = Router();\nfunction fallbackAgentName(agentId) {\n return agentId ? `Agent ${agentId.slice(0, 6)}` : \"Agent\";\n}\nfunction sanitizeAgentName(name, fallback) {\n const raw = name.replace(/\\s+/g, \" \").trim();\n if (!raw)\n return fallback;\n const cleaned = raw\n .replace(/^[-*]\\s+/, \"\")\n .replace(/^[`*_~\\s]+/, \"\")\n .replace(/[`*_~\\s]+$/, \"\")\n .replace(/^\\((.*)\\)$/, \"$1\")\n .trim();\n if (!cleaned)\n return fallback;\n const lower = cleaned.toLowerCase();\n const looksLikeTemplate = /(pick something|your signature|fill this in|make it yours|workspace-relative|something weirder|ghost in the machine|how do you come across)/i.test(lower);\n return looksLikeTemplate ? fallback : cleaned;\n}\nfunction registeredToDiscovered(a) {\n const m = (a.metadata ?? {});\n const discoveredId = m.openclawId ?? a.id;\n return {\n id: discoveredId,\n name: sanitizeAgentName(a.name, fallbackAgentName(discoveredId)),\n emoji: m.emoji ?? \"🤖\",\n creature: m.creature ?? \"\",\n vibe: m.vibe ?? \"\",\n model: m.model ?? \"\",\n provider: m.provider ?? a.provider,\n workspacePath: \"\",\n ownerName: m.ownerName ?? \"\",\n avatarUrl: null,\n skills: m.skills ?? [],\n connectedSystems: m.connectedSystems ?? [],\n channels: m.channels ?? [],\n plugins: m.plugins ?? [],\n hooks: m.hooks ?? [],\n sessionCount: m.sessionCount ?? 0,\n lastActive: m.lastActive ?? a.lastSeenAt,\n };\n}\nfunction registeredToProfile(a) {\n const m = (a.metadata ?? {});\n const wf = m.workspaceFiles ?? {};\n return {\n ...registeredToDiscovered(a),\n workspaceFiles: {\n soul: wf.soul ?? \"\",\n identity: wf.identity ?? \"\",\n user: wf.user ?? \"\",\n agents: wf.agents ?? \"\",\n tools: wf.tools ?? \"\",\n heartbeat: wf.heartbeat ?? \"\",\n },\n bootstrapExists: m.bootstrapExists ?? false,\n cronJobs: m.cronJobs ?? [],\n allSkills: (m.skills ?? []).map((s) => ({ ...s, source: \"workspace\" })),\n bundledExtensions: [],\n };\n}\n// ── Routes ───────────────────────────────────────────────────────────────────\n// GET /api/discovery/agents — list all agents (DB primary, filesystem fallback)\ndiscoveryRouter.get(\"/agents\", async (_req, res, next) => {\n try {\n const tenantId = res.locals.tenantId;\n const registered = await agentsDb.findAll(tenantId);\n if (registered.length > 0) {\n res.json({ success: true, data: registered.map(registeredToDiscovered) });\n return;\n }\n // Fallback: local filesystem scan (self-hosted, same machine)\n const discovered = scanAgents();\n res.json({ success: true, data: discovered });\n }\n catch (err) {\n next(err);\n }\n});\n// GET /api/discovery/agents/:id — single agent (DB primary, filesystem fallback)\ndiscoveryRouter.get(\"/agents/:id\", async (req, res, next) => {\n try {\n const tenantId = res.locals.tenantId;\n const id = req.params.id;\n const registered = await agentsDb.findAll(tenantId);\n // Match by openclawId (from plugin) or DB id\n const match = registered.find((a) => {\n const meta = (a.metadata ?? {});\n return meta.openclawId === id || a.id === id;\n });\n if (match) {\n res.json({ success: true, data: registeredToDiscovered(match) });\n return;\n }\n // Fallback: filesystem\n const { getAgent } = await import(\"../services/discovery.js\");\n const agent = getAgent(id);\n if (!agent) {\n res.status(404).json({ success: false, error: \"Agent not found\" });\n return;\n }\n res.json({ success: true, data: agent });\n }\n catch (err) {\n next(err);\n }\n});\n// GET /api/discovery/agents/:id/avatar — serve agent avatar image (filesystem only)\ndiscoveryRouter.get(\"/agents/:id/avatar\", (req, res, next) => {\n try {\n const { getAgent } = require(\"../services/discovery.js\");\n const agent = getAgent(req.params.id);\n if (!agent || !agent.workspacePath) {\n res.status(404).json({ success: false, error: \"No avatar found\" });\n return;\n }\n const mimeTypes = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n svg: \"image/svg+xml\",\n webp: \"image/webp\",\n };\n for (const ext of Object.keys(mimeTypes)) {\n const avatarPath = join(agent.workspacePath, `avatar.${ext}`);\n if (existsSync(avatarPath)) {\n const data = readFileSync(avatarPath);\n res.setHeader(\"Content-Type\", mimeTypes[ext]);\n res.setHeader(\"Cache-Control\", \"public, max-age=3600\");\n res.send(data);\n return;\n }\n }\n res.status(404).json({ success: false, error: \"No avatar found\" });\n }\n catch (err) {\n next(err);\n }\n});\n// GET /api/discovery/agents/:id/profile — enriched profile (DB primary, filesystem fallback)\ndiscoveryRouter.get(\"/agents/:id/profile\", async (req, res, next) => {\n try {\n const tenantId = res.locals.tenantId;\n const id = req.params.id;\n const registered = await agentsDb.findAll(tenantId);\n const match = registered.find((a) => {\n const meta = (a.metadata ?? {});\n return meta.openclawId === id || a.id === id;\n });\n if (match) {\n const profile = registeredToProfile(match);\n res.json({ success: true, data: { ...profile, registeredAgentId: match.id } });\n return;\n }\n // Fallback: filesystem\n const profile = getAgentProfile(id);\n if (!profile) {\n res.status(404).json({ success: false, error: \"Agent not found\" });\n return;\n }\n // Also try to find registeredAgentId from DB by name\n const byName = registered.find((a) => a.name === profile.name);\n res.json({ success: true, data: { ...profile, registeredAgentId: byName?.id ?? null } });\n }\n catch (err) {\n next(err);\n }\n});\n// POST /api/discovery/scan — trigger fresh scan (filesystem only, for local installs)\ndiscoveryRouter.post(\"/scan\", (_req, res, next) => {\n try {\n const agents = scanAgents();\n res.json({ success: true, data: agents });\n }\n catch (err) {\n next(err);\n }\n});\n// GET /api/discovery/agents/:id/summary — LLM-generated summary\ndiscoveryRouter.get(\"/agents/:id/summary\", async (req, res, next) => {\n try {\n const tenantId = res.locals.tenantId;\n const id = req.params.id;\n const registered = await agentsDb.findAll(tenantId);\n const match = registered.find((a) => {\n const meta = (a.metadata ?? {});\n return meta.openclawId === id || a.id === id;\n });\n const agent = match\n ? registeredToDiscovered(match)\n : (() => { const { getAgent } = require(\"../services/discovery.js\"); return getAgent(id) ?? null; })();\n if (!agent) {\n res.status(404).json({ success: false, error: \"Agent not found\" });\n return;\n }\n const prompt = `Summarize this AI agent in 2-3 concise paragraphs for a security dashboard:\r\n\r\nName: ${agent.name} ${agent.emoji}\r\nCreature: ${agent.creature}\r\nVibe: ${agent.vibe}\r\nModel: ${agent.provider}/${agent.model}\r\nSkills: ${agent.skills.map((s) => s.name).join(\", \") || \"none\"}\r\nConnected Systems: ${agent.connectedSystems.join(\", \") || \"none\"}\r\nChannels: ${agent.channels.join(\", \") || \"none\"}\r\nPlugins: ${agent.plugins.map((p) => `${p.name}${p.enabled ? \"\" : \" (disabled)\"}`).join(\", \") || \"none\"}\r\nHooks: ${agent.hooks.map((h) => `${h.name}${h.enabled ? \"\" : \" (disabled)\"}`).join(\", \") || \"none\"}\r\nSessions: ${agent.sessionCount}\r\nLast Active: ${agent.lastActive || \"unknown\"}\r\n\r\nFocus on: what this agent does, its capabilities, connected systems and potential security surface area. Keep it factual and useful for a security team.`;\n const { getEnvGatewayPort, getEnvAnthropicApiKey } = await import(\"../services/runtime-config.js\");\n const gatewayPort = getEnvGatewayPort();\n try {\n const apiKey = getEnvAnthropicApiKey();\n const response = await fetch(`http://localhost:${gatewayPort}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: \"claude-sonnet-4-5-20250929\",\n max_tokens: 500,\n messages: [{ role: \"user\", content: prompt }],\n }),\n signal: AbortSignal.timeout(30000),\n });\n if (response.ok) {\n const data = await response.json();\n const text = data.content?.find((c) => c.type === \"text\")?.text;\n if (text) {\n res.json({ success: true, data: { summary: text } });\n return;\n }\n }\n }\n catch {\n // Gateway not available, fall through to static summary\n }\n const skillList = agent.skills.map((s) => s.name).join(\", \");\n const systemList = agent.connectedSystems.join(\", \");\n const summary = `${agent.name} is an AI agent running on ${agent.provider}/${agent.model}. ` +\n (skillList ? `It has ${agent.skills.length} skill(s): ${skillList}. ` : \"It has no registered skills. \") +\n (systemList ? `Connected systems: ${systemList}. ` : \"\") +\n `It has ${agent.sessionCount} recorded session(s)` +\n (agent.lastActive ? `, last active ${new Date(agent.lastActive).toLocaleDateString()}.` : \".\");\n res.json({ success: true, data: { summary } });\n }\n catch (err) {\n next(err);\n }\n});\n//# sourceMappingURL=discovery.js.map","import { readFileSync, readdirSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { join, basename, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { getEnv } from \"./runtime-config.js\";\nconst OPENCLAW_DIR = join(homedir(), \".openclaw\");\nfunction readJsonSafe(path) {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n }\n catch {\n return null;\n }\n}\nfunction readFileSafe(path) {\n try {\n return readFileSync(path, \"utf-8\");\n }\n catch {\n return \"\";\n }\n}\nfunction parseOwnerName(workspacePath) {\n const content = readFileSafe(join(workspacePath, \"USER.md\"));\n if (!content)\n return \"\";\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n // Handle \"- **Name:** value\" (bullet + bold markdown)\n const bulletBold = trimmed.match(/^[-*]\\s+\\*\\*name:\\*\\*\\s*(.*)/i);\n if (bulletBold) {\n const val = bulletBold[1].trim();\n if (val)\n return val;\n continue;\n }\n // Handle \"**Name:** value\" or \"Name: value\"\n const plain = trimmed.match(/^\\*?\\*?name\\*?\\*?:\\s*(.*)/i);\n if (plain) {\n const val = plain[1].replace(/^\\*?\\*?\\s*/, \"\").trim();\n if (val)\n return val;\n }\n }\n return \"\";\n}\nconst AVATAR_EXTENSIONS = [\"png\", \"jpg\", \"jpeg\", \"svg\", \"webp\"];\nfunction discoverAvatar(workspacePath) {\n for (const ext of AVATAR_EXTENSIONS) {\n if (existsSync(join(workspacePath, `avatar.${ext}`))) {\n return ext;\n }\n }\n return null;\n}\nfunction parseIdentityMd(content) {\n const result = { name: \"\", emoji: \"\", creature: \"\", vibe: \"\" };\n const lines = content.split(\"\\n\");\n let currentKey = \"\";\n const normalize = (value) => value\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/^[`*_~\\s]+/, \"\")\n .replace(/[`*_~\\s]+$/, \"\")\n .replace(/^\\((.*)\\)$/, \"$1\")\n .trim();\n const isTemplatePlaceholder = (value) => {\n const lower = value.toLowerCase();\n return /(pick something|your signature|fill this in|make it yours|workspace-relative|something weirder|ghost in the machine|how do you come across)/i.test(lower);\n };\n const useIfValid = (key, value) => {\n const normalized = normalize(value);\n if (!normalized || isTemplatePlaceholder(normalized))\n return;\n result[key] = normalized;\n };\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"- **Name:**\")) {\n currentKey = \"name\";\n const inline = trimmed.replace(\"- **Name:**\", \"\").trim();\n if (inline)\n useIfValid(\"name\", inline);\n }\n else if (trimmed.startsWith(\"- **Creature:**\")) {\n currentKey = \"creature\";\n const inline = trimmed.replace(\"- **Creature:**\", \"\").trim();\n if (inline)\n useIfValid(\"creature\", inline);\n }\n else if (trimmed.startsWith(\"- **Vibe:**\")) {\n currentKey = \"vibe\";\n const inline = trimmed.replace(\"- **Vibe:**\", \"\").trim();\n if (inline)\n useIfValid(\"vibe\", inline);\n }\n else if (trimmed.startsWith(\"- **Emoji:**\")) {\n currentKey = \"emoji\";\n const inline = trimmed.replace(\"- **Emoji:**\", \"\").trim();\n if (inline)\n useIfValid(\"emoji\", inline);\n }\n else if (trimmed.startsWith(\"- **\") || trimmed.startsWith(\"---\") || trimmed.startsWith(\"#\")) {\n currentKey = \"\";\n }\n else if (currentKey && trimmed) {\n const key = currentKey;\n if (!result[key])\n useIfValid(key, trimmed);\n }\n }\n return result;\n}\nfunction countSessions(agentDir) {\n const sessionsDir = join(agentDir, \"sessions\");\n if (!existsSync(sessionsDir))\n return { count: 0, lastActive: null };\n const sessionsFile = join(sessionsDir, \"sessions.json\");\n const sessionsData = readJsonSafe(sessionsFile);\n if (!sessionsData)\n return { count: 0, lastActive: null };\n let latestTs = 0;\n let count = 0;\n for (const value of Object.values(sessionsData)) {\n count++;\n if (typeof value === \"object\" && value && typeof value.updatedAt === \"number\") {\n if (value.updatedAt > latestTs)\n latestTs = value.updatedAt;\n }\n }\n return {\n count,\n lastActive: latestTs ? new Date(latestTs).toISOString() : null,\n };\n}\nfunction discoverSkills(workspacePath) {\n const skillsDir = join(workspacePath, \"skills\");\n if (!existsSync(skillsDir))\n return [];\n try {\n return readdirSync(skillsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => {\n const metaPath = join(skillsDir, d.name, \"_meta.json\");\n const meta = readJsonSafe(metaPath);\n return { name: d.name, description: meta?.description };\n });\n }\n catch {\n return [];\n }\n}\nfunction discoverCredentials() {\n const credsDir = join(OPENCLAW_DIR, \"credentials\");\n if (!existsSync(credsDir))\n return [];\n try {\n return readdirSync(credsDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => basename(f, \".json\"));\n }\n catch {\n return [];\n }\n}\nexport function scanAgents() {\n if (!existsSync(OPENCLAW_DIR))\n return [];\n const config = readJsonSafe(join(OPENCLAW_DIR, \"openclaw.json\"));\n if (!config)\n return [];\n const agentsConfig = config.agents;\n const pluginsConfig = config.plugins;\n const hooksConfig = config.hooks;\n const gatewayConfig = config.gateway;\n const defaultModel = agentsConfig?.defaults?.model?.primary || \"unknown\";\n const workspacePath = agentsConfig?.defaults?.workspace || join(OPENCLAW_DIR, \"workspace\");\n // Parse model string like \"openai-codex/gpt-5.3-codex\"\n const [provider, model] = defaultModel.includes(\"/\")\n ? defaultModel.split(\"/\", 2)\n : [\"unknown\", defaultModel];\n // Read identity\n const identityContent = readFileSafe(join(workspacePath, \"IDENTITY.md\"));\n const identity = parseIdentityMd(identityContent);\n // Discover skills\n const skills = discoverSkills(workspacePath);\n // Connected systems (credentials)\n const connectedSystems = discoverCredentials();\n // Channels — derive from session data\n const channels = [];\n const agentsDir = join(OPENCLAW_DIR, \"agents\");\n if (existsSync(agentsDir)) {\n try {\n const agentDirs = readdirSync(agentsDir, { withFileTypes: true }).filter((d) => d.isDirectory());\n for (const agentDir of agentDirs) {\n const sessionsFile = join(agentsDir, agentDir.name, \"sessions\", \"sessions.json\");\n const sessionsData = readJsonSafe(sessionsFile);\n if (sessionsData) {\n for (const value of Object.values(sessionsData)) {\n if (typeof value === \"object\" && value && typeof value.lastChannel === \"string\") {\n if (!channels.includes(value.lastChannel)) {\n channels.push(value.lastChannel);\n }\n }\n }\n }\n }\n }\n catch { /* ignore */ }\n }\n // Plugins\n const plugins = [];\n if (pluginsConfig?.entries) {\n for (const [name, entry] of Object.entries(pluginsConfig.entries)) {\n plugins.push({ name, enabled: entry?.enabled !== false });\n }\n }\n // Hooks\n const hooks = [];\n if (hooksConfig?.internal?.entries) {\n for (const [name, entry] of Object.entries(hooksConfig.internal.entries)) {\n hooks.push({ name, enabled: entry?.enabled !== false });\n }\n }\n // Count sessions across all agent dirs\n let totalSessions = 0;\n let lastActive = null;\n if (existsSync(agentsDir)) {\n try {\n for (const dir of readdirSync(agentsDir, { withFileTypes: true })) {\n if (!dir.isDirectory())\n continue;\n const result = countSessions(join(agentsDir, dir.name));\n totalSessions += result.count;\n if (result.lastActive && (!lastActive || result.lastActive > lastActive)) {\n lastActive = result.lastActive;\n }\n }\n }\n catch { /* ignore */ }\n }\n const ownerName = parseOwnerName(workspacePath);\n const avatarExt = discoverAvatar(workspacePath);\n const agent = {\n id: \"main\",\n name: identity.name || \"Agent\",\n emoji: identity.emoji || \"🤖\",\n creature: identity.creature || \"\",\n vibe: identity.vibe || \"\",\n model,\n provider,\n workspacePath,\n ownerName,\n avatarUrl: avatarExt ? `/api/discovery/agents/main/avatar` : null,\n skills,\n connectedSystems,\n channels,\n plugins,\n hooks,\n sessionCount: totalSessions,\n lastActive,\n };\n // Check for additional agent directories\n const agents = [agent];\n if (existsSync(agentsDir)) {\n try {\n for (const dir of readdirSync(agentsDir, { withFileTypes: true })) {\n if (!dir.isDirectory() || dir.name === \"main\")\n continue;\n const agentPath = join(agentsDir, dir.name);\n const sessionInfo = countSessions(agentPath);\n agents.push({\n id: dir.name,\n name: dir.name,\n emoji: \"🤖\",\n creature: \"\",\n vibe: \"\",\n model,\n provider,\n workspacePath: agentPath,\n ownerName: \"\",\n avatarUrl: null,\n skills: [],\n connectedSystems: [],\n channels: [],\n plugins: [],\n hooks: [],\n sessionCount: sessionInfo.count,\n lastActive: sessionInfo.lastActive,\n });\n }\n }\n catch { /* ignore */ }\n }\n return agents;\n}\nexport function getAgent(id) {\n const agents = scanAgents();\n return agents.find((a) => a.id === id);\n}\n// ---- Profile enrichment ----\nfunction parseFrontmatter(content) {\n const result = {};\n if (!content.startsWith(\"---\"))\n return result;\n const end = content.indexOf(\"---\", 3);\n if (end === -1)\n return result;\n const block = content.slice(3, end);\n for (const line of block.split(\"\\n\")) {\n const match = line.match(/^(\\w[\\w\\s]*):\\s*(.+)/);\n if (match) {\n const key = match[1].trim().toLowerCase();\n let val = match[2].trim();\n // Strip surrounding quotes\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.slice(1, -1);\n }\n result[key] = val;\n }\n }\n // Try to extract nested emoji from metadata block\n const emojiMatch = block.match(/emoji:\\s*[\"']?([^\\n\"']+)[\"']?/);\n if (emojiMatch)\n result[\"emoji\"] = emojiMatch[1].trim();\n return result;\n}\nlet _openclawRoot = undefined;\nfunction resolveOpenclawRoot() {\n if (_openclawRoot !== undefined)\n return _openclawRoot;\n // Try env var first\n const skillsPath = getEnv(\"OPENCLAW_SKILLS_PATH\");\n if (skillsPath) {\n _openclawRoot = skillsPath;\n return _openclawRoot;\n }\n try {\n const bin = execSync(\"which openclaw\", { encoding: \"utf-8\", timeout: 5000 }).trim();\n if (bin) {\n // Binary is at <prefix>/bin/openclaw\n const binDir = dirname(bin);\n // Standard global install: <prefix>/bin/openclaw → <prefix>/lib/node_modules/openclaw\n // Covers nvm, volta, fnm, homebrew node, system node\n const globalPkg = join(binDir, \"..\", \"lib\", \"node_modules\", \"openclaw\");\n if (existsSync(join(globalPkg, \"skills\"))) {\n _openclawRoot = globalPkg;\n return _openclawRoot;\n }\n // Sibling layout: <pkg>/bin/openclaw → <pkg>/skills\n if (existsSync(join(binDir, \"..\", \"skills\"))) {\n _openclawRoot = join(binDir, \"..\");\n return _openclawRoot;\n }\n // node_modules/.bin symlink: node_modules/.bin/openclaw → node_modules/openclaw\n const parentDir = dirname(binDir);\n if (existsSync(join(parentDir, \"openclaw\", \"skills\"))) {\n _openclawRoot = join(parentDir, \"openclaw\");\n return _openclawRoot;\n }\n }\n }\n catch {\n // which not found or timeout\n }\n // Fallback: common locations\n const candidates = [\n join(homedir(), \".openclaw\", \"node_modules\", \"openclaw\"),\n \"/usr/local/lib/node_modules/openclaw\",\n ];\n for (const c of candidates) {\n if (existsSync(join(c, \"skills\"))) {\n _openclawRoot = c;\n return _openclawRoot;\n }\n }\n _openclawRoot = null;\n return null;\n}\nfunction discoverSystemSkills() {\n const root = resolveOpenclawRoot();\n if (!root)\n return [];\n const skillsDir = join(root, \"skills\");\n if (!existsSync(skillsDir))\n return [];\n try {\n return readdirSync(skillsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => {\n const skillMd = readFileSafe(join(skillsDir, d.name, \"SKILL.md\"));\n const fm = parseFrontmatter(skillMd);\n return {\n name: fm[\"name\"] || d.name,\n description: fm[\"description\"],\n emoji: fm[\"emoji\"],\n source: \"system\",\n };\n });\n }\n catch {\n return [];\n }\n}\nfunction discoverWorkspaceSkillsEnriched(workspacePath) {\n const skillsDir = join(workspacePath, \"skills\");\n if (!existsSync(skillsDir))\n return [];\n try {\n return readdirSync(skillsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => {\n // Try SKILL.md frontmatter first, fall back to _meta.json\n const skillMd = readFileSafe(join(skillsDir, d.name, \"SKILL.md\"));\n const fm = parseFrontmatter(skillMd);\n const meta = readJsonSafe(join(skillsDir, d.name, \"_meta.json\"));\n return {\n name: fm[\"name\"] || d.name,\n description: fm[\"description\"] || meta?.description,\n emoji: fm[\"emoji\"],\n source: \"workspace\",\n };\n });\n }\n catch {\n return [];\n }\n}\nfunction discoverSystemExtensions() {\n const root = resolveOpenclawRoot();\n if (!root)\n return [];\n const extDir = join(root, \"extensions\");\n if (!existsSync(extDir))\n return [];\n try {\n return readdirSync(extDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => {\n const pluginJson = readJsonSafe(join(extDir, d.name, \"openclaw.plugin.json\"));\n const pkgJson = readJsonSafe(join(extDir, d.name, \"package.json\"));\n return {\n name: pluginJson?.id || d.name,\n description: pkgJson?.description || \"\",\n channels: pluginJson?.channels || [],\n };\n });\n }\n catch {\n return [];\n }\n}\nexport function getAgentProfile(id) {\n const agent = getAgent(id);\n if (!agent)\n return undefined;\n const wp = agent.workspacePath;\n // Read workspace MD files\n const workspaceFiles = {\n soul: readFileSafe(join(wp, \"SOUL.md\")),\n identity: readFileSafe(join(wp, \"IDENTITY.md\")),\n user: readFileSafe(join(wp, \"USER.md\")),\n agents: readFileSafe(join(wp, \"AGENTS.md\")),\n tools: readFileSafe(join(wp, \"TOOLS.md\")),\n heartbeat: readFileSafe(join(wp, \"HEARTBEAT.md\")),\n };\n // Bootstrap existence\n const bootstrapExists = existsSync(join(wp, \"BOOTSTRAP.md\"));\n // Cron jobs\n let cronJobs = [];\n const cronPath = join(OPENCLAW_DIR, \"cron\", \"jobs.json\");\n try {\n const raw = readFileSafe(cronPath);\n if (raw) {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n cronJobs = parsed;\n }\n else if (typeof parsed === \"object\" && parsed !== null) {\n // Handle { jobs: [...] } shape\n cronJobs = parsed.jobs || Object.values(parsed);\n }\n }\n }\n catch {\n // ignore\n }\n // Combine system + workspace skills\n const systemSkills = discoverSystemSkills();\n const workspaceSkills = discoverWorkspaceSkillsEnriched(wp);\n const allSkills = [...systemSkills, ...workspaceSkills];\n // Bundled extensions\n const bundledExtensions = discoverSystemExtensions();\n return {\n ...agent,\n workspaceFiles,\n bootstrapExists,\n cronJobs,\n allSkills,\n bundledExtensions,\n };\n}\n//# sourceMappingURL=discovery.js.map"],"names":[],"sourceRoot":""}
|