@gajae-code/coding-agent 0.13.3 → 0.14.0

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 (599) hide show
  1. package/CHANGELOG.md +184 -2
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +1 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -1,31 +1,25 @@
1
1
  /**
2
- * OpenAI code provider project provider.
2
+ * OpenAI Codex project/global skill layout adapter (import source).
3
3
  *
4
- * Supports project-local `.OpenAI code backend/` compatibility only. User-home OpenAI code backend
5
- * directories are intentionally ignored so `~/.OpenAI code backend` content is never injected
6
- * into GJC sessions.
4
+ * The `.codex/skills` layout is an explicit import source into the canonical
5
+ * `.gjc` skill locations — it is never loaded as an ordinary runtime authority.
6
+ * These helpers enumerate the layout for import/inspection consumers (#4291
7
+ * import UI, #4288 provenance diagnostics) and are deliberately NOT registered
8
+ * as capability providers: activating Codex's other surfaces (MCP servers,
9
+ * hooks, commands, tools, prompts, settings) is owned by sibling issues.
10
+ *
11
+ * User-home `~/.codex/skills` is enumerated as an explicit import candidate
12
+ * only; it is never loaded into sessions without an explicit import action.
7
13
  */
8
14
  import * as path from "node:path";
9
15
  import { logger, parseFrontmatter } from "@gajae-code/utils";
10
- import { registerProvider } from "../capability";
11
- import type { ContextFile } from "../capability/context-file";
12
- import { contextFileCapability } from "../capability/context-file";
13
- import { type ExtensionModule, extensionModuleCapability } from "../capability/extension-module";
16
+ import type { ExtensionModule } from "../capability/extension-module";
14
17
  import { readFile } from "../capability/fs";
15
18
  import type { Hook } from "../capability/hook";
16
- import { hookCapability } from "../capability/hook";
17
19
  import type { MCPServer } from "../capability/mcp";
18
- import { mcpCapability } from "../capability/mcp";
19
- import type { Prompt } from "../capability/prompt";
20
- import { promptCapability } from "../capability/prompt";
21
- import type { Settings } from "../capability/settings";
22
- import { settingsCapability } from "../capability/settings";
23
20
  import type { Skill } from "../capability/skill";
24
- import { skillCapability } from "../capability/skill";
25
21
  import type { SlashCommand } from "../capability/slash-command";
26
- import { slashCommandCapability } from "../capability/slash-command";
27
22
  import type { CustomTool } from "../capability/tool";
28
- import { toolCapability } from "../capability/tool";
29
23
  import type { LoadContext, LoadResult, SourceMeta } from "../capability/types";
