@xopcai/xopc 0.0.46 → 0.0.48

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.
Files changed (202) hide show
  1. package/README.md +17 -2
  2. package/README.zh-CN.md +8 -2
  3. package/dist/extensions/dingtalk/src/plugin.js +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  5. package/dist/extensions/telegram/src/command-handler.js +1 -1
  6. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  7. package/dist/extensions/telegram/src/plugin.js +1 -1
  8. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/extensions/weixin/src/api/api.js +2 -2
  11. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  12. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  13. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  14. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  16. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  17. package/dist/extensions/weixin/src/plugin.js +1 -1
  18. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  19. package/dist/gateway/static/root/assets/{agents-9tPOBNVa.js → agents-BdISC5UA.js} +2 -2
  20. package/dist/gateway/static/root/assets/{agents-9tPOBNVa.js.map → agents-BdISC5UA.js.map} +1 -1
  21. package/dist/gateway/static/root/assets/{apps-page-yjXMjZEY.js → apps-page-CXU_Jg95.js} +2 -2
  22. package/dist/gateway/static/root/assets/{apps-page-yjXMjZEY.js.map → apps-page-CXU_Jg95.js.map} +1 -1
  23. package/dist/gateway/static/root/assets/{channels-settings-B-vOBJmr.js → channels-settings-Doe1ciOW.js} +2 -2
  24. package/dist/gateway/static/root/assets/{channels-settings-B-vOBJmr.js.map → channels-settings-Doe1ciOW.js.map} +1 -1
  25. package/dist/gateway/static/root/assets/{cron-dreaming-jobs-CmdPJHC8.js → cron-dreaming-jobs-C-V4_3vz.js} +2 -2
  26. package/dist/gateway/static/root/assets/{cron-dreaming-jobs-CmdPJHC8.js.map → cron-dreaming-jobs-C-V4_3vz.js.map} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-aS5nCGTE.js → cron-page-CIIy81K6.js} +2 -2
  28. package/dist/gateway/static/root/assets/{cron-page-aS5nCGTE.js.map → cron-page-CIIy81K6.js.map} +1 -1
  29. package/dist/gateway/static/root/assets/{dist-COrWk0va.js → dist-VW7dXc5X.js} +2 -2
  30. package/dist/gateway/static/root/assets/{dist-COrWk0va.js.map → dist-VW7dXc5X.js.map} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-debug-page-p7Aufdiu.js → extension-debug-page-Cslwx62-.js} +2 -2
  32. package/dist/gateway/static/root/assets/{extension-debug-page-p7Aufdiu.js.map → extension-debug-page-Cslwx62-.js.map} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-Ca_H5bLy.js → extension-page-Dzyebr6T.js} +2 -2
  34. package/dist/gateway/static/root/assets/{extension-page-Ca_H5bLy.js.map → extension-page-Dzyebr6T.js.map} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-f8jERrXK.js → extension-settings-page-B07uetL_.js} +2 -2
  36. package/dist/gateway/static/root/assets/{extension-settings-page-f8jERrXK.js.map → extension-settings-page-B07uetL_.js.map} +1 -1
  37. package/dist/gateway/static/root/assets/{heartbeat-config-api-BC5dh16N.js → heartbeat-config-api-kmvGNriW.js} +2 -2
  38. package/dist/gateway/static/root/assets/{heartbeat-config-api-BC5dh16N.js.map → heartbeat-config-api-kmvGNriW.js.map} +1 -1
  39. package/dist/gateway/static/root/assets/{index-DRnjltLC.js → index-DW6JvymK.js} +11 -11
  40. package/dist/gateway/static/root/assets/{index-DRnjltLC.js.map → index-DW6JvymK.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/{logs-page-CBHnie4a.js → logs-page-BiRnV2Ex.js} +2 -2
  42. package/dist/gateway/static/root/assets/{logs-page-CBHnie4a.js.map → logs-page-BiRnV2Ex.js.map} +1 -1
  43. package/dist/gateway/static/root/assets/{sessions-page-29vp15ci.js → sessions-page-DQq0QaQh.js} +2 -2
  44. package/dist/gateway/static/root/assets/{sessions-page-29vp15ci.js.map → sessions-page-DQq0QaQh.js.map} +1 -1
  45. package/dist/gateway/static/root/assets/{settings-page-Bd1rO8dz.js → settings-page-BV_l8nJ3.js} +2 -2
  46. package/dist/gateway/static/root/assets/{settings-page-Bd1rO8dz.js.map → settings-page-BV_l8nJ3.js.map} +1 -1
  47. package/dist/gateway/static/root/assets/{skills-page-BYppQ88L.js → skills-page-Bv0pphDM.js} +2 -2
  48. package/dist/gateway/static/root/assets/{skills-page-BYppQ88L.js.map → skills-page-Bv0pphDM.js.map} +1 -1
  49. package/dist/gateway/static/root/assets/{use-image-provider-credentials-DlWCe2d_.js → use-image-provider-credentials-BPcW1K0N.js} +2 -2
  50. package/dist/gateway/static/root/assets/{use-image-provider-credentials-DlWCe2d_.js.map → use-image-provider-credentials-BPcW1K0N.js.map} +1 -1
  51. package/dist/gateway/static/root/index.html +1 -1
  52. package/dist/package.js +1 -1
  53. package/dist/src/agent/agent-manager.js +6 -6
  54. package/dist/src/agent/context/workspace-seed.js +2 -2
  55. package/dist/src/agent/goals/checklist-judge.js +21 -17
  56. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  57. package/dist/src/agent/goals/evaluate-turn.js +6 -11
  58. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  59. package/dist/src/agent/goals/judge.d.ts +16 -0
  60. package/dist/src/agent/goals/judge.js +61 -13
  61. package/dist/src/agent/goals/judge.js.map +1 -1
  62. package/dist/src/agent/goals/post-turn.js +1 -1
  63. package/dist/src/agent/goals/state.d.ts +7 -0
  64. package/dist/src/agent/goals/state.js +24 -1
  65. package/dist/src/agent/goals/state.js.map +1 -1
  66. package/dist/src/agent/image/load-image-media.js +1 -1
  67. package/dist/src/agent/ipc/bus.js +1 -1
  68. package/dist/src/agent/ipc/inbox.js +2 -2
  69. package/dist/src/agent/ipc/socket.js +1 -1
  70. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  71. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  72. package/dist/src/agent/memory/dreaming/events.js +1 -1
  73. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  74. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  75. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  76. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  77. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  78. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  79. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  80. package/dist/src/agent/models/manager.js +1 -1
  81. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  82. package/dist/src/agent/service.js +5 -5
  83. package/dist/src/agent/skills/config.js +1 -1
  84. package/dist/src/agent/skills/hub-hash.js +2 -2
  85. package/dist/src/agent/skills/hub-lock.js +1 -1
  86. package/dist/src/agent/skills/hub-pull.js +1 -1
  87. package/dist/src/agent/skills/index.js +1 -1
  88. package/dist/src/agent/skills/managed-store.js +1 -1
  89. package/dist/src/agent/skills/scanner.js +1 -1
  90. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  91. package/dist/src/agent/skills/skill-manager.js +1 -1
  92. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  93. package/dist/src/agent/tools/factory.js +1 -1
  94. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  95. package/dist/src/agent/tools/send-media.js +1 -1
  96. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  97. package/dist/src/agent/tools/write.js +1 -1
  98. package/dist/src/auth/credentials.js +3 -3
  99. package/dist/src/auth/profiles/store.js +1 -1
  100. package/dist/src/auth/sync-provider-auth.js +1 -1
  101. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  102. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  103. package/dist/src/channels/outbound/persist-store.js +1 -1
  104. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  105. package/dist/src/channels/pairing/pairing-store.js +2 -2
  106. package/dist/src/chat-commands/builtins/config.js +2 -2
  107. package/dist/src/chat-commands/builtins/model.d.ts +2 -2
  108. package/dist/src/chat-commands/builtins/model.js +10 -8
  109. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  110. package/dist/src/chat-commands/builtins/system.js +1 -1
  111. package/dist/src/chat-commands/builtins/system.js.map +1 -1
  112. package/dist/src/chat-commands/context.js +1 -1
  113. package/dist/src/cli/bin.d.ts +7 -0
  114. package/dist/src/cli/bin.js +4 -0
  115. package/dist/src/cli/bootstrap-extensions.js +5 -1
  116. package/dist/src/cli/bootstrap-extensions.js.map +1 -1
  117. package/dist/src/cli/cli-log-level-preset.d.ts +7 -0
  118. package/dist/src/cli/cli-log-level-preset.js +13 -0
  119. package/dist/src/cli/cli-log-level-preset.js.map +1 -0
  120. package/dist/src/cli/commands/agent.js +2 -2
  121. package/dist/src/cli/commands/agents.js +1 -1
  122. package/dist/src/cli/commands/config.js +2 -2
  123. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  124. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  125. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  126. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  127. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  128. package/dist/src/cli/commands/extension-dev.js +1 -1
  129. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  130. package/dist/src/cli/commands/extension-pack.js +1 -1
  131. package/dist/src/cli/commands/gateway.js +1 -1
  132. package/dist/src/cli/commands/image.js +1 -1
  133. package/dist/src/cli/commands/init.js +4 -4
  134. package/dist/src/cli/commands/models.js +1 -1
  135. package/dist/src/cli/commands/onboard.js +1 -1
  136. package/dist/src/cli/commands/update.js +1 -1
  137. package/dist/src/cli/index.d.ts +0 -1
  138. package/dist/src/cli/index.js +1 -1
  139. package/dist/src/cli/index.js.map +1 -1
  140. package/dist/src/cli/utils/init-workspace.js +2 -2
  141. package/dist/src/config/index.js +2 -2
  142. package/dist/src/config/loader.js +2 -2
  143. package/dist/src/config/models-json.js +2 -2
  144. package/dist/src/config/profile.js +2 -2
  145. package/dist/src/cron/executor.js +2 -2
  146. package/dist/src/cron/persistence.js +1 -1
  147. package/dist/src/cron/run-log-store.js +1 -1
  148. package/dist/src/daemon/launchd.js +2 -2
  149. package/dist/src/daemon/systemd.js +2 -2
  150. package/dist/src/extensions/health.js +1 -1
  151. package/dist/src/extensions/loader.d.ts +5 -0
  152. package/dist/src/extensions/loader.js +19 -3
  153. package/dist/src/extensions/loader.js.map +1 -1
  154. package/dist/src/extensions/lockfile.js +2 -2
  155. package/dist/src/gateway/agents-admin.js +2 -2
  156. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  157. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  158. package/dist/src/gateway/hono/oauth.js +1 -1
  159. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  160. package/dist/src/gateway/hono/routes/config.js +1 -1
  161. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  162. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  163. package/dist/src/gateway/hono/routes/models.js +1 -1
  164. package/dist/src/gateway/hono/routes/workspace.js +3 -3
  165. package/dist/src/gateway/hono/sse.js +2 -2
  166. package/dist/src/gateway/lock.js +2 -2
  167. package/dist/src/gateway/service/run-gateway-agent.js +2 -2
  168. package/dist/src/gateway/service.js +5 -5
  169. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  170. package/dist/src/gateway/workspace-heartbeat-path.js +1 -1
  171. package/dist/src/infra/update-check.js +1 -1
  172. package/dist/src/infra/update-lock.js +3 -3
  173. package/dist/src/infra/update-runner.js +2 -2
  174. package/dist/src/infra/update-runner.js.map +1 -1
  175. package/dist/src/infra/update-startup.js +2 -2
  176. package/dist/src/infra/write-file-atomic.js +2 -2
  177. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  178. package/dist/src/providers/index.js +2 -2
  179. package/dist/src/providers/model-registry.js +1 -1
  180. package/dist/src/session/config-store.js +2 -2
  181. package/dist/src/session/search-index-cache.js +1 -1
  182. package/dist/src/session/search-index.js +1 -1
  183. package/dist/src/session/session-title.js +1 -1
  184. package/dist/src/session/store.js +5 -5
  185. package/dist/src/tui/backends/embedded-backend.d.ts +1 -1
  186. package/dist/src/tui/backends/embedded-backend.js +25 -4
  187. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  188. package/dist/src/tui/backends/gateway-sse-backend.js +36 -10
  189. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  190. package/dist/src/tui/tui-commands.js +1 -1
  191. package/dist/src/tui/tui-commands.js.map +1 -1
  192. package/dist/src/tui/tui.js +13 -2
  193. package/dist/src/tui/tui.js.map +1 -1
  194. package/dist/src/utils/logger/audit.js +1 -1
  195. package/dist/src/utils/logger/log-store.js +1 -1
  196. package/dist/src/utils/logger/rotation.js +1 -1
  197. package/dist/src/voice/tts/audio.js +1 -1
  198. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  199. package/package.json +7 -7
  200. package/dist/src/cli/agent-chat-log-level-preset.d.ts +0 -8
  201. package/dist/src/cli/agent-chat-log-level-preset.js +0 -25
  202. package/dist/src/cli/agent-chat-log-level-preset.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
2
1
  import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
+ import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  //#region src/agent/skills/hub-lock.ts
5
5
  /**
@@ -4,9 +4,9 @@ import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
4
4
  import { getSkillsLockEntry, recordSkillsHubInstall } from "./hub-lock.js";
5
5
  import { installSkillFromZip, isValidSkillId } from "./managed-store.js";
6
6
  import { computeSkillTreeHashSync } from "./hub-hash.js";
7
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
7
8
  import { basename, join, normalize, resolve, sep } from "node:path";
8
9
  import { tmpdir } from "node:os";
9
- import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
10
10
  import { fileURLToPath } from "node:url";
11
11
  import { fetch } from "undici";
12
12
  import { execFileSync } from "node:child_process";
@@ -1,6 +1,6 @@
1
- import { resolveStateDir } from "../../config/paths-state.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { init_paths } from "../../config/paths.js";
5
5
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
6
6
  import { findInstallSpec, getDefaultInstallerPreferences, hasBinary, init_installer, installSkill } from "./installer.js";
@@ -1,8 +1,8 @@
1
1
  import { init_paths, resolveSkillsDir } from "../../config/paths.js";
2
2
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
3
3
  import { loadSkillsLock } from "./hub-lock.js";
4
- import { dirname, join, resolve, sep } from "node:path";
5
4
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
5
+ import { dirname, join, resolve, sep } from "node:path";
6
6
  import AdmZip from "adm-zip";
7
7
  //#region src/agent/skills/managed-store.ts
8
8
  /**
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { join } from "path";
4
3
  import { readFile, readdir } from "fs/promises";
4
+ import { join } from "path";
5
5
  //#region src/agent/skills/scanner.ts
6
6
  /**
7
7
  * Skill security scanner — scans skill directories for potentially dangerous code patterns.
@@ -2,9 +2,9 @@ import { init_paths, resolveSkillsDir } from "../../config/paths.js";
2
2
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
3
3
  import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
4
4
  import { fuzzyFindText, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings } from "../tools/edit-diff.js";
5
+ import { mkdir, writeFile } from "fs/promises";
5
6
  import { join, resolve, sep } from "path";
6
7
  import { existsSync, realpathSync } from "fs";
7
- import { mkdir, writeFile } from "fs/promises";
8
8
  //#region src/agent/skills/skill-manage-ops.ts
9
9
  /**
10
10
  * Shared logic for the skill_manage agent tool (create / edit / patch / delete / write_file / remove_file).
@@ -1,6 +1,6 @@
1
- import { resolveStateDir } from "../../config/paths-state.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { init_paths, resolveBundledSkillsDir } from "../../config/paths.js";
5
5
  import { createSkillConfigManager, isSkillEnabled } from "./config.js";
6
6
  import { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from "./format-skills-prompt.js";
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../memory/dreaming/constants.js";
4
4
  import { loadDreamingStore, saveDreamingStore } from "../memory/dreaming/short-term-store.js";
5
5
  import { resolveDreamingConfig } from "../memory/dreaming/config.js";
6
- import path from "node:path";
7
6
  import fs from "node:fs/promises";
7
+ import path from "node:path";
8
8
  import { Type } from "@sinclair/typebox";
9
9
  //#region src/agent/tools/dreaming-tool.ts
10
10
  init_logger();
@@ -1,6 +1,6 @@
1
- import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
4
4
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
5
5
  import { createReadFileTool } from "./read.js";
6
6
  import { createWriteFileTool } from "./write.js";
@@ -4,9 +4,9 @@ import { isFailoverError } from "../failover-error.js";
4
4
  import { imageAssetFromDataUrl, imageFileExtensionForMimeType, mimeTypeFromFileName, parseImageDataUrl, sniffImageMimeType } from "../image/generation/image-assets.js";
5
5
  import { getImageGenerationProvider } from "../image/generation/provider-registry.js";
6
6
  import { generateImage, listImageGenerationProvidersSummary } from "../image/generation/runtime.js";
7
- import path from "node:path";
8
7
  import { randomBytes } from "node:crypto";
9
8
  import { mkdir, readFile, writeFile } from "node:fs/promises";
9
+ import path from "node:path";
10
10
  import { Type } from "@sinclair/typebox";
11
11
  //#region src/agent/tools/image-generate-tool.ts
12
12
  const DEFAULT_COUNT = 1;
@@ -1,7 +1,7 @@
1
1
  import { checkFileSafety } from "../prompt/safety.js";
2
2
  import { resolvePathUnderWorkspace } from "./tool-paths.js";
3
- import { basename } from "node:path";
4
3
  import { readFile } from "fs/promises";
4
+ import { basename } from "node:path";
5
5
  import { Type } from "@sinclair/typebox";
6
6
  //#region src/agent/tools/send-media.ts
7
7
  const SendMediaSchema = Type.Object({
@@ -2,9 +2,9 @@ import { resolveStateDir } from "../../config/paths-state.js";
2
2
  import { init_paths } from "../../config/paths.js";
3
3
  import { createSkillConfigManager } from "../skills/config.js";
4
4
  import { applyPatchToContent, atomicWriteUtf8, effectiveAgentWritePolicy, ensureCategorySegment, isPathInsideDir, maxSkillMdChars, maxSupportFileBytes, mutatableSkillOrNull, resolveCreateSkillDir, scanSkillDirOrError, validateSkillMdContent, validateSkillNameSegment, validateSupportingRelativePath } from "../skills/skill-manage-ops.js";
5
+ import { readFile, rm } from "fs/promises";
5
6
  import { join } from "path";
6
7
  import { existsSync, rmSync } from "fs";
7
- import { readFile, rm } from "fs/promises";
8
8
  import { Type } from "@sinclair/typebox";
9
9
  //#region src/agent/tools/skill-manage-tool.ts
10
10
  init_paths();
@@ -1,7 +1,7 @@
1
1
  import { checkFileSafety } from "../prompt/safety.js";
2
2
  import { resolvePathUnderWorkspace } from "./tool-paths.js";
3
- import { dirname } from "path";
4
3
  import { mkdir, writeFile } from "fs/promises";
4
+ import { dirname } from "path";
5
5
  import { Type } from "@sinclair/typebox";
6
6
  //#region src/agent/tools/write.ts
7
7
  const MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -1,11 +1,11 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
2
3
  import { createLogger } from "../utils/logger/index.js";
3
4
  import { init_logger } from "../utils/logger.js";
4
- import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
5
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
6
5
  import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
7
- import { dirname, join } from "path";
6
+ import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
8
7
  import { mkdir, readFile } from "fs/promises";
8
+ import { dirname, join } from "path";
9
9
  //#region src/auth/credentials.ts
10
10
  function getCredentialResolver(options) {
11
11
  return new CredentialResolver(options);
@@ -1,6 +1,6 @@
1
1
  import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
- import path from "node:path";
3
2
  import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
3
+ import path from "node:path";
4
4
  import { homedir } from "os";
5
5
  //#region src/auth/profiles/store.ts
6
6
  /**
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
3
2
  import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
4
3
  import { init_loader, loadConfig } from "../config/loader.js";
4
+ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
5
  import { existsSync, readFileSync } from "node:fs";
6
6
  //#region src/auth/sync-provider-auth.ts
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { join, resolve } from "path";
4
3
  import { mkdir, writeFile } from "fs/promises";
4
+ import { join, resolve } from "path";
5
5
  import { randomBytes } from "crypto";
6
6
  //#region src/channels/attachments/inbound-persist.ts
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { join, resolve } from "path";
4
3
  import { mkdir, writeFile } from "fs/promises";
4
+ import { join, resolve } from "path";
5
5
  import { randomBytes } from "crypto";
6
6
  //#region src/channels/attachments/outbound-tts-persist.ts
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
+ import { randomUUID } from "node:crypto";
2
3
  import { join } from "path";
3
4
  import { existsSync, mkdirSync, readFileSync } from "fs";
4
- import { randomUUID } from "node:crypto";
5
5
  //#region src/channels/outbound/persist-store.ts
6
6
  /**
7
7
  * Durable outbound queue (crash recovery): JSON file under agent internal dir.
@@ -1,5 +1,5 @@
1
- import path from "node:path";
2
1
  import fsSync from "node:fs";
2
+ import path from "node:path";
3
3
  //#region src/channels/pairing/allow-from-file.ts
4
4
  function readAllowFromFile(filePath) {
5
5
  try {
@@ -1,7 +1,7 @@
1
1
  import { appendAllowFromIdSync } from "./allow-from-file.js";
2
- import path from "node:path";
3
- import fsSync from "node:fs";
4
2
  import crypto from "node:crypto";
3
+ import fsSync from "node:fs";
4
+ import path from "node:path";
5
5
  //#region src/channels/pairing/pairing-store.ts
6
6
  const PAIRING_CODE_LENGTH = 8;
7
7
  const PAIRING_CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
@@ -1,9 +1,9 @@
1
- import { ConfigSchema, init_schema } from "../../config/schema.js";
2
- import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
3
1
  import { createLogger } from "../../utils/logger/index.js";
4
2
  import { init_logger } from "../../utils/logger.js";
5
3
  import { init_paths, resolveConfigPath } from "../../config/paths.js";
4
+ import { ConfigSchema, init_schema } from "../../config/schema.js";
6
5
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
6
+ import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
7
7
  import { commandRegistry } from "../registry.js";
8
8
  import { resolveAllowlistMatchSimple } from "../../channels/security.js";
9
9
  import { parseConfigValue } from "../config-value.js";
@@ -2,8 +2,8 @@
2
2
  * Model Commands
3
3
  *
4
4
  * Built-in commands for model management:
5
- * - /models - List available models
6
- * - /switch - Switch to a different model
5
+ * - /models - List models with display names and `provider/model` refs for /switch
6
+ * - /switch - Switch model using the ref from /models
7
7
  * - /usage - Show token usage statistics
8
8
  */
9
9
  export declare function registerModelCommands(): void;
@@ -4,7 +4,7 @@ const modelsCommand = {
4
4
  id: "model.list",
5
5
  name: "models",
6
6
  aliases: ["model"],
7
- description: "List available AI models",
7
+ description: "List models with display names and `provider/model` refs for /switch",
8
8
  category: "model",
9
9
  scope: [
10
10
  "global",
@@ -24,16 +24,18 @@ const modelsCommand = {
24
24
  if (!byProvider.has(m.provider)) byProvider.set(m.provider, []);
25
25
  byProvider.get(m.provider).push(m);
26
26
  }
27
- const lines = ["🤖 Available Models:\n"];
27
+ /** `m.id` from listModels is always `serviceId/modelId` (canonical `/switch` ref). */
28
+ const lines = ["🤖 Available models (use the `provider/model` ref with `/switch`):\n"];
28
29
  for (const [provider, providerModels] of byProvider) {
29
30
  lines.push(`**${provider}**`);
30
31
  for (const m of providerModels.slice(0, 5)) {
31
32
  const indicator = m.id === currentModel ? "▶️" : " ";
32
- lines.push(`${indicator} ${m.name}`);
33
+ lines.push(`${indicator} ${m.name} — \`${m.id}\``);
33
34
  }
34
- if (providerModels.length > 5) lines.push(` ... and ${providerModels.length - 5} more`);
35
+ if (providerModels.length > 5) lines.push(` and ${providerModels.length - 5} more in this provider`);
35
36
  lines.push("");
36
37
  }
38
+ lines.push("_Copy the ref in backticks after each name, then: `/switch provider/model-id`._");
37
39
  const content = lines.join("\n");
38
40
  if (ctx.supports("buttons")) return {
39
41
  content,
@@ -61,7 +63,7 @@ const modelsCommand = {
61
63
  const switchCommand = {
62
64
  id: "model.switch",
63
65
  name: "switch",
64
- description: "Switch to a different model (usage: /switch <model-id>)",
66
+ description: "Switch model pass the `provider/model` ref shown by /models",
65
67
  category: "model",
66
68
  scope: [
67
69
  "global",
@@ -72,17 +74,17 @@ const switchCommand = {
72
74
  examples: ["/switch openai/gpt-4o", "/switch minimax/minimax-m2.1"],
73
75
  handler: async (ctx, args) => {
74
76
  if (!args.trim()) return {
75
- content: "❌ Please specify a model ID.\nUsage: /switch <model-id>\nExample: /switch openai/gpt-4o",
77
+ content: "❌ Missing model ref.\n\n**Usage:** `/switch provider/model-id`\n\nRun `/models` — each line shows a display name and a `provider/model` ref in backticks. Copy that ref.\n\n**Example:** `/switch openai/gpt-4o`",
76
78
  success: false
77
79
  };
78
80
  await ctx.setTyping(true);
79
81
  const modelId = args.trim();
80
82
  if (await ctx.switchModel(modelId)) return {
81
- content: `✅ Switched to model: *${modelId.split("/").pop() || modelId}*\n\nThis model will be used for your next message.`,
83
+ content: `✅ Switched to *\`${modelId}\`* (${modelId.split("/").pop() || modelId}).\n\nThis model will be used for your next message.`,
82
84
  success: true
83
85
  };
84
86
  else return {
85
- content: `❌ Failed to switch to model: ${modelId}\nPlease check the model ID and try again.`,
87
+ content: `❌ Could not switch to \`${modelId}\`.\n\nUse the exact \`provider/model\` ref from \`/models\` (not only the display name). **Example:** \`/switch anthropic/claude-sonnet-4-20250514\``,
86
88
  success: false
87
89
  };
88
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":[],"sources":["../../../../src/chat-commands/builtins/model.ts"],"sourcesContent":["/**\n * Model Commands\n * \n * Built-in commands for model management:\n * - /models - List available models\n * - /switch - Switch to a different model\n * - /usage - Show token usage statistics\n */\n\nimport type { CommandDefinition, CommandContext, UIComponent } from '../types.js';\nimport { commandRegistry } from '../registry.js';\n\nconst modelsCommand: CommandDefinition = {\n id: 'model.list',\n name: 'models',\n aliases: ['model'],\n description: 'List available AI models',\n category: 'model',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n await ctx.setTyping(true);\n \n const models = await ctx.listModels();\n const currentModel = ctx.getCurrentModel();\n \n if (models.length === 0) {\n return {\n content: '🤖 No models available. Please check your configuration.',\n success: true,\n };\n }\n \n // Group by provider\n const byProvider = new Map<string, typeof models>();\n for (const m of models) {\n if (!byProvider.has(m.provider)) {\n byProvider.set(m.provider, []);\n }\n byProvider.get(m.provider)!.push(m);\n }\n \n // Build text response\n const lines: string[] = ['🤖 Available Models:\\n'];\n \n for (const [provider, providerModels] of byProvider) {\n lines.push(`**${provider}**`);\n for (const m of providerModels.slice(0, 5)) {\n const indicator = m.id === currentModel ? '▶️' : ' ';\n lines.push(`${indicator} ${m.name}`);\n }\n if (providerModels.length > 5) {\n lines.push(` ... and ${providerModels.length - 5} more`);\n }\n lines.push('');\n }\n \n const content = lines.join('\\n');\n \n // Create UI component if supported\n if (ctx.supports('buttons')) {\n const component: UIComponent = {\n type: 'model-picker',\n providers: Array.from(byProvider.entries()).map(([id, models]) => ({\n id,\n name: id,\n models: models.map(m => ({\n id: m.id,\n name: m.name,\n provider: m.provider,\n })),\n })),\n currentModel,\n };\n \n return {\n content,\n success: true,\n components: [component],\n };\n }\n \n return {\n content,\n success: true,\n };\n },\n};\n\nconst switchCommand: CommandDefinition = {\n id: 'model.switch',\n name: 'switch',\n description: 'Switch to a different model (usage: /switch <model-id>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/switch openai/gpt-4o', '/switch minimax/minimax-m2.1'],\n handler: async (ctx: CommandContext, args: string) => {\n if (!args.trim()) {\n return {\n content: '❌ Please specify a model ID.\\nUsage: /switch <model-id>\\nExample: /switch openai/gpt-4o',\n success: false,\n };\n }\n \n await ctx.setTyping(true);\n \n const modelId = args.trim();\n const success = await ctx.switchModel(modelId);\n \n if (success) {\n const modelName = modelId.split('/').pop() || modelId;\n return {\n content: `✅ Switched to model: *${modelName}*\\n\\nThis model will be used for your next message.`,\n success: true,\n };\n } else {\n return {\n content: `❌ Failed to switch to model: ${modelId}\\nPlease check the model ID and try again.`,\n success: false,\n };\n }\n },\n};\n\nconst usageCommand: CommandDefinition = {\n id: 'model.usage',\n name: 'usage',\n description: 'Show token usage statistics for current session',\n category: 'model',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n await ctx.setTyping(true);\n \n const stats = await ctx.getUsage();\n const modelName = ctx.getCurrentModel().split('/').pop() || 'Unknown';\n \n const content = \n '📊 *Session Token Usage*\\n\\n' +\n `🤖 Model: ${modelName}\\n` +\n `📥 Prompt: ${stats.promptTokens.toLocaleString()} tokens\\n` +\n `📤 Completion: ${stats.completionTokens.toLocaleString()} tokens\\n` +\n `📊 Total: ${stats.totalTokens.toLocaleString()} tokens\\n` +\n `💬 Messages: ${stats.messageCount}`;\n \n // Create UI component if supported\n if (ctx.supports('buttons')) {\n const component: UIComponent = {\n type: 'usage-display',\n stats,\n modelName,\n };\n \n return {\n content,\n success: true,\n components: [component],\n };\n }\n \n return {\n content,\n success: true,\n };\n },\n};\n\n// Register all model commands\nexport function registerModelCommands(): void {\n commandRegistry.register(modelsCommand);\n commandRegistry.register(switchCommand);\n commandRegistry.register(usageCommand);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.js","names":[],"sources":["../../../../src/chat-commands/builtins/model.ts"],"sourcesContent":["/**\n * Model Commands\n * \n * Built-in commands for model management:\n * - /models - List models with display names and `provider/model` refs for /switch\n * - /switch - Switch model using the ref from /models\n * - /usage - Show token usage statistics\n */\n\nimport type { CommandDefinition, CommandContext, UIComponent } from '../types.js';\nimport { commandRegistry } from '../registry.js';\n\nconst modelsCommand: CommandDefinition = {\n id: 'model.list',\n name: 'models',\n aliases: ['model'],\n description: 'List models with display names and `provider/model` refs for /switch',\n category: 'model',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n await ctx.setTyping(true);\n \n const models = await ctx.listModels();\n const currentModel = ctx.getCurrentModel();\n \n if (models.length === 0) {\n return {\n content: '🤖 No models available. Please check your configuration.',\n success: true,\n };\n }\n \n // Group by provider\n const byProvider = new Map<string, typeof models>();\n for (const m of models) {\n if (!byProvider.has(m.provider)) {\n byProvider.set(m.provider, []);\n }\n byProvider.get(m.provider)!.push(m);\n }\n \n /** `m.id` from listModels is always `serviceId/modelId` (canonical `/switch` ref). */\n const lines: string[] = [\n '🤖 Available models (use the `provider/model` ref with `/switch`):\\n',\n ];\n\n for (const [provider, providerModels] of byProvider) {\n lines.push(`**${provider}**`);\n for (const m of providerModels.slice(0, 5)) {\n const indicator = m.id === currentModel ? '▶️' : ' ';\n lines.push(`${indicator} ${m.name} — \\`${m.id}\\``);\n }\n if (providerModels.length > 5) {\n lines.push(` and ${providerModels.length - 5} more in this provider`);\n }\n lines.push('');\n }\n\n lines.push('_Copy the ref in backticks after each name, then: `/switch provider/model-id`._');\n const content = lines.join('\\n');\n \n // Create UI component if supported\n if (ctx.supports('buttons')) {\n const component: UIComponent = {\n type: 'model-picker',\n providers: Array.from(byProvider.entries()).map(([id, models]) => ({\n id,\n name: id,\n models: models.map(m => ({\n id: m.id,\n name: m.name,\n provider: m.provider,\n })),\n })),\n currentModel,\n };\n \n return {\n content,\n success: true,\n components: [component],\n };\n }\n \n return {\n content,\n success: true,\n };\n },\n};\n\nconst switchCommand: CommandDefinition = {\n id: 'model.switch',\n name: 'switch',\n description: 'Switch model pass the `provider/model` ref shown by /models',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/switch openai/gpt-4o', '/switch minimax/minimax-m2.1'],\n handler: async (ctx: CommandContext, args: string) => {\n if (!args.trim()) {\n return {\n content:\n '❌ Missing model ref.\\n\\n' +\n '**Usage:** `/switch provider/model-id`\\n\\n' +\n 'Run `/models` — each line shows a display name and a `provider/model` ref in backticks. Copy that ref.\\n\\n' +\n '**Example:** `/switch openai/gpt-4o`',\n success: false,\n };\n }\n \n await ctx.setTyping(true);\n \n const modelId = args.trim();\n const success = await ctx.switchModel(modelId);\n \n if (success) {\n const modelName = modelId.split('/').pop() || modelId;\n return {\n content:\n `✅ Switched to *\\`${modelId}\\`* (${modelName}).\\n\\n` +\n 'This model will be used for your next message.',\n success: true,\n };\n } else {\n return {\n content:\n `❌ Could not switch to \\`${modelId}\\`.\\n\\n` +\n 'Use the exact `provider/model` ref from `/models` (not only the display name). ' +\n '**Example:** `/switch anthropic/claude-sonnet-4-20250514`',\n success: false,\n };\n }\n },\n};\n\nconst usageCommand: CommandDefinition = {\n id: 'model.usage',\n name: 'usage',\n description: 'Show token usage statistics for current session',\n category: 'model',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n await ctx.setTyping(true);\n \n const stats = await ctx.getUsage();\n const modelName = ctx.getCurrentModel().split('/').pop() || 'Unknown';\n \n const content = \n '📊 *Session Token Usage*\\n\\n' +\n `🤖 Model: ${modelName}\\n` +\n `📥 Prompt: ${stats.promptTokens.toLocaleString()} tokens\\n` +\n `📤 Completion: ${stats.completionTokens.toLocaleString()} tokens\\n` +\n `📊 Total: ${stats.totalTokens.toLocaleString()} tokens\\n` +\n `💬 Messages: ${stats.messageCount}`;\n \n // Create UI component if supported\n if (ctx.supports('buttons')) {\n const component: UIComponent = {\n type: 'usage-display',\n stats,\n modelName,\n };\n \n return {\n content,\n success: true,\n components: [component],\n };\n }\n \n return {\n content,\n success: true,\n };\n },\n};\n\n// Register all model commands\nexport function registerModelCommands(): void {\n commandRegistry.register(modelsCommand);\n commandRegistry.register(switchCommand);\n commandRegistry.register(usageCommand);\n}\n"],"mappings":"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"}
@@ -45,7 +45,7 @@ const startCommand = {
45
45
  ],
46
46
  handler: async (_ctx) => {
47
47
  return {
48
- content: "👋 *Welcome to xopc!*\n\nI am your AI assistant. Here's what I can do:\n\n🤖 *AI Chat* - Just send a message to start chatting\n📊 *Session Management* - Use /new, /list, /usage\n🔧 *Model Selection* - Use /models, /switch\n\nType /help to see all available commands.",
48
+ content: "👋 *Welcome to xopc!*\n\nI am your AI assistant. Here's what I can do:\n\n🤖 *AI Chat* - Just send a message to start chatting\n📊 *Session Management* - Use /new, /list, /usage\n🔧 *Model Selection* - `/models` shows names and `provider/model` refs; `/switch` uses that ref\n\nType /help to see all available commands.",
49
49
  success: true
50
50
  };
51
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"system.js","names":[],"sources":["../../../../src/chat-commands/builtins/system.ts"],"sourcesContent":["/**\n * System Commands\n *\n * Built-in system commands:\n * - /help - Show help message\n * - /start - Welcome message\n * - /settings - Show settings\n */\n\nimport type { CommandDefinition, CommandContext } from '../types.js';\nimport { commandRegistry } from '../registry.js';\n\nconst helpCommand: CommandDefinition = {\n id: 'system.help',\n name: 'help',\n aliases: ['h', 'commands'],\n description: 'Show available commands',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (_ctx: CommandContext) => {\n const allCommands = commandRegistry.list();\n\n // Group by category\n const byCategory = new Map<string, typeof allCommands>();\n for (const cmd of allCommands) {\n if (!byCategory.has(cmd.category)) {\n byCategory.set(cmd.category, []);\n }\n byCategory.get(cmd.category)!.push(cmd);\n }\n\n const lines: string[] = ['📖 *Available Commands*\\n'];\n\n for (const [category, commands] of byCategory) {\n lines.push(`*${category.toUpperCase()}*`);\n for (const cmd of commands) {\n const aliases = cmd.aliases?.length ? ` (${cmd.aliases.join(', ')})` : '';\n lines.push(`/${cmd.name}${aliases} - ${cmd.description}`);\n }\n lines.push('');\n }\n\n return {\n content: lines.join('\\n'),\n success: true,\n };\n },\n};\n\nconst startCommand: CommandDefinition = {\n id: 'system.start',\n name: 'start',\n description: 'Show welcome message',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (_ctx: CommandContext) => {\n const content =\n '👋 *Welcome to xopc!*\\n\\n' +\n 'I am your AI assistant. Here\\'s what I can do:\\n\\n' +\n '🤖 *AI Chat* - Just send a message to start chatting\\n' +\n '📊 *Session Management* - Use /new, /list, /usage\\n' +\n '🔧 *Model Selection* - Use /models, /switch\\n\\n' +\n 'Type /help to see all available commands.';\n\n return {\n content,\n success: true,\n };\n },\n};\n\nconst settingsCommand: CommandDefinition = {\n id: 'system.settings',\n name: 'settings',\n description: 'Show current settings',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n const model = ctx.getCurrentModel();\n const sessionKey = ctx.sessionKey;\n\n const content =\n '⚙️ *Current Settings*\\n\\n' +\n `🤖 Model: ${model}\\n` +\n `💬 Session: ${sessionKey}\\n` +\n `📱 Platform: ${ctx.source}\\n` +\n `👥 Group: ${ctx.isGroup ? 'Yes' : 'No'}`;\n\n return {\n content,\n success: true,\n };\n },\n};\n\nconst skillsCommand: CommandDefinition = {\n id: 'system.skills',\n name: 'skills',\n description: 'Manage skills (e.g., /skills reload)',\n category: 'system',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/skills reload'],\n handler: async (ctx: CommandContext, args: string) => {\n if (args === 'reload') {\n // Publish system event to reload skills\n // This will be handled by AgentService skill reload logic\n return {\n content: '✅ Skills reloaded successfully',\n success: true,\n };\n }\n \n return {\n content: \n '🛠️ *Skills Management*\\n\\n' +\n 'Available commands:\\n' +\n '/skills reload - Reload all skills from disk',\n success: true,\n };\n },\n};\n\n// Register all system commands\nexport function registerSystemCommands(): void {\n commandRegistry.register(helpCommand);\n commandRegistry.register(startCommand);\n commandRegistry.register(settingsCommand);\n commandRegistry.register(skillsCommand);\n}\n"],"mappings":";;AAYA,MAAM,cAAiC;CACrC,IAAI;CACJ,MAAM;CACN,SAAS,CAAC,KAAK,WAAW;CAC1B,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,SAAS,OAAO,SAAyB;EACvC,MAAM,cAAc,gBAAgB,MAAM;EAG1C,MAAM,6BAAa,IAAI,KAAiC;AACxD,OAAK,MAAM,OAAO,aAAa;AAC7B,OAAI,CAAC,WAAW,IAAI,IAAI,SAAS,CAC/B,YAAW,IAAI,IAAI,UAAU,EAAE,CAAC;AAElC,cAAW,IAAI,IAAI,SAAS,CAAE,KAAK,IAAI;;EAGzC,MAAM,QAAkB,CAAC,4BAA4B;AAErD,OAAK,MAAM,CAAC,UAAU,aAAa,YAAY;AAC7C,SAAM,KAAK,IAAI,SAAS,aAAa,CAAC,GAAG;AACzC,QAAK,MAAM,OAAO,UAAU;IAC1B,MAAM,UAAU,IAAI,SAAS,SAAS,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,KAAK;AACvE,UAAM,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,IAAI,cAAc;;AAE3D,SAAM,KAAK,GAAG;;AAGhB,SAAO;GACL,SAAS,MAAM,KAAK,KAAK;GACzB,SAAS;GACV;;CAEJ;AAED,MAAM,eAAkC;CACtC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,SAAS,OAAO,SAAyB;AASvC,SAAO;GACL,SAAA;GACA,SAAS;GACV;;CAEJ;AAED,MAAM,kBAAqC;CACzC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,SAAS,OAAO,QAAwB;AAWtC,SAAO;GACL,SAAA;;YAXY,IAAI,iBAKE,CAAC,gBAJF,IAAI,WAKK,iBACV,IAAI,OAAO,cACd,IAAI,UAAU,QAAQ;GAInC,SAAS;GACV;;CAEJ;AAED,MAAM,gBAAmC;CACvC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,aAAa;CACb,UAAU,CAAC,iBAAiB;CAC5B,SAAS,OAAO,KAAqB,SAAiB;AACpD,MAAI,SAAS,SAGX,QAAO;GACL,SAAS;GACT,SAAS;GACV;AAGH,SAAO;GACL,SACE;GAGF,SAAS;GACV;;CAEJ;AAGD,SAAgB,yBAA+B;AAC7C,iBAAgB,SAAS,YAAY;AACrC,iBAAgB,SAAS,aAAa;AACtC,iBAAgB,SAAS,gBAAgB;AACzC,iBAAgB,SAAS,cAAc"}
1
+ {"version":3,"file":"system.js","names":[],"sources":["../../../../src/chat-commands/builtins/system.ts"],"sourcesContent":["/**\n * System Commands\n *\n * Built-in system commands:\n * - /help - Show help message\n * - /start - Welcome message\n * - /settings - Show settings\n */\n\nimport type { CommandDefinition, CommandContext } from '../types.js';\nimport { commandRegistry } from '../registry.js';\n\nconst helpCommand: CommandDefinition = {\n id: 'system.help',\n name: 'help',\n aliases: ['h', 'commands'],\n description: 'Show available commands',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (_ctx: CommandContext) => {\n const allCommands = commandRegistry.list();\n\n // Group by category\n const byCategory = new Map<string, typeof allCommands>();\n for (const cmd of allCommands) {\n if (!byCategory.has(cmd.category)) {\n byCategory.set(cmd.category, []);\n }\n byCategory.get(cmd.category)!.push(cmd);\n }\n\n const lines: string[] = ['📖 *Available Commands*\\n'];\n\n for (const [category, commands] of byCategory) {\n lines.push(`*${category.toUpperCase()}*`);\n for (const cmd of commands) {\n const aliases = cmd.aliases?.length ? ` (${cmd.aliases.join(', ')})` : '';\n lines.push(`/${cmd.name}${aliases} - ${cmd.description}`);\n }\n lines.push('');\n }\n\n return {\n content: lines.join('\\n'),\n success: true,\n };\n },\n};\n\nconst startCommand: CommandDefinition = {\n id: 'system.start',\n name: 'start',\n description: 'Show welcome message',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (_ctx: CommandContext) => {\n const content =\n '👋 *Welcome to xopc!*\\n\\n' +\n 'I am your AI assistant. Here\\'s what I can do:\\n\\n' +\n '🤖 *AI Chat* - Just send a message to start chatting\\n' +\n '📊 *Session Management* - Use /new, /list, /usage\\n' +\n '🔧 *Model Selection* - `/models` shows names and `provider/model` refs; `/switch` uses that ref\\n\\n' +\n 'Type /help to see all available commands.';\n\n return {\n content,\n success: true,\n };\n },\n};\n\nconst settingsCommand: CommandDefinition = {\n id: 'system.settings',\n name: 'settings',\n description: 'Show current settings',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n const model = ctx.getCurrentModel();\n const sessionKey = ctx.sessionKey;\n\n const content =\n '⚙️ *Current Settings*\\n\\n' +\n `🤖 Model: ${model}\\n` +\n `💬 Session: ${sessionKey}\\n` +\n `📱 Platform: ${ctx.source}\\n` +\n `👥 Group: ${ctx.isGroup ? 'Yes' : 'No'}`;\n\n return {\n content,\n success: true,\n };\n },\n};\n\nconst skillsCommand: CommandDefinition = {\n id: 'system.skills',\n name: 'skills',\n description: 'Manage skills (e.g., /skills reload)',\n category: 'system',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/skills reload'],\n handler: async (ctx: CommandContext, args: string) => {\n if (args === 'reload') {\n // Publish system event to reload skills\n // This will be handled by AgentService skill reload logic\n return {\n content: '✅ Skills reloaded successfully',\n success: true,\n };\n }\n \n return {\n content: \n '🛠️ *Skills Management*\\n\\n' +\n 'Available commands:\\n' +\n '/skills reload - Reload all skills from disk',\n success: true,\n };\n },\n};\n\n// Register all system commands\nexport function registerSystemCommands(): void {\n commandRegistry.register(helpCommand);\n commandRegistry.register(startCommand);\n commandRegistry.register(settingsCommand);\n commandRegistry.register(skillsCommand);\n}\n"],"mappings":";;AAYA,MAAM,cAAiC;CACrC,IAAI;CACJ,MAAM;CACN,SAAS,CAAC,KAAK,WAAW;CAC1B,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,SAAS,OAAO,SAAyB;EACvC,MAAM,cAAc,gBAAgB,MAAM;EAG1C,MAAM,6BAAa,IAAI,KAAiC;AACxD,OAAK,MAAM,OAAO,aAAa;AAC7B,OAAI,CAAC,WAAW,IAAI,IAAI,SAAS,CAC/B,YAAW,IAAI,IAAI,UAAU,EAAE,CAAC;AAElC,cAAW,IAAI,IAAI,SAAS,CAAE,KAAK,IAAI;;EAGzC,MAAM,QAAkB,CAAC,4BAA4B;AAErD,OAAK,MAAM,CAAC,UAAU,aAAa,YAAY;AAC7C,SAAM,KAAK,IAAI,SAAS,aAAa,CAAC,GAAG;AACzC,QAAK,MAAM,OAAO,UAAU;IAC1B,MAAM,UAAU,IAAI,SAAS,SAAS,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,KAAK;AACvE,UAAM,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,IAAI,cAAc;;AAE3D,SAAM,KAAK,GAAG;;AAGhB,SAAO;GACL,SAAS,MAAM,KAAK,KAAK;GACzB,SAAS;GACV;;CAEJ;AAED,MAAM,eAAkC;CACtC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,SAAS,OAAO,SAAyB;AASvC,SAAO;GACL,SAAA;GACA,SAAS;GACV;;CAEJ;AAED,MAAM,kBAAqC;CACzC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,SAAS,OAAO,QAAwB;AAWtC,SAAO;GACL,SAAA;;YAXY,IAAI,iBAKE,CAAC,gBAJF,IAAI,WAKK,iBACV,IAAI,OAAO,cACd,IAAI,UAAU,QAAQ;GAInC,SAAS;GACV;;CAEJ;AAED,MAAM,gBAAmC;CACvC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;EAAC;EAAU;EAAW;EAAQ;CACrC,aAAa;CACb,UAAU,CAAC,iBAAiB;CAC5B,SAAS,OAAO,KAAqB,SAAiB;AACpD,MAAI,SAAS,SAGX,QAAO;GACL,SAAS;GACT,SAAS;GACV;AAGH,SAAO;GACL,SACE;GAGF,SAAS;GACV;;CAEJ;AAGD,SAAgB,yBAA+B;AAC7C,iBAAgB,SAAS,YAAY;AACrC,iBAAgB,SAAS,aAAa;AACtC,iBAAgB,SAAS,gBAAgB;AACzC,iBAAgB,SAAS,cAAc"}
@@ -4,8 +4,8 @@ import { init_loader, saveConfig } from "../config/loader.js";
4
4
  import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
5
5
  import { getRoutingInfo, getSessionDisplayName } from "./session-key.js";
6
6
  import { wrapMarkdownExportAsHtml } from "../session/chat-export.js";
7
- import { join } from "path";
8
7
  import { mkdir, writeFile } from "fs/promises";
8
+ import { join } from "path";
9
9
  //#region src/chat-commands/context.ts
10
10
  init_logger();
11
11
  init_loader();
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry: log-level preset must run before any module that initializes the logger.
4
+ * (Bundlers may reorder imports in `index.ts`; this file stays dependency-minimal.)
5
+ */
6
+ import './cli-log-level-preset.js';
7
+ import './index.js';
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import "./cli-log-level-preset.js";
3
+ import "./index.js";
4
+ export {};
@@ -5,15 +5,19 @@ import "../infra/bus/index.js";
5
5
  import { collectConfiguredChannelIds } from "../extensions/activation-context.js";
6
6
  import { ExtensionLoader } from "../extensions/loader.js";
7
7
  import "../extensions/index.js";
8
+ import { createDefaultContext } from "./registry.js";
8
9
  import "../config/index.js";
9
10
  import { registerExtensionCliProgram } from "../extensions/sdk/channel-helpers.js";
10
- import { createDefaultContext } from "./registry.js";
11
11
  import { join } from "path";
12
12
  //#region src/cli/bootstrap-extensions.ts
13
+ function argvRequestsVersionOnly(argv) {
14
+ return argv.includes("--version") || argv.includes("-V");
15
+ }
13
16
  /**
14
17
  * Load extensions that may register CLI commands (manifest-only skip when nothing would activate).
15
18
  */
16
19
  async function registerExtensionCliCommands(program) {
20
+ if (argvRequestsVersionOnly(process.argv)) return;
17
21
  const ctx = createDefaultContext(process.argv, {});
18
22
  const config = loadConfig(ctx.configPath);
19
23
  const workspace = getWorkspacePath(config) || ctx.workspacePath;
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-extensions.js","names":[],"sources":["../../../src/cli/bootstrap-extensions.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { join } from 'path';\nimport { MessageBus } from '../infra/bus/index.js';\nimport { loadConfig, getWorkspacePath } from '../config/index.js';\nimport { collectConfiguredChannelIds } from '../extensions/activation-context.js';\nimport { ExtensionLoader } from '../extensions/index.js';\nimport { registerExtensionCliProgram } from '../extensions/sdk/channel-helpers.js';\nimport { createDefaultContext } from './registry.js';\n\n/**\n * Load extensions that may register CLI commands (manifest-only skip when nothing would activate).\n */\nexport async function registerExtensionCliCommands(program: Command): Promise<void> {\n const ctx = createDefaultContext(process.argv, {});\n const config = loadConfig(ctx.configPath);\n const workspace = getWorkspacePath(config) || ctx.workspacePath;\n\n const rawExt = (config as Record<string, unknown>).extensions;\n const extBlock =\n rawExt && typeof rawExt === 'object' && !Array.isArray(rawExt)\n ? (rawExt as Record<string, unknown>)\n : undefined;\n const enabledIds = Array.isArray(extBlock?.enabled)\n ? extBlock!.enabled.filter((x): x is string => typeof x === 'string')\n : [];\n\n const bus = new MessageBus();\n const loader = new ExtensionLoader({\n workspaceDir: workspace,\n extensionsDir: join(workspace, '.extensions'),\n });\n loader.setConfig(config as Parameters<ExtensionLoader['setConfig']>[0]);\n\n const registry = loader.buildManifestRegistry();\n const envWouldActivate = registry.detectAvailableByEnv(process.env).length > 0;\n const channelWouldActivate = (collectConfiguredChannelIds(config)?.length ?? 0) > 0;\n\n if (enabledIds.length === 0 && !channelWouldActivate && !envWouldActivate) {\n return;\n }\n\n loader.setRuntimeContext({ bus });\n await loader.loadByActivationPlan();\n registerExtensionCliProgram(program, loader.getRegistry());\n}\n"],"mappings":";;;;;;;;;;;;;;;AAYA,eAAsB,6BAA6B,SAAiC;CAClF,MAAM,MAAM,qBAAqB,QAAQ,MAAM,EAAE,CAAC;CAClD,MAAM,SAAS,WAAW,IAAI,WAAW;CACzC,MAAM,YAAY,iBAAiB,OAAO,IAAI,IAAI;CAElD,MAAM,SAAU,OAAmC;CACnD,MAAM,WACJ,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,GACzD,SACD,KAAA;CACN,MAAM,aAAa,MAAM,QAAQ,UAAU,QAAQ,GAC/C,SAAU,QAAQ,QAAQ,MAAmB,OAAO,MAAM,SAAS,GACnE,EAAE;CAEN,MAAM,MAAM,IAAI,YAAY;CAC5B,MAAM,SAAS,IAAI,gBAAgB;EACjC,cAAc;EACd,eAAe,KAAK,WAAW,cAAc;EAC9C,CAAC;AACF,QAAO,UAAU,OAAsD;CAGvE,MAAM,mBADW,OAAO,uBACS,CAAC,qBAAqB,QAAQ,IAAI,CAAC,SAAS;CAC7E,MAAM,wBAAwB,4BAA4B,OAAO,EAAE,UAAU,KAAK;AAElF,KAAI,WAAW,WAAW,KAAK,CAAC,wBAAwB,CAAC,iBACvD;AAGF,QAAO,kBAAkB,EAAE,KAAK,CAAC;AACjC,OAAM,OAAO,sBAAsB;AACnC,6BAA4B,SAAS,OAAO,aAAa,CAAC"}
1
+ {"version":3,"file":"bootstrap-extensions.js","names":[],"sources":["../../../src/cli/bootstrap-extensions.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { join } from 'path';\nimport { MessageBus } from '../infra/bus/index.js';\nimport { loadConfig, getWorkspacePath } from '../config/index.js';\nimport { collectConfiguredChannelIds } from '../extensions/activation-context.js';\nimport { ExtensionLoader } from '../extensions/index.js';\nimport { registerExtensionCliProgram } from '../extensions/sdk/channel-helpers.js';\nimport { createDefaultContext } from './registry.js';\n\nfunction argvRequestsVersionOnly(argv: string[]): boolean {\n return argv.includes('--version') || argv.includes('-V');\n}\n\n/**\n * Load extensions that may register CLI commands (manifest-only skip when nothing would activate).\n */\nexport async function registerExtensionCliCommands(program: Command): Promise<void> {\n if (argvRequestsVersionOnly(process.argv)) {\n return;\n }\n\n const ctx = createDefaultContext(process.argv, {});\n const config = loadConfig(ctx.configPath);\n const workspace = getWorkspacePath(config) || ctx.workspacePath;\n\n const rawExt = (config as Record<string, unknown>).extensions;\n const extBlock =\n rawExt && typeof rawExt === 'object' && !Array.isArray(rawExt)\n ? (rawExt as Record<string, unknown>)\n : undefined;\n const enabledIds = Array.isArray(extBlock?.enabled)\n ? extBlock!.enabled.filter((x): x is string => typeof x === 'string')\n : [];\n\n const bus = new MessageBus();\n const loader = new ExtensionLoader({\n workspaceDir: workspace,\n extensionsDir: join(workspace, '.extensions'),\n });\n loader.setConfig(config as Parameters<ExtensionLoader['setConfig']>[0]);\n\n const registry = loader.buildManifestRegistry();\n const envWouldActivate = registry.detectAvailableByEnv(process.env).length > 0;\n const channelWouldActivate = (collectConfiguredChannelIds(config)?.length ?? 0) > 0;\n\n if (enabledIds.length === 0 && !channelWouldActivate && !envWouldActivate) {\n return;\n }\n\n loader.setRuntimeContext({ bus });\n await loader.loadByActivationPlan();\n registerExtensionCliProgram(program, loader.getRegistry());\n}\n"],"mappings":";;;;;;;;;;;;AASA,SAAS,wBAAwB,MAAyB;AACxD,QAAO,KAAK,SAAS,YAAY,IAAI,KAAK,SAAS,KAAK;;;;;AAM1D,eAAsB,6BAA6B,SAAiC;AAClF,KAAI,wBAAwB,QAAQ,KAAK,CACvC;CAGF,MAAM,MAAM,qBAAqB,QAAQ,MAAM,EAAE,CAAC;CAClD,MAAM,SAAS,WAAW,IAAI,WAAW;CACzC,MAAM,YAAY,iBAAiB,OAAO,IAAI,IAAI;CAElD,MAAM,SAAU,OAAmC;CACnD,MAAM,WACJ,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,GACzD,SACD,KAAA;CACN,MAAM,aAAa,MAAM,QAAQ,UAAU,QAAQ,GAC/C,SAAU,QAAQ,QAAQ,MAAmB,OAAO,MAAM,SAAS,GACnE,EAAE;CAEN,MAAM,MAAM,IAAI,YAAY;CAC5B,MAAM,SAAS,IAAI,gBAAgB;EACjC,cAAc;EACd,eAAe,KAAK,WAAW,cAAc;EAC9C,CAAC;AACF,QAAO,UAAU,OAAsD;CAGvE,MAAM,mBADW,OAAO,uBACS,CAAC,qBAAqB,QAAQ,IAAI,CAAC,SAAS;CAC7E,MAAM,wBAAwB,4BAA4B,OAAO,EAAE,UAAU,KAAK;AAElF,KAAI,WAAW,WAAW,KAAK,CAAC,wBAAwB,CAAC,iBACvD;AAGF,QAAO,kBAAkB,EAAE,KAAK,CAAC;AACjC,OAAM,OAAO,sBAAsB;AACnC,6BAA4B,SAAS,OAAO,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Default the CLI console to `warn` when no log level is set, so routine `info`
3
+ * output (extensions, diagnostics, etc.) does not clutter the terminal.
4
+ * Opt in with `XOPC_LOG_LEVEL`, `LOG_LEVEL`, `DEBUG`, or `--verbose` / `-v`.
5
+ * This module must load before any import of `../utils/logger.js`.
6
+ */
7
+ declare const env: NodeJS.ProcessEnv;
@@ -0,0 +1,13 @@
1
+ //#region src/cli/cli-log-level-preset.ts
2
+ /**
3
+ * Default the CLI console to `warn` when no log level is set, so routine `info`
4
+ * output (extensions, diagnostics, etc.) does not clutter the terminal.
5
+ * Opt in with `XOPC_LOG_LEVEL`, `LOG_LEVEL`, `DEBUG`, or `--verbose` / `-v`.
6
+ * This module must load before any import of `../utils/logger.js`.
7
+ */
8
+ const env = process.env;
9
+ if (!env.VITEST && !env.TEST && !env.XOPC_LOG_LEVEL && !env.LOG_LEVEL && !env.DEBUG && !process.argv.includes("--verbose") && !process.argv.includes("-v")) env.XOPC_LOG_LEVEL = "warn";
10
+ //#endregion
11
+ export {};
12
+
13
+ //# sourceMappingURL=cli-log-level-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-log-level-preset.js","names":[],"sources":["../../../src/cli/cli-log-level-preset.ts"],"sourcesContent":["/**\n * Default the CLI console to `warn` when no log level is set, so routine `info`\n * output (extensions, diagnostics, etc.) does not clutter the terminal.\n * Opt in with `XOPC_LOG_LEVEL`, `LOG_LEVEL`, `DEBUG`, or `--verbose` / `-v`.\n * This module must load before any import of `../utils/logger.js`.\n */\nconst env = process.env;\nif (\n !env.VITEST &&\n !env.TEST &&\n !env.XOPC_LOG_LEVEL &&\n !env.LOG_LEVEL &&\n !env.DEBUG &&\n !process.argv.includes('--verbose') &&\n !process.argv.includes('-v')\n) {\n env.XOPC_LOG_LEVEL = 'warn';\n}\n"],"mappings":";;;;;;;AAMA,MAAM,MAAM,QAAQ;AACpB,IACE,CAAC,IAAI,UACL,CAAC,IAAI,QACL,CAAC,IAAI,kBACL,CAAC,IAAI,aACL,CAAC,IAAI,SACL,CAAC,QAAQ,KAAK,SAAS,YAAY,IACnC,CAAC,QAAQ,KAAK,SAAS,KAAK,CAE5B,KAAI,iBAAiB"}
@@ -1,6 +1,6 @@
1
- import { getWorkspacePath } from "../../config/schema.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { getWorkspacePath } from "../../config/schema.js";
4
4
  import { loadConfig } from "../../config/loader.js";
5
5
  import { MessageBus, MessageBusShutdownError } from "../../infra/bus/queue.js";
6
6
  import "../../infra/bus/index.js";
@@ -8,8 +8,8 @@ import { ExtensionLoader } from "../../extensions/loader.js";
8
8
  import "../../extensions/index.js";
9
9
  import { AgentService } from "../../agent/service.js";
10
10
  import "../../agent/index.js";
11
- import "../../config/index.js";
12
11
  import { formatExamples, register } from "../registry.js";
12
+ import "../../config/index.js";
13
13
  import { listSessions } from "./agent/sessions.js";
14
14
  import { renderStreamToTerminal } from "./agent/stream-renderer.js";
15
15
  import { startInteractiveChat } from "./agent/interactive.js";
@@ -4,8 +4,8 @@ import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
4
4
  import { seedWorkspaceBootstrapFiles } from "../../agent/context/workspace-seed.js";
5
5
  import { colors } from "../utils/colors.js";
6
6
  import { applyAgentConfig, findAgentEntryIndex, pruneAgentConfig, removeAgentDirsFromDisk } from "../../commands/agents.config.js";
7
- import { join } from "node:path";
8
7
  import { mkdir } from "node:fs/promises";
8
+ import { join } from "node:path";
9
9
  //#region src/cli/commands/agents.ts
10
10
  /**
11
11
  * `agents` CLI: config is the source of truth for multi-agent paths.
@@ -1,9 +1,9 @@
1
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
4
4
  import { loadConfig } from "../../config/loader.js";
5
- import "../../config/index.js";
6
5
  import { formatExamples, register } from "../registry.js";
6
+ import "../../config/index.js";
7
7
  import { existsSync } from "fs";
8
8
  import { Command } from "commander";
9
9
  //#region src/cli/commands/config.ts
@@ -1,7 +1,7 @@
1
1
  import { ConfigSchema, init_schema } from "../../../../config/schema.js";
2
2
  import { init_loader, loadConfig, saveConfig } from "../../../../config/loader.js";
3
- import { dirname } from "node:path";
4
3
  import { existsSync, mkdirSync, readFileSync } from "node:fs";
4
+ import { dirname } from "node:path";
5
5
  //#region src/cli/commands/doctor/checks/config-health.ts
6
6
  init_loader();
7
7
  init_schema();
@@ -1,6 +1,6 @@
1
+ import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
1
2
  import { getAgentDefaultModelRef, init_schema, parseModelRef } from "../../../../config/schema.js";
2
3
  import { init_loader, loadConfig } from "../../../../config/loader.js";
3
- import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
4
4
  import { existsSync } from "node:fs";
5
5
  //#region src/cli/commands/doctor/checks/provider-auth.ts
6
6
  init_loader();
@@ -2,8 +2,8 @@ import { init_agent_scope, resolveDefaultAgentId } from "../../../../agent/agent
2
2
  import { init_paths, resolveSessionsDir, resolveSessionsIndexPath } from "../../../../config/paths.js";
3
3
  import { init_loader, loadConfig } from "../../../../config/loader.js";
4
4
  import { resolveSessionShardRelativePath } from "../../../../session/shard-path.js";
5
- import { join } from "node:path";
6
5
  import { existsSync, readFileSync, readdirSync } from "node:fs";
6
+ import { join } from "node:path";
7
7
  //#region src/cli/commands/doctor/checks/session-integrity.ts
8
8
  init_agent_scope();
9
9
  init_loader();
@@ -1,5 +1,5 @@
1
- import { join } from "node:path";
2
1
  import { accessSync, chmodSync, constants, existsSync, mkdirSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
3
  //#region src/cli/commands/doctor/checks/state-integrity.ts
4
4
  function isWritable(dir) {
5
5
  try {
@@ -1,8 +1,8 @@
1
1
  import { init_agent_scope, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../../../agent/agent-scope.js";
2
2
  import { WORKSPACE_FILES, init_paths } from "../../../../config/paths.js";
3
3
  import { init_loader, loadConfig } from "../../../../config/loader.js";
4
- import { join } from "node:path";
5
4
  import { existsSync } from "node:fs";
5
+ import { join } from "node:path";
6
6
  //#region src/cli/commands/doctor/checks/workspace-status.ts
7
7
  init_agent_scope();
8
8
  init_loader();
@@ -12,8 +12,8 @@ import { GatewayServer } from "../../gateway/server.js";
12
12
  import { runGatewayLoop } from "../../gateway/run-loop.js";
13
13
  import "../../gateway/index.js";
14
14
  import { getContextWithOpts } from "../index.js";
15
- import { join, resolve } from "node:path";
16
15
  import { existsSync, mkdirSync, readFileSync, symlinkSync, unlinkSync, watch } from "node:fs";
16
+ import { join, resolve } from "node:path";
17
17
  import { Command } from "commander";
18
18
  //#region src/cli/commands/extension-dev.ts
19
19
  init_loader();