30
24
  import {
31
25
  buildExtensionModuleItems,
@@ -35,57 +29,53 @@ import {
35
29
  scanSkillsFromDir,
36
30
  } from "./helpers";
37
31
 
38
- const PROVIDER_ID = "codex";
39
- const DISPLAY_NAME = "OpenAI Codex";
40
- const PRIORITY = 70;
32
+ export const CODEX_PROVIDER_ID = "codex";
33
+ export const CODEX_DISPLAY_NAME = "OpenAI Codex";
34
+ export const CODEX_CONFIG_DIR = ".codex";
41
35
 
42
- function getProjectCodexDir(ctx: LoadContext): string {
43
- return path.join(ctx.cwd, ".codex");
36
+ /**
37
+ * Enumerate the project-local `.codex/skills` layout (cwd only), mirroring the
38
+ * OpenAI Codex project convention.
39
+ */
40
+ export async function scanCodexProjectSkills(ctx: LoadContext): Promise<LoadResult<Skill>> {
41
+ return await scanSkillsFromDir(ctx, {
42
+ dir: path.join(ctx.cwd, CODEX_CONFIG_DIR, "skills"),
43
+ providerId: CODEX_PROVIDER_ID,
44
+ level: "project",
45
+ requireDescription: true,
46
+ });
44
47
  }
45
48
 
46
- async function loadContextFiles(ctx: LoadContext): Promise<LoadResult<ContextFile>> {
47
- const items: ContextFile[] = [];
48
- const agentsMd = path.join(getProjectCodexDir(ctx), "AGENTS.md");
49
- const agentsContent = await readFile(agentsMd);
50
- if (agentsContent) {
51
- items.push({
52
- path: agentsMd,
53
- content: agentsContent,
54
- level: "project",
55
- depth: 0,
56
- _source: createSourceMeta(PROVIDER_ID, agentsMd, "project"),
57
- });
58
- }
59
- return { items, warnings: [] };
49
+ /**
50
+ * Enumerate the user-global `~/.codex/skills` layout. This is an explicit
51
+ * import candidate only; GJC never loads it without an explicit import action.
52
+ */
53
+ export async function scanCodexUserSkills(ctx: LoadContext): Promise<LoadResult<Skill>> {
54
+ return await scanSkillsFromDir(ctx, {
55
+ dir: path.join(ctx.home, CODEX_CONFIG_DIR, "skills"),
56
+ providerId: CODEX_PROVIDER_ID,
57
+ level: "user",
58
+ requireDescription: true,
59
+ });
60
60
  }
61
61
 
62
- async function loadMCPServers(ctx: LoadContext): Promise<LoadResult<MCPServer>> {
63
- const warnings: string[] = [];
64
- const projectConfigPath = path.join(getProjectCodexDir(ctx), "config.toml");
65
- const projectConfig = await loadTomlConfig(projectConfigPath);
66
- const items: MCPServer[] = [];
67
- if (projectConfig) {
68
- const servers = extractMCPServersFromToml(projectConfig);
69
- for (const [name, config] of Object.entries(servers)) {
70
- items.push({
71
- name,
72
- ...config,
73
- _source: createSourceMeta(PROVIDER_ID, projectConfigPath, "project"),
74
- });
75
- }
76
- }
77
- return { items, warnings };
62
+ export function codexSkillSourceMeta(filePath: string, level: "user" | "project") {
63
+ return createSourceMeta(CODEX_PROVIDER_ID, filePath, level);
78
64
  }
79
65
 
80
- async function loadTomlConfig(filePath: string): Promise<Record<string, unknown> | null> {
81
- const content = await readFile(filePath);
82
- if (!content) return null;
83
- try {
84
- return Bun.TOML.parse(content) as Record<string, unknown>;
85
- } catch (error) {
86
- logger.warn("Failed to parse TOML config", { path: filePath, error: String(error) });
87
- return null;
88
- }
66
+ // =============================================================================
67
+ // Provenance inspection (#4288)
68
+ //
69
+ // The scans below enumerate the remaining `.codex/` project surfaces (MCP
70
+ // servers, hooks, tools, extensions, commands) for the `gjc customize doctor`
71
+ // provenance report. They reuse the shared discovery helpers but are
72
+ // deliberately NOT registered as capability providers: none of these surfaces
73
+ // are part of the session load path, and inspection must not change runtime
74
+ // behavior.
75
+ // =============================================================================
76
+
77
+ function getProjectCodexDir(ctx: LoadContext): string {
78
+ return path.join(ctx.cwd, CODEX_CONFIG_DIR);
89
79
  }
90
80
 
91
81
  interface CodexMCPConfig {
@@ -104,6 +94,17 @@ interface CodexMCPConfig {
104
94
  disabled_tools?: string[];
105
95
  }
106
96
 
97
+ async function loadTomlConfig(filePath: string): Promise<Record<string, unknown> | null> {
98
+ const content = await readFile(filePath);
99
+ if (!content) return null;
100
+ try {
101
+ return Bun.TOML.parse(content) as Record<string, unknown>;
102
+ } catch (error) {
103
+ logger.warn("Failed to parse TOML config", { path: filePath, error: String(error) });
104
+ return null;
105
+ }
106
+ }
107
+
107
108
  function extractMCPServersFromToml(toml: Record<string, unknown>): Record<string, Partial<MCPServer>> {
108
109
  if (!toml.mcp_servers || typeof toml.mcp_servers !== "object") {
109
110
  return {};
@@ -153,59 +154,25 @@ function extractMCPServersFromToml(toml: Record<string, unknown>): Record<string
153
154
  return result;
154
155
  }
155
156
 
156
- async function loadSkills(ctx: LoadContext): Promise<LoadResult<Skill>> {
157
- return await scanSkillsFromDir(ctx, {
158
- dir: path.join(getProjectCodexDir(ctx), "skills"),
159
- providerId: PROVIDER_ID,
160
- level: "project",
161
- });
162
- }
163
-
164
- async function loadExtensionModules(ctx: LoadContext): Promise<LoadResult<ExtensionModule>> {
165
- const projectExtensionsDir = path.join(getProjectCodexDir(ctx), "extensions");
166
- const projectPaths = await discoverExtensionModulePaths(ctx, projectExtensionsDir);
167
- return { items: buildExtensionModuleItems(PROVIDER_ID, [], projectPaths), warnings: [] };
168
- }
169
-
170
- async function loadSlashCommands(ctx: LoadContext): Promise<LoadResult<SlashCommand>> {
171
- const projectCommandsDir = path.join(getProjectCodexDir(ctx), "commands");
172
- const transformCommand = (name: string, content: string, filePath: string, source: SourceMeta) => {
173
- const { frontmatter, body } = parseFrontmatter(content, { source: filePath });
174
- const commandName = frontmatter.name || name.replace(/\.md$/, "");
175
- return {
176
- name: String(commandName),
177
- path: filePath,
178
- content: body,
179
- level: "project" as const,
180
- _source: source,
181
- };
182
- };
183
- return await loadFilesFromDir(ctx, projectCommandsDir, PROVIDER_ID, "project", {
184
- extensions: ["md"],
185
- transform: transformCommand,
186
- });
187
- }
188
-
189
- async function loadPrompts(ctx: LoadContext): Promise<LoadResult<Prompt>> {
190
- const projectPromptsDir = path.join(getProjectCodexDir(ctx), "prompts");
191
- const transformPrompt = (name: string, content: string, filePath: string, source: SourceMeta) => {
192
- const { frontmatter, body } = parseFrontmatter(content, { source: filePath });
193
- const promptName = frontmatter.name || name.replace(/\.md$/, "");
194
- return {
195
- name: String(promptName),
196
- path: filePath,
197
- content: body,
198
- description: frontmatter.description ? String(frontmatter.description) : undefined,
199
- _source: source,
200
- };
201
- };
202
- return await loadFilesFromDir(ctx, projectPromptsDir, PROVIDER_ID, "project", {
203
- extensions: ["md"],
204
- transform: transformPrompt,
205
- });
157
+ async function inspectMCPServers(ctx: LoadContext): Promise<LoadResult<MCPServer>> {
158
+ const warnings: string[] = [];
159
+ const projectConfigPath = path.join(getProjectCodexDir(ctx), "config.toml");
160
+ const projectConfig = await loadTomlConfig(projectConfigPath);
161
+ const items: MCPServer[] = [];
162
+ if (projectConfig) {
163
+ const servers = extractMCPServersFromToml(projectConfig);
164
+ for (const [name, config] of Object.entries(servers)) {
165
+ items.push({
166
+ name,
167
+ ...config,
168
+ _source: createSourceMeta(CODEX_PROVIDER_ID, projectConfigPath, "project"),
169
+ });
170
+ }
171
+ }
172
+ return { items, warnings };
206
173
  }
207
174
 
208
- async function loadHooks(ctx: LoadContext): Promise<LoadResult<Hook>> {
175
+ async function inspectHooks(ctx: LoadContext): Promise<LoadResult<Hook>> {
209
176
  const projectHooksDir = path.join(getProjectCodexDir(ctx), "hooks");
210
177
  const transformHook = (name: string, _content: string, filePath: string, source: SourceMeta) => {
211
178
  const baseName = name.replace(/\.(ts|js)$/, "");
@@ -220,13 +187,13 @@ async function loadHooks(ctx: LoadContext): Promise<LoadResult<Hook>> {
220
187
  _source: source,
221
188
  };
222
189
  };
223
- return await loadFilesFromDir(ctx, projectHooksDir, PROVIDER_ID, "project", {
190
+ return await loadFilesFromDir(ctx, projectHooksDir, CODEX_PROVIDER_ID, "project", {
224
191
  extensions: ["ts", "js"],
225
192
  transform: transformHook,
226
193
  });
227
194
  }
228
195
 
229
- async function loadTools(ctx: LoadContext): Promise<LoadResult<CustomTool>> {
196
+ async function inspectTools(ctx: LoadContext): Promise<LoadResult<CustomTool>> {
230
197
  const projectToolsDir = path.join(getProjectCodexDir(ctx), "tools");
231
198
  const transformTool = (name: string, _content: string, filePath: string, source: SourceMeta) =>
232
199
  ({
@@ -235,96 +202,63 @@ async function loadTools(ctx: LoadContext): Promise<LoadResult<CustomTool>> {
235
202
  level: "project" as const,
236
203
  _source: source,
237
204
  }) as CustomTool;
238
- return await loadFilesFromDir(ctx, projectToolsDir, PROVIDER_ID, "project", {
205
+ return await loadFilesFromDir(ctx, projectToolsDir, CODEX_PROVIDER_ID, "project", {
239
206
  extensions: ["ts", "js"],
240
207
  transform: transformTool,
241
208
  });
242
209
  }
243
210
 
244
- async function loadSettings(ctx: LoadContext): Promise<LoadResult<Settings>> {
245
- const projectConfigPath = path.join(getProjectCodexDir(ctx), "config.toml");
246
- const projectConfig = await loadTomlConfig(projectConfigPath);
247
- return {
248
- items: projectConfig
249
- ? [
250
- {
251
- ...projectConfig,
252
- _source: createSourceMeta(PROVIDER_ID, projectConfigPath, "project"),
253
- } as Settings,
254
- ]
255
- : [],
256
- warnings: [],
257
- };
211
+ async function inspectExtensionModules(ctx: LoadContext): Promise<LoadResult<ExtensionModule>> {
212
+ const projectExtensionsDir = path.join(getProjectCodexDir(ctx), "extensions");
213
+ const projectPaths = await discoverExtensionModulePaths(ctx, projectExtensionsDir);
214
+ return { items: buildExtensionModuleItems(CODEX_PROVIDER_ID, [], projectPaths), warnings: [] };
258
215
  }
259
216
 
260
- registerProvider<ContextFile>(contextFileCapability.id, {
261
- id: PROVIDER_ID,
262
- displayName: DISPLAY_NAME,
263
- description: "Load context files from project .codex/AGENTS.md",
264
- priority: PRIORITY,
265
- load: loadContextFiles,
266
- });
267
-
268
- registerProvider<MCPServer>(mcpCapability.id, {
269
- id: PROVIDER_ID,
270
- displayName: DISPLAY_NAME,
271
- description: "Load MCP servers from project .codex/config.toml [mcp_servers.*] sections",
272
- priority: PRIORITY,
273
- load: loadMCPServers,
274
- });
275
-
276
- registerProvider<Skill>(skillCapability.id, {
277
- id: PROVIDER_ID,
278
- displayName: DISPLAY_NAME,
279
- description: "Load skills from project .codex/skills/",
280
- priority: PRIORITY,
281
- load: loadSkills,
282
- });
283
-
284
- registerProvider<ExtensionModule>(extensionModuleCapability.id, {
285
- id: PROVIDER_ID,
286
- displayName: DISPLAY_NAME,
287
- description: "Load extension modules from project .codex/extensions/",
288
- priority: PRIORITY,
289
- load: loadExtensionModules,
290
- });
291
-
292
- registerProvider<SlashCommand>(slashCommandCapability.id, {
293
- id: PROVIDER_ID,
294
- displayName: DISPLAY_NAME,
295
- description: "Load slash commands from project .codex/commands/",
296
- priority: PRIORITY,
297
- load: loadSlashCommands,
298
- });
299
-
300
- registerProvider<Prompt>(promptCapability.id, {
301
- id: PROVIDER_ID,
302
- displayName: DISPLAY_NAME,
303
- description: "Load prompts from project .codex/prompts/",
304
- priority: PRIORITY,
305
- load: loadPrompts,
306
- });
307
-
308
- registerProvider<Hook>(hookCapability.id, {
309
- id: PROVIDER_ID,
310
- displayName: DISPLAY_NAME,
311
- description: "Load hooks from project .codex/hooks/",
312
- priority: PRIORITY,
313
- load: loadHooks,
314
- });
217
+ async function inspectSlashCommands(ctx: LoadContext): Promise<LoadResult<SlashCommand>> {
218
+ const projectCommandsDir = path.join(getProjectCodexDir(ctx), "commands");
219
+ const transformCommand = (name: string, content: string, filePath: string, source: SourceMeta) => {
220
+ const { frontmatter, body } = parseFrontmatter(content, { source: filePath });
221
+ const commandName = frontmatter.name || name.replace(/\.md$/, "");
222
+ return {
223
+ name: String(commandName),
224
+ path: filePath,
225
+ content: body,
226
+ level: "project" as const,
227
+ _source: source,
228
+ };
229
+ };
230
+ return await loadFilesFromDir(ctx, projectCommandsDir, CODEX_PROVIDER_ID, "project", {
231
+ extensions: ["md"],
232
+ transform: transformCommand,
233
+ });
234
+ }
315
235
 
316
- registerProvider<CustomTool>(toolCapability.id, {
317
- id: PROVIDER_ID,
318
- displayName: DISPLAY_NAME,
319
- description: "Load custom tools from project .codex/tools/",
320
- priority: PRIORITY,
321
- load: loadTools,
322
- });
236
+ export interface CodexConventionInspection {
237
+ mcps: LoadResult<MCPServer>;
238
+ skills: LoadResult<Skill>;
239
+ hooks: LoadResult<Hook>;
240
+ tools: LoadResult<CustomTool>;
241
+ extensions: LoadResult<ExtensionModule>;
242
+ commands: LoadResult<SlashCommand>;
243
+ }
323
244
 
324
- registerProvider<Settings>(settingsCapability.id, {
325
- id: PROVIDER_ID,
326
- displayName: DISPLAY_NAME,
327
- description: "Load settings from project .codex/config.toml",
328
- priority: PRIORITY,
329
- load: loadSettings,
330
- });
245
+ /**
246
+ * Inspect what the Codex project convention (.codex/) would surface.
247
+ *
248
+ * Reuses the shared discovery scan helpers without registering any provider,
249
+ * so diagnostics can report the convention's files while keeping the runtime
250
+ * load path exactly as configured (none of these surfaces are registered for
251
+ * session loading; hooks are covered by the separate registered codex-hooks
252
+ * provider).
253
+ */
254
+ export async function inspectCodexConvention(ctx: LoadContext): Promise<CodexConventionInspection> {
255
+ const [mcps, skills, hooks, tools, extensions, commands] = await Promise.all([
256
+ inspectMCPServers(ctx),
257
+ scanCodexProjectSkills(ctx),
258
+ inspectHooks(ctx),
259
+ inspectTools(ctx),
260
+ inspectExtensionModules(ctx),
261
+ inspectSlashCommands(ctx),
262
+ ]);
263
+ return { mcps, skills, hooks, tools, extensions, commands };
264
+ }
@@ -416,11 +416,18 @@ export async function scanSkillsFromDir(
416
416
  warnings.push(
417
417
  `Skill frontmatter exceeded ${SKILL_FRONTMATTER_SCAN_TOTAL_BYTES} byte scan cap: ${skillPath}`,
418
418
  );
419
+ } else {
420
+ warnings.push(
421
+ `Skill file has no parseable frontmatter (expected a leading \`---\` YAML block with name/description): ${skillPath}`,
422
+ );
419
423
  }
420
424
  return;
421
425
  }
422
426
  if (frontmatter.enabled === false) return;
423
- if (requireDescription && !frontmatter.description) return;
427
+ if (requireDescription && !frontmatter.description) {
428
+ warnings.push(`Skill is missing a description in frontmatter: ${skillPath}`);
429
+ return;
430
+ }
424
431
  const skillDirName = path.basename(path.dirname(skillPath));
425
432
  const rawName = frontmatter.name;
426
433
  const name = typeof rawName === "string" ? rawName.trim() || skillDirName : skillDirName;
@@ -22,10 +22,12 @@ import "../capability/tool";
22
22
  // Import providers (each registers itself on import)
23
23
  import "./agents-md";
24
24
  import "./builtin";
25
+ import "./claude-hooks";
25
26
  import "./claude-plugins";
26
27
  import "./cline";
27
28
  import "./agents";
28
29
  import "./cursor";
30
+ import "./codex-hooks";
29
31
  import "./gemini";
30
32
  import "./opencode";
31
33
  import "./github";
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Bounded Claude Code / Codex MCP import-source adapters.
3
+ *
4
+ * These functions normalize foreign MCP formats to GJC's internal MCP contract
5
+ * (`MCPServer`). They are EXPLICIT import sources: a caller (for example the
6
+ * `/extensions` import transaction) reads a Claude `.mcp.json` or Codex
7
+ * `config.toml` file and writes the normalized definitions into GJC's native
8
+ * `.gjc` config. They are never registered as runtime discovery providers, so
9
+ * foreign files are never implicit competing runtime authorities, and user-home
10
+ * (`~/.claude`, `~/.codex`) configuration is never scanned.
11
+ */
12
+ import { tryParseJson } from "@gajae-code/utils";
13
+ import { type MCPServer, mcpCapability } from "../capability/mcp";
14
+ import type { LoadResult, SourceMeta } from "../capability/types";
15
+ import { createSourceMeta, expandEnvVarsDeep } from "./helpers";
16
+
17
+ const PROVIDER_IDS = {
18
+ claude: "claude",
19
+ codex: "codex",
20
+ } as const;
21
+
22
+ const PROTOTYPE_SENSITIVE_SERVER_NAMES = new Set(["__proto__", "prototype", "constructor"]);
23
+
24
+ function isRecord(value: unknown): value is Record<string, unknown> {
25
+ return typeof value === "object" && value !== null && !Array.isArray(value);
26
+ }
27
+
28
+ function isStringRecord(value: unknown): value is Record<string, string> {
29
+ return isRecord(value) && Object.values(value).every(item => typeof item === "string");
30
+ }
31
+
32
+ /** Result of normalizing a foreign MCP config into the internal contract. */
33
+ export interface MCPCompatNormalizeResult extends LoadResult<MCPServer> {
34
+ /** Normalization diagnostics (always present, possibly empty). */
35
+ warnings: string[];
36
+ /** Path the definitions were normalized from (for provenance). */
37
+ sourcePath: string;
38
+ }
39
+
40
+ function compatSource(providerId: string, sourcePath: string, level: "project" | "user"): SourceMeta {
41
+ return createSourceMeta(providerId, sourcePath, level);
42
+ }
43
+
44
+ /**
45
+ * Normalize a Claude Code `.mcp.json` file body into the internal MCP contract.
46
+ *
47
+ * The Claude project format uses the same `{ "mcpServers": { name: {...} } }`
48
+ * JSON shape as GJC's config; `enabled`/`autoload` are preserved so a caller
49
+ * can decide startup behavior after import. Bounded to the supplied content:
50
+ * no filesystem scanning, no user-home reads.
51
+ */
52
+ export function normalizeClaudeMcpJson(
53
+ content: string,
54
+ sourcePath: string,
55
+ level: "project" | "user" = "project",
56
+ ): MCPCompatNormalizeResult {
57
+ const items: MCPServer[] = [];
58
+ const warnings: string[] = [];
59
+ const json = tryParseJson<Record<string, unknown>>(content);
60
+ const mcpServers = json?.mcpServers;
61
+ if (!json || !isRecord(mcpServers)) {
62
+ warnings.push(`Failed to parse MCP servers in ${sourcePath}`);
63
+ return { items, warnings, sourcePath };
64
+ }
65
+
66
+ // Check prototype-sensitive names on the RAW record first: env expansion
67
+ // rebuilds the object via plain assignment, which silently drops a
68
+ // `__proto__` own-property into the result's prototype — the check must
69
+ // run before that transformation or it would never fire.
70
+ const unsafeNames = Object.keys(mcpServers).filter(name => PROTOTYPE_SENSITIVE_SERVER_NAMES.has(name));
71
+ for (const name of unsafeNames) {
72
+ warnings.push(`Skipped unsafe MCP server name in ${sourcePath}: ${name}`);
73
+ }
74
+ const expanded = expandEnvVarsDeep(mcpServers);
75
+ for (const [name, config] of Object.entries(expanded)) {
76
+ if (PROTOTYPE_SENSITIVE_SERVER_NAMES.has(name)) {
77
+ continue;
78
+ }
79
+ const serverConfig = isRecord(config) ? config : {};
80
+ const server: MCPServer = {
81
+ name,
82
+ enabled: typeof serverConfig.enabled === "boolean" ? serverConfig.enabled : undefined,
83
+ autoload: typeof serverConfig.autoload === "boolean" ? serverConfig.autoload : undefined,
84
+ sharing:
85
+ serverConfig.sharing === "per-session" || serverConfig.sharing === "shared"
86
+ ? serverConfig.sharing
87
+ : undefined,
88
+ timeout: typeof serverConfig.timeout === "number" ? serverConfig.timeout : undefined,
89
+ command: typeof serverConfig.command === "string" ? serverConfig.command : undefined,
90
+ args: Array.isArray(serverConfig.args)
91
+ ? serverConfig.args.filter((arg): arg is string => typeof arg === "string")
92
+ : undefined,
93
+ env: isStringRecord(serverConfig.env) ? serverConfig.env : undefined,
94
+ noInheritEnv: typeof serverConfig.noInheritEnv === "boolean" ? serverConfig.noInheritEnv : undefined,
95
+ cwd: typeof serverConfig.cwd === "string" ? serverConfig.cwd : undefined,
96
+ url: typeof serverConfig.url === "string" ? serverConfig.url : undefined,
97
+ headers: isStringRecord(serverConfig.headers) ? serverConfig.headers : undefined,
98
+ transport:
99
+ serverConfig.type === "http" || serverConfig.type === "sse" || serverConfig.type === "stdio"
100
+ ? serverConfig.type
101
+ : undefined,
102
+ _source: compatSource(PROVIDER_IDS.claude, sourcePath, level),
103
+ };
104
+ items.push(server);
105
+ }
106
+ return { items, warnings, sourcePath };
107
+ }
108
+
109
+ interface CodexMcpServerConfig {
110
+ command?: string;
111
+ args?: string[];
112
+ env?: Record<string, string>;
113
+ env_vars?: string[];
114
+ url?: string;
115
+ http_headers?: Record<string, string>;
116
+ env_http_headers?: Record<string, string>;
117
+ bearer_token_env_var?: string;
118
+ cwd?: string;
119
+ startup_timeout_sec?: number;
120
+ tool_timeout_sec?: number;
121
+ }
122
+
123
+ /**
124
+ * Extract normalized MCP servers from a Codex `config.toml` `[mcp_servers.*]`
125
+ * section. Codex's config does not carry an `enabled` concept; imported servers
126
+ * default to autoload (startup) behavior after import. Bounded to the supplied
127
+ * content: no filesystem scanning, no user-home reads.
128
+ */
129
+ function extractCodexMcpServers(toml: Record<string, unknown>): Record<string, Partial<MCPServer>> {
130
+ if (!toml.mcp_servers || !isRecord(toml.mcp_servers)) return {};
131
+
132
+ const codexServers = toml.mcp_servers as Record<string, CodexMcpServerConfig>;
133
+ const result: Record<string, Partial<MCPServer>> = {};
134
+ for (const [name, config] of Object.entries(codexServers)) {
135
+ // `result[name] = ...` below is a plain assignment: a prototype-sensitive
136
+ // name would mutate the result's prototype instead of becoming an item.
137
+ if (PROTOTYPE_SENSITIVE_SERVER_NAMES.has(name)) continue;
138
+ const serverConfig = isRecord(config) ? config : {};
139
+ const server: Partial<MCPServer> = {
140
+ command: typeof serverConfig.command === "string" ? serverConfig.command : undefined,
141
+ args: Array.isArray(serverConfig.args)
142
+ ? serverConfig.args.filter((arg): arg is string => typeof arg === "string")
143
+ : undefined,
144
+ url: typeof serverConfig.url === "string" ? serverConfig.url : undefined,
145
+ cwd: typeof serverConfig.cwd === "string" ? serverConfig.cwd : undefined,
146
+ };
147
+
148
+ const env: Record<string, string> = { ...(isStringRecord(serverConfig.env) ? serverConfig.env : {}) };
149
+ if (Array.isArray(serverConfig.env_vars)) {
150
+ for (const varName of serverConfig.env_vars) {
151
+ if (typeof varName !== "string") continue;
152
+ const value = Bun.env[varName];
153
+ if (value !== undefined) env[varName] = value;
154
+ }
155
+ }
156
+ if (Object.keys(env).length > 0) server.env = env;
157
+
158
+ const headers: Record<string, string> = {
159
+ ...(isStringRecord(serverConfig.http_headers) ? serverConfig.http_headers : {}),
160
+ };
161
+ if (isRecord(serverConfig.env_http_headers)) {
162
+ for (const [headerName, envVarName] of Object.entries(serverConfig.env_http_headers)) {
163
+ if (typeof envVarName !== "string") continue;
164
+ const value = Bun.env[envVarName];
165
+ if (value !== undefined) headers[headerName] = value;
166
+ }
167
+ }
168
+ if (typeof serverConfig.bearer_token_env_var === "string") {
169
+ const token = Bun.env[serverConfig.bearer_token_env_var];
170
+ if (token) headers.Authorization = `Bearer ${token}`;
171
+ }
172
+ if (Object.keys(headers).length > 0) server.headers = headers;
173
+
174
+ if (server.url) {
175
+ server.transport = "http";
176
+ } else if (server.command) {
177
+ server.transport = "stdio";
178
+ }
179
+ if (typeof serverConfig.tool_timeout_sec === "number" && serverConfig.tool_timeout_sec > 0) {
180
+ server.timeout = serverConfig.tool_timeout_sec * 1000;
181
+ }
182
+ result[name] = server;
183
+ }
184
+ return result;
185
+ }
186
+
187
+ /**
188
+ * Normalize a Codex `config.toml` file body into the internal MCP contract.
189
+ * Only the `[mcp_servers.*]` sections are read; everything else is ignored.
190
+ */
191
+ export function normalizeCodexMcpToml(
192
+ content: string,
193
+ sourcePath: string,
194
+ level: "project" | "user" = "project",
195
+ ): MCPCompatNormalizeResult {
196
+ const items: MCPServer[] = [];
197
+ const warnings: string[] = [];
198
+ let parsed: Record<string, unknown>;
199
+ try {
200
+ parsed = Bun.TOML.parse(content) as Record<string, unknown>;
201
+ } catch {
202
+ warnings.push(`Failed to parse TOML in ${sourcePath}`);
203
+ return { items, warnings, sourcePath };
204
+ }
205
+
206
+ // Mirror the Claude path: warn on prototype-sensitive names dropped by the
207
+ // extractor's plain-assignment result construction.
208
+ if (isRecord(parsed.mcp_servers)) {
209
+ for (const name of Object.keys(parsed.mcp_servers)) {
210
+ if (PROTOTYPE_SENSITIVE_SERVER_NAMES.has(name)) {
211
+ warnings.push(`Skipped unsafe MCP server name in ${sourcePath}: ${name}`);
212
+ }
213
+ }
214
+ }
215
+ const servers = extractCodexMcpServers(parsed);
216
+ for (const [name, config] of Object.entries(servers)) {
217
+ items.push({
218
+ name,
219
+ ...config,
220
+ _source: compatSource(PROVIDER_IDS.codex, sourcePath, level),
221
+ } as MCPServer);
222
+ }
223
+ return { items, warnings, sourcePath };
224
+ }
225
+
226
+ /**
227
+ * Validate a normalized server against the internal MCP contract. Returns an
228
+ * error message, or undefined when the definition is importable. Callers use
229
+ * this to fail closed before writing a malformed/untrusted definition into
230
+ * `.gjc` (mcpCapability.validate is reused so import and runtime share one rule).
231
+ */
232
+ export function validateMCPCompatServer(server: MCPServer): string | undefined {
233
+ return mcpCapability.validate?.(server);
234
+ }