@gajae-code/coding-agent 0.13.2 → 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 (610) hide show
  1. package/CHANGELOG.md +215 -8
  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 +10 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +73 -9
  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 +2 -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/dynamic-theme-text.d.ts +9 -0
  87. package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
  88. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  89. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  90. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  91. package/dist/types/modes/components/pet-capability.d.ts +7 -21
  92. package/dist/types/modes/components/settings-selector.d.ts +5 -0
  93. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  94. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  95. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  96. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  97. package/dist/types/modes/interactive-mode.d.ts +1 -0
  98. package/dist/types/modes/theme/defaults/index.d.ts +118 -0
  99. package/dist/types/modes/types.d.ts +1 -0
  100. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  101. package/dist/types/runtime-mcp/config.d.ts +9 -0
  102. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  103. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  104. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  105. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  106. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  107. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  108. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  109. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  110. package/dist/types/runtime-mcp/types.d.ts +102 -10
  111. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  112. package/dist/types/sdk/broker/broker.d.ts +3 -55
  113. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  114. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  115. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  116. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  117. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  118. package/dist/types/sdk/bus/config.d.ts +11 -0
  119. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  120. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  121. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  122. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  123. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  124. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  125. package/dist/types/sdk/bus/index.d.ts +85 -99
  126. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  127. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  128. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  129. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  130. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  131. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  132. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  133. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  135. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  136. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  137. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  138. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  139. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  140. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  141. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  142. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  143. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  144. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  145. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  146. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  147. package/dist/types/sdk/cli/rows.d.ts +2 -11
  148. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  149. package/dist/types/sdk/client/client.d.ts +97 -1
  150. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  151. package/dist/types/sdk/host/control/index.d.ts +1 -1
  152. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  153. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  154. package/dist/types/sdk/host/host.d.ts +15 -1
  155. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  156. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  157. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  158. package/dist/types/sdk/host/types.d.ts +1 -1
  159. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  160. package/dist/types/sdk/index.d.ts +2 -1
  161. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  162. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  163. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  164. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  165. package/dist/types/sdk/mcp/server.d.ts +9 -6
  166. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  167. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  168. package/dist/types/sdk/prompt-status.d.ts +10 -3
  169. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  170. package/dist/types/sdk/receipt-state.d.ts +17 -0
  171. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  172. package/dist/types/sdk/router/index.d.ts +1 -0
  173. package/dist/types/sdk/router/session-router.d.ts +152 -0
  174. package/dist/types/sdk/session-list.d.ts +22 -0
  175. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  176. package/dist/types/sdk/session.d.ts +34 -1
  177. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  178. package/dist/types/session/account-inventory.d.ts +86 -0
  179. package/dist/types/session/agent-session.d.ts +145 -6
  180. package/dist/types/session/agent-storage.d.ts +10 -0
  181. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  182. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  183. package/dist/types/session/messages.d.ts +1 -1
  184. package/dist/types/session/secure-token-file.d.ts +3 -0
  185. package/dist/types/session/session-manager.d.ts +47 -1
  186. package/dist/types/session/startup-auth-config.d.ts +44 -0
  187. package/dist/types/session/terminal-abort.d.ts +378 -0
  188. package/dist/types/session/yield-queue.d.ts +7 -0
  189. package/dist/types/session-import/claude.d.ts +26 -0
  190. package/dist/types/session-import/codex.d.ts +88 -0
  191. package/dist/types/session-import/command.d.ts +35 -0
  192. package/dist/types/session-import/detect.d.ts +22 -0
  193. package/dist/types/session-import/index.d.ts +7 -0
  194. package/dist/types/session-import/provider-codex.d.ts +22 -0
  195. package/dist/types/session-import/provider-service.d.ts +38 -0
  196. package/dist/types/session-import/redact.d.ts +23 -0
  197. package/dist/types/session-import/service.d.ts +47 -0
  198. package/dist/types/session-import/types.d.ts +120 -0
  199. package/dist/types/setup/paseo/check.d.ts +16 -0
  200. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  201. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  202. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  203. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  204. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  205. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  206. package/dist/types/setup/paseo/remove.d.ts +14 -0
  207. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  208. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  209. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  210. package/dist/types/skill-state/active-state.d.ts +5 -1
  211. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  212. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  213. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  214. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  215. package/dist/types/slash-commands/types.d.ts +7 -1
  216. package/dist/types/task/executor.d.ts +10 -0
  217. package/dist/types/task/index.d.ts +3 -1
  218. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  219. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  220. package/dist/types/tools/bash.d.ts +2 -6
  221. package/dist/types/tools/browser/attach.d.ts +11 -0
  222. package/dist/types/tools/browser/launch.d.ts +20 -0
  223. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  224. package/dist/types/tools/browser/render.d.ts +1 -0
  225. package/dist/types/tools/browser.d.ts +3 -1
  226. package/dist/types/tools/image-gen.d.ts +10 -2
  227. package/dist/types/tools/index.d.ts +8 -0
  228. package/dist/types/tools/monitor.d.ts +1 -1
  229. package/dist/types/tools/skill-discovery.d.ts +8 -1
  230. package/dist/types/tools/subagent.d.ts +2 -0
  231. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  232. package/dist/types/utils/herdr-pane.d.ts +76 -0
  233. package/package.json +19 -9
  234. package/scripts/build-binary.ts +2 -1
  235. package/scripts/build-sdk-package-smoke.ts +2 -13
  236. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  237. package/scripts/compile-args.ts +2 -0
  238. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  239. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  240. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  241. package/scripts/generate-tool-catalog.ts +6 -4
  242. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  243. package/src/async/job-manager.ts +352 -17
  244. package/src/async/support.ts +25 -0
  245. package/src/autoresearch/dashboard.ts +28 -13
  246. package/src/capability/index.ts +3 -1
  247. package/src/capability/mcp.ts +6 -0
  248. package/src/capability/types.ts +6 -0
  249. package/src/cli/accounts-cli.ts +395 -0
  250. package/src/cli/args.ts +23 -0
  251. package/src/cli/auth-broker-cli.ts +136 -66
  252. package/src/cli/auth-gateway-cli.ts +94 -70
  253. package/src/cli/config-cli.ts +27 -2
  254. package/src/cli/crash-cli.ts +78 -0
  255. package/src/cli/customize-doctor.ts +1605 -0
  256. package/src/cli/daemon-cli.ts +12 -3
  257. package/src/cli/fast-help.ts +1 -0
  258. package/src/cli/mcp-cli.ts +128 -60
  259. package/src/cli/notify-cli.ts +8 -14
  260. package/src/cli/root-flags.ts +8 -0
  261. package/src/cli/setup-cli.ts +145 -0
  262. package/src/cli/skills-cli.ts +38 -2
  263. package/src/cli/update-cli.ts +167 -12
  264. package/src/cli.ts +4 -0
  265. package/src/commands/accounts.ts +71 -0
  266. package/src/commands/crash.ts +35 -0
  267. package/src/commands/customize.ts +84 -0
  268. package/src/commands/daemon.ts +2 -2
  269. package/src/commands/deep-interview.ts +2 -0
  270. package/src/commands/launch.ts +1 -0
  271. package/src/commands/mcp.ts +12 -7
  272. package/src/commands/ralplan.ts +2 -0
  273. package/src/commands/sdk.ts +65 -32
  274. package/src/commands/setup.ts +5 -0
  275. package/src/commands/skills.ts +14 -4
  276. package/src/commands/ultragoal.ts +10 -1
  277. package/src/commands/update.ts +26 -15
  278. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  279. package/src/config/atomic-yaml-patch.ts +769 -29
  280. package/src/config/config-schema-version.ts +10 -0
  281. package/src/config/file-lock.ts +70 -1
  282. package/src/config/mcp-schema.json +52 -14
  283. package/src/config/model-profile-activation.ts +23 -2
  284. package/src/config/model-profiles.ts +88 -21
  285. package/src/config/model-registry.ts +147 -21
  286. package/src/config/models-config-schema.ts +1 -1
  287. package/src/config/settings-schema.ts +77 -7
  288. package/src/config/settings.ts +4038 -199
  289. package/src/config/skill-settings-defaults.ts +41 -3
  290. package/src/config/task-delegation.ts +87 -0
  291. package/src/config/update-channel.ts +23 -0
  292. package/src/coordinator-mcp/server.ts +377 -308
  293. package/src/crash/index-store.ts +723 -0
  294. package/src/crash/nudge.ts +89 -0
  295. package/src/crash/record-loader.ts +149 -0
  296. package/src/crash/report.ts +551 -0
  297. package/src/crash/sanitize.ts +129 -0
  298. package/src/cursor.ts +36 -10
  299. package/src/customization/import.ts +946 -0
  300. package/src/customization/index.ts +4 -0
  301. package/src/customization/inventory.ts +335 -0
  302. package/src/customization/mutations.ts +141 -0
  303. package/src/customization/types.ts +223 -0
  304. package/src/daemon/control-types.ts +8 -1
  305. package/src/daemon/operator-contract.ts +6 -6
  306. package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
  307. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  308. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  309. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  310. package/src/discovery/claude-hooks.ts +38 -0
  311. package/src/discovery/claude.ts +142 -209
  312. package/src/discovery/codex-hooks.ts +38 -0
  313. package/src/discovery/codex.ts +132 -198
  314. package/src/discovery/helpers.ts +8 -1
  315. package/src/discovery/index.ts +2 -0
  316. package/src/discovery/mcp-compat.ts +234 -0
  317. package/src/discovery/mcp-json.ts +6 -0
  318. package/src/edit/renderer.ts +40 -0
  319. package/src/edit/streaming.ts +4 -2
  320. package/src/exec/bash-executor.ts +24 -20
  321. package/src/export/html/index.ts +51 -2
  322. package/src/extensibility/extensions/loader.ts +9 -1
  323. package/src/extensibility/extensions/runner.ts +17 -4
  324. package/src/extensibility/extensions/types.ts +31 -6
  325. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  326. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  327. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  328. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  329. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  330. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  331. package/src/extensibility/hooks/loader.ts +154 -10
  332. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  333. package/src/extensibility/skill-management.ts +368 -0
  334. package/src/extensibility/skills.ts +52 -16
  335. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  336. package/src/gjc-runtime/launch-worktree.ts +56 -2
  337. package/src/gjc-runtime/linux-proc.ts +7 -1
  338. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  339. package/src/gjc-runtime/session-state-lock.ts +992 -0
  340. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  341. package/src/gjc-runtime/state-writer.ts +39 -14
  342. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  343. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  344. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  345. package/src/gjc-runtime/workflow-settings.ts +596 -0
  346. package/src/goals/tools/goal-tool.ts +6 -1
  347. package/src/hooks/events.ts +291 -0
  348. package/src/hooks/native-skill-hook.ts +4 -0
  349. package/src/hooks/normalize.ts +369 -0
  350. package/src/hooks/skill-state.ts +165 -46
  351. package/src/internal-urls/docs-index.generated.ts +41 -32
  352. package/src/main.ts +36 -5
  353. package/src/migrate/mcp-mapper.ts +25 -2
  354. package/src/modes/acp/abort-scope.ts +29 -0
  355. package/src/modes/acp/acp-agent.ts +423 -98
  356. package/src/modes/components/assistant-message.ts +6 -1
  357. package/src/modes/components/chrome.ts +4 -3
  358. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  359. package/src/modes/components/customization/import-wizard.ts +372 -0
  360. package/src/modes/components/customization/index.ts +1 -0
  361. package/src/modes/components/dynamic-theme-text.ts +22 -0
  362. package/src/modes/components/gajae-pet-widget.ts +607 -193
  363. package/src/modes/components/irc-sidebar.ts +11 -0
  364. package/src/modes/components/iterm-pet-transport.ts +585 -0
  365. package/src/modes/components/model-selector.ts +1 -6
  366. package/src/modes/components/oauth-selector.ts +277 -86
  367. package/src/modes/components/pet-capability.ts +35 -31
  368. package/src/modes/components/settings-selector.ts +29 -5
  369. package/src/modes/components/status-line/gh.ts +45 -1
  370. package/src/modes/components/status-line/segments.ts +19 -4
  371. package/src/modes/components/tool-status-header.ts +13 -3
  372. package/src/modes/controllers/command-controller.ts +20 -8
  373. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  374. package/src/modes/controllers/input-controller.ts +10 -0
  375. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  376. package/src/modes/controllers/selector-controller.ts +238 -77
  377. package/src/modes/controllers/stt-controller.ts +3 -3
  378. package/src/modes/interactive-mode.ts +88 -16
  379. package/src/modes/print-mode.ts +35 -6
  380. package/src/modes/runtime-init.ts +21 -68
  381. package/src/modes/theme/defaults/index.ts +2 -0
  382. package/src/modes/theme/defaults/ouroboros.json +118 -0
  383. package/src/modes/types.ts +1 -0
  384. package/src/modes/utils/injected-user-submission.ts +25 -0
  385. package/src/modes/utils/terminal-bell.ts +15 -1
  386. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  387. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  388. package/src/prompts/agents/critic.md +1 -1
  389. package/src/prompts/system/rlm-research.md +1 -1
  390. package/src/prompts/system/system-prompt.md +0 -2
  391. package/src/prompts/tools/bash.md +7 -1
  392. package/src/prompts/tools/browser.md +1 -1
  393. package/src/prompts/tools/cron.md +6 -6
  394. package/src/prompts/tools/read.md +0 -2
  395. package/src/prompts/tools/skill-discovery.md +4 -2
  396. package/src/runtime-mcp/client.ts +427 -23
  397. package/src/runtime-mcp/config.ts +37 -5
  398. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  399. package/src/runtime-mcp/manager.ts +52 -2
  400. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  401. package/src/runtime-mcp/oauth-flow.ts +46 -1
  402. package/src/runtime-mcp/pool-key.ts +5 -1
  403. package/src/runtime-mcp/pool.test.ts +9 -0
  404. package/src/runtime-mcp/protocol.test.ts +353 -0
  405. package/src/runtime-mcp/protocol.ts +624 -0
  406. package/src/runtime-mcp/scope-config.ts +78 -0
  407. package/src/runtime-mcp/tool-bridge.ts +44 -10
  408. package/src/runtime-mcp/transports/http.ts +84 -13
  409. package/src/runtime-mcp/types.ts +123 -12
  410. package/src/sdk/acp/adapter.ts +328 -97
  411. package/src/sdk/broker/broker.ts +160 -741
  412. package/src/sdk/broker/ensure.ts +9 -1
  413. package/src/sdk/broker/lifecycle.ts +510 -116
  414. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  415. package/src/sdk/broker/process-incarnation.ts +19 -0
  416. package/src/sdk/broker/session-index.ts +516 -117
  417. package/src/sdk/broker/startup-failure.ts +28 -5
  418. package/src/sdk/broker/transport.ts +1 -13
  419. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  420. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  421. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  422. package/src/sdk/bus/config.ts +13 -0
  423. package/src/sdk/bus/conversation-store.ts +59 -171
  424. package/src/sdk/bus/daemon-paths.ts +20 -0
  425. package/src/sdk/bus/discord-conversation.ts +2 -0
  426. package/src/sdk/bus/discord-daemon.ts +524 -126
  427. package/src/sdk/bus/discord-live-provider.ts +206 -79
  428. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  429. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  430. package/src/sdk/bus/index.ts +2480 -456
  431. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  432. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  433. package/src/sdk/bus/managed-daemon.ts +2 -145
  434. package/src/sdk/bus/notification-service.ts +196 -0
  435. package/src/sdk/bus/operator-runtime.ts +1 -1
  436. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  437. package/src/sdk/bus/reconciliation-store.ts +553 -24
  438. package/src/sdk/bus/session-control.ts +49 -3
  439. package/src/sdk/bus/slack-conversation.ts +4 -0
  440. package/src/sdk/bus/slack-daemon.ts +733 -134
  441. package/src/sdk/bus/slack-live-provider.ts +65 -15
  442. package/src/sdk/bus/slack-provider.ts +4 -0
  443. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  444. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  445. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  446. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  447. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  448. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  449. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  450. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  451. package/src/sdk/bus/telegram-reference.ts +1 -226
  452. package/src/sdk/bus/telegram-setup.ts +2 -2
  453. package/src/sdk/bus/threaded-render.ts +1 -0
  454. package/src/sdk/bus/topic-registry.ts +279 -146
  455. package/src/sdk/cli/rows.ts +2 -35
  456. package/src/sdk/cli/session-cli.ts +776 -700
  457. package/src/sdk/client/client.ts +892 -1
  458. package/src/sdk/host/control/dispatch.ts +93 -58
  459. package/src/sdk/host/control/index.ts +1 -1
  460. package/src/sdk/host/control/operations.ts +18 -10
  461. package/src/sdk/host/control/runtime-gate.ts +40 -0
  462. package/src/sdk/host/host.ts +63 -12
  463. package/src/sdk/host/query/handlers.ts +66 -7
  464. package/src/sdk/host/reverse-leases.ts +2 -2
  465. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  466. package/src/sdk/host/session-runtime.test.ts +2787 -34
  467. package/src/sdk/host/session-runtime.ts +1489 -101
  468. package/src/sdk/host/surface-policy.ts +12 -8
  469. package/src/sdk/host/types.ts +1 -1
  470. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  471. package/src/sdk/host/websocket-transport.ts +85 -50
  472. package/src/sdk/index.ts +2 -1
  473. package/src/sdk/lifecycle/broker-client.ts +53 -0
  474. package/src/sdk/lifecycle/client.ts +234 -0
  475. package/src/sdk/lifecycle/index.ts +3 -0
  476. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  477. package/src/sdk/lifecycle/service.ts +720 -0
  478. package/src/sdk/mcp/server.ts +226 -188
  479. package/src/sdk/prompt-deadline-lease.ts +55 -0
  480. package/src/sdk/prompt-deadline-manager.ts +148 -0
  481. package/src/sdk/prompt-status.ts +11 -3
  482. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  483. package/src/sdk/protocol/operation-registry.ts +71 -8
  484. package/src/sdk/receipt-state.ts +43 -0
  485. package/src/sdk/reconciliation-extensions.ts +14 -0
  486. package/src/sdk/router/index.ts +1 -0
  487. package/src/sdk/router/session-router.ts +1658 -0
  488. package/src/sdk/session-list.ts +93 -0
  489. package/src/sdk/session-reconnect.ts +45 -1
  490. package/src/sdk/session.ts +716 -120
  491. package/src/sdk/transport/serve-cli.ts +18 -34
  492. package/src/session/account-inventory.ts +603 -0
  493. package/src/session/agent-session.ts +2873 -559
  494. package/src/session/agent-storage.ts +35 -0
  495. package/src/session/blob-store.ts +32 -1
  496. package/src/session/coordinator-tool-label.ts +40 -0
  497. package/src/session/internal/managed-session-scope.ts +4 -0
  498. package/src/session/internal/managed-session-storage.ts +199 -31
  499. package/src/session/messages.ts +1 -1
  500. package/src/session/secure-token-file.ts +80 -0
  501. package/src/session/session-manager.ts +757 -57
  502. package/src/session/session-storage.ts +25 -16
  503. package/src/session/startup-auth-config.ts +297 -0
  504. package/src/session/terminal-abort.ts +1253 -0
  505. package/src/session/yield-queue.ts +57 -15
  506. package/src/session-import/claude.ts +334 -0
  507. package/src/session-import/codex.ts +1033 -0
  508. package/src/session-import/command.ts +77 -0
  509. package/src/session-import/detect.ts +133 -0
  510. package/src/session-import/index.ts +7 -0
  511. package/src/session-import/provider-codex.ts +327 -0
  512. package/src/session-import/provider-service.ts +457 -0
  513. package/src/session-import/redact.ts +128 -0
  514. package/src/session-import/service.ts +1264 -0
  515. package/src/session-import/types.ts +148 -0
  516. package/src/setup/paseo/check.ts +213 -0
  517. package/src/setup/paseo/install-saga.ts +293 -0
  518. package/src/setup/paseo/json-publisher.ts +263 -0
  519. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  520. package/src/setup/paseo/paseo-ownership.ts +224 -0
  521. package/src/setup/paseo/paseo-setup.ts +253 -0
  522. package/src/setup/paseo/provider-config.ts +139 -0
  523. package/src/setup/paseo/remove.ts +183 -0
  524. package/src/setup/paseo/result-types.ts +79 -0
  525. package/src/setup/paseo/setup-deps.ts +175 -0
  526. package/src/setup/paseo/skills-bridge.ts +260 -0
  527. package/src/skill-state/active-state.ts +21 -11
  528. package/src/slash-commands/acp-builtins.ts +9 -1
  529. package/src/slash-commands/builtin-registry.ts +117 -19
  530. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  531. package/src/slash-commands/helpers/mcp.ts +9 -3
  532. package/src/slash-commands/helpers/usage-report.ts +61 -56
  533. package/src/slash-commands/types.ts +7 -2
  534. package/src/task/executor.ts +30 -11
  535. package/src/task/index.ts +66 -7
  536. package/src/task/render.ts +23 -9
  537. package/src/tools/ask-answer-registry.ts +23 -7
  538. package/src/tools/ask.ts +8 -4
  539. package/src/tools/bash-sleep-advisory.ts +115 -0
  540. package/src/tools/bash.ts +98 -18
  541. package/src/tools/browser/attach.ts +71 -3
  542. package/src/tools/browser/launch.ts +86 -13
  543. package/src/tools/browser/profile-discovery.ts +57 -7
  544. package/src/tools/browser/render.ts +8 -1
  545. package/src/tools/browser.ts +130 -21
  546. package/src/tools/computer.enforcement.test.ts +1 -1
  547. package/src/tools/computer.ts +3 -2
  548. package/src/tools/cron.ts +12 -1
  549. package/src/tools/image-gen.ts +349 -142
  550. package/src/tools/index.ts +8 -0
  551. package/src/tools/job.ts +33 -6
  552. package/src/tools/monitor.ts +41 -2
  553. package/src/tools/skill-discovery.ts +21 -29
  554. package/src/tools/subagent.ts +142 -24
  555. package/src/tools/todo-contract.ts +55 -3
  556. package/src/tools/todo-write.ts +4 -3
  557. package/src/tools/tool-catalog.generated.ts +6 -6
  558. package/src/tools/ultragoal-ask-guard.ts +10 -3
  559. package/src/utils/herdr-pane.ts +345 -0
  560. package/src/utils/title-generator.ts +2 -0
  561. package/src/web/scrapers/index.ts +6 -4
  562. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  563. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  564. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  565. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  566. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  567. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  568. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  569. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  570. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  571. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  572. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  573. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  574. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  575. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  576. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  577. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  578. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  579. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  580. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  581. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  582. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  583. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  584. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  585. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  586. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  587. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  588. package/dist/types/session/auth-broker-config.d.ts +0 -13
  589. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  590. package/dist/types/skills/skills.test.d.ts +0 -1
  591. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  592. package/dist/types/task/token-log.test.d.ts +0 -1
  593. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  594. package/dist/types/tools/descriptors.test.d.ts +0 -1
  595. package/scripts/g005-daemon-smoke.ts +0 -180
  596. package/scripts/g011-daemon-path-smoke.ts +0 -153
  597. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  598. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  599. package/src/sdk/bus/telegram-cli.ts +0 -212
  600. package/src/sdk/elevation/allowlist.ts +0 -54
  601. package/src/sdk/elevation/audit.ts +0 -208
  602. package/src/sdk/elevation/capability.ts +0 -41
  603. package/src/sdk/elevation/digest.ts +0 -129
  604. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  605. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  606. package/src/sdk/elevation/owner.ts +0 -109
  607. package/src/session/auth-broker-config.ts +0 -109
  608. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  609. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  610. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -17,14 +17,39 @@ import {
17
17
  /**
18
18
  * Top-level surfaces that may never appear in a GJC plugin bundle: bundles may
19
19
  * only EXTEND existing skills/agents, never register new top-level ones.
20
+ * Each rejection is a targeted migration diagnostic naming the safe
21
+ * alternative (the loose surface or the sub-skill binding model) instead of a
22
+ * generic forbidden-key error.
20
23
  */
21
- const FORBIDDEN_MANIFEST_KEYS = ["skills", "slash-commands", "commands", "agents"];
24
+ const FORBIDDEN_MANIFEST_KEYS = ["skills", "slash-commands", "commands", "agents"] as const;
25
+
26
+ type ForbiddenManifestKey = (typeof FORBIDDEN_MANIFEST_KEYS)[number];
27
+
28
+ const FORBIDDEN_SURFACE_DIAGNOSTICS: Record<ForbiddenManifestKey, string> = {
29
+ skills: `Forbidden GJC plugin surface "skills": bundles may only EXTEND the four bundled workflow skills (deep-interview, ralplan, ultragoal, team) and the four role agents (executor, architect, planner, critic), never register a new top-level skill. Bind an inline sub-skill with the canonical "subskills" surface (frontmatter binds_to/phase/activation_arg), or drop the manifest and use the loose surface .gjc/skills/<name>/SKILL.md (project) / ~/.gjc/agent/skills/<name>/SKILL.md (user).`,
30
+ "slash-commands": `Forbidden GJC plugin surface "slash-commands": bundles cannot register slash commands. Use the loose surface .gjc/commands/<name> (TypeScript module) or a markdown slash-command file instead.`,
31
+ commands: `Forbidden GJC plugin surface "commands" (Claude Code plugin.json vocabulary): bundles cannot register slash commands. Use the loose surface .gjc/commands/<name> (TypeScript module) or a markdown slash-command file instead.`,
32
+ agents: `Forbidden GJC plugin surface "agents" (Claude Code plugin.json vocabulary): bundles cannot register top-level agents; executor/architect/planner/critic are protected. Bind a sub-skill to an existing agent with the canonical "subskills" surface (frontmatter binds_to: one of executor|architect|planner|critic, phase, activation_arg) instead.`,
33
+ };
34
+
35
+ /**
36
+ * Ambiguous legacy aliases whose shape cannot be mapped onto the canonical
37
+ * compiled representation. Rejected as `unsupported_surface` with a targeted
38
+ * migration diagnostic naming the canonical form, never a generic unknown-key
39
+ * error. `mcp` is singular and shape-ambiguous (array entry vs single object),
40
+ * so it stays rejected; `mcpServers` is accepted and normalized (below).
41
+ */
42
+ const AMBIGUOUS_ALIAS_KEYS = ["mcp"] as const;
22
43
 
23
44
  /**
24
- * Ambiguous legacy aliases. `mcps` is the only canonical MCP key; these are
25
- * rejected as `unsupported_surface` to avoid accidental legacy shape ambiguity.
45
+ * Accepted compatibility aliases from Claude Code / Codex-familiar plugin
46
+ * vocabulary. Each is normalized into the canonical compiled representation at
47
+ * parse time, so a canonical manifest and its alias compile to byte-equivalent
48
+ * normalized surfaces. Only aliases with an unambiguous semantic mapping are
49
+ * accepted here; anything else falls into AMBIGUOUS_ALIAS_KEYS or a targeted
50
+ * per-field migration diagnostic.
26
51
  */
27
- const UNSUPPORTED_ALIAS_KEYS = ["mcp", "mcpServers"];
52
+ const ACCEPTED_ALIAS_KEYS = ["mcpServers"] as const;
28
53
 
29
54
  const KNOWN_MANIFEST_KEYS = new Set([
30
55
  "kind",
@@ -36,8 +61,33 @@ const KNOWN_MANIFEST_KEYS = new Set([
36
61
  "mcps",
37
62
  "system_appendix",
38
63
  "agent-appendix",
64
+ ...ACCEPTED_ALIAS_KEYS,
39
65
  ]);
40
66
 
67
+ /**
68
+ * Per-server keys the `mcpServers` alias accepts and maps onto the canonical
69
+ * `mcps` entry (`type` is Claude Code / loose mcp.json vocabulary for the
70
+ * canonical `transport` field).
71
+ */
72
+ const MCP_SERVER_ALIAS_KEYS = new Set(["type", "command", "args", "cwd", "url"]);
73
+
74
+ /**
75
+ * Per-server keys that exist in GJC's loose mcp.json surface but have NO
76
+ * equivalent in the canonical plugin-manifest `mcps` entry. An alias cannot
77
+ * preserve their semantics, so they raise a targeted migration diagnostic
78
+ * naming the loose surface that can hold them.
79
+ */
80
+ const MCP_SERVER_ALIAS_UNSUPPORTED_KEYS = [
81
+ "env",
82
+ "auth",
83
+ "oauth",
84
+ "headers",
85
+ "enabled",
86
+ "timeout",
87
+ "autoload",
88
+ "noInheritEnv",
89
+ ] as const;
90
+
41
91
  const MCP_TRANSPORTS: readonly GjcPluginMcpTransport[] = ["stdio", "http", "sse"];
42
92
 
43
93
  function isRecord(value: unknown): value is Record<string, unknown> {
@@ -191,6 +241,17 @@ function parseTools(value: unknown, manifestPath: string): GjcPluginToolManifest
191
241
  function parseHooks(value: unknown, manifestPath: string): GjcPluginHookManifestEntry[] {
192
242
  const raw = optionalArray(value, "hooks", manifestPath);
193
243
  return raw.map((entry, index) => {
244
+ // Claude Code plugin.json hook entries are matcher groups ({ matcher,
245
+ // hooks, source }) with no `name`; a GJC bundle hook is a single
246
+ // constrained file with a declared event. The shapes cannot be mapped
247
+ // onto each other, so give the author a targeted migration diagnostic
248
+ // instead of a generic missing-field error.
249
+ if (isRecord(entry) && ("matcher" in entry || "hooks" in entry || "source" in entry)) {
250
+ throw new GjcPluginLoadError(
251
+ "invalid_manifest",
252
+ `Invalid GJC plugin manifest at ${manifestPath}: hooks[${index}] looks like a Claude Code plugin.json hook entry ({ matcher, hooks, source }), which cannot be preserved as a GJC bundle hook. Canonical GJC bundle hooks are { name, event, target?, phase?, path, sha256? } (event "tool_call"/"tool_result" with target/phase, or a session event). For unconstrained local hooks, use the loose surface .gjc/hooks/pre/<tool>.ts / .gjc/hooks/post/<tool>.ts.`,
253
+ );
254
+ }
194
255
  if (!isRecord(entry)) {
195
256
  throw new GjcPluginLoadError(
196
257
  "invalid_manifest",
@@ -222,53 +283,151 @@ function parseHooks(value: unknown, manifestPath: string): GjcPluginHookManifest
222
283
  });
223
284
  }
224
285
 
225
- function parseMcps(value: unknown, manifestPath: string): GjcPluginMcpManifestEntry[] {
226
- const raw = optionalArray(value, "mcps", manifestPath);
227
- return raw.map((entry, index) => {
228
- if (!isRecord(entry)) {
286
+ function parseMcpEntry(entry: unknown, field: string, manifestPath: string): GjcPluginMcpManifestEntry {
287
+ if (!isRecord(entry)) {
288
+ throw new GjcPluginLoadError(
289
+ "invalid_manifest",
290
+ `Invalid GJC plugin manifest at ${manifestPath}: ${field} must be an object`,
291
+ );
292
+ }
293
+ const name = manifestSafeName(entry.name, `${field}.name`, manifestPath);
294
+ const transport = entry.transport;
295
+ if (typeof transport !== "string" || !MCP_TRANSPORTS.includes(transport as GjcPluginMcpTransport)) {
296
+ throw new GjcPluginLoadError(
297
+ "invalid_manifest",
298
+ `Invalid GJC plugin manifest at ${manifestPath}: ${field}.transport must be one of ${MCP_TRANSPORTS.join(", ")}`,
299
+ );
300
+ }
301
+ const command =
302
+ entry.command === undefined ? undefined : manifestString(entry.command, `${field}.command`, manifestPath);
303
+ const url = entry.url === undefined ? undefined : manifestString(entry.url, `${field}.url`, manifestPath);
304
+ const cwd = entry.cwd === undefined ? undefined : manifestString(entry.cwd, `${field}.cwd`, manifestPath);
305
+ let args: string[] | undefined;
306
+ if (entry.args !== undefined) {
307
+ if (!Array.isArray(entry.args) || !entry.args.every(item => typeof item === "string")) {
229
308
  throw new GjcPluginLoadError(
230
309
  "invalid_manifest",
231
- `Invalid GJC plugin manifest at ${manifestPath}: mcps[${index}] must be an object`,
310
+ `Invalid GJC plugin manifest at ${manifestPath}: ${field}.args must be a string array`,
232
311
  );
233
312
  }
234
- const name = manifestSafeName(entry.name, `mcps[${index}].name`, manifestPath);
235
- const transport = entry.transport;
236
- if (typeof transport !== "string" || !MCP_TRANSPORTS.includes(transport as GjcPluginMcpTransport)) {
313
+ args = [...(entry.args as string[])];
314
+ }
315
+ let headers: Record<string, string> | undefined;
316
+ if (entry.headers !== undefined) {
317
+ if (!isRecord(entry.headers) || !Object.values(entry.headers).every(v => typeof v === "string")) {
237
318
  throw new GjcPluginLoadError(
238
319
  "invalid_manifest",
239
- `Invalid GJC plugin manifest at ${manifestPath}: mcps[${index}].transport must be one of ${MCP_TRANSPORTS.join(", ")}`,
320
+ `Invalid GJC plugin manifest at ${manifestPath}: ${field}.headers must be a string map`,
240
321
  );
241
322
  }
242
- const command =
243
- entry.command === undefined
244
- ? undefined
245
- : manifestString(entry.command, `mcps[${index}].command`, manifestPath);
246
- const url = entry.url === undefined ? undefined : manifestString(entry.url, `mcps[${index}].url`, manifestPath);
247
- const cwd = entry.cwd === undefined ? undefined : manifestString(entry.cwd, `mcps[${index}].cwd`, manifestPath);
248
- let args: string[] | undefined;
249
- if (entry.args !== undefined) {
250
- if (!Array.isArray(entry.args) || !entry.args.every(item => typeof item === "string")) {
323
+ headers = { ...(entry.headers as Record<string, string>) };
324
+ }
325
+ const sha256 =
326
+ entry.sha256 === undefined ? undefined : manifestString(entry.sha256, `${field}.sha256`, manifestPath);
327
+ return { name, transport: transport as GjcPluginMcpTransport, command, args, cwd, url, headers, sha256 };
328
+ }
329
+
330
+ function parseMcps(value: unknown, manifestPath: string): GjcPluginMcpManifestEntry[] {
331
+ const raw = optionalArray(value, "mcps", manifestPath);
332
+ return raw.map((entry, index) => parseMcpEntry(entry, `mcps[${index}]`, manifestPath));
333
+ }
334
+
335
+ /**
336
+ * Claude Code / Codex-familiar `mcpServers` map (server name -> server config),
337
+ * normalized into the canonical `mcps` array. Only fields with an unambiguous
338
+ * canonical equivalent are accepted; anything the canonical `mcps` entry cannot
339
+ * preserve (env, auth, oauth, headers, enablement/timeout/autoload controls, unknown
340
+ * keys) raises a targeted migration diagnostic naming the exact alternative.
341
+ */
342
+ function normalizeMcpServersAlias(value: unknown, manifestPath: string): GjcPluginMcpManifestEntry[] {
343
+ if (!isRecord(value)) {
344
+ throw new GjcPluginLoadError(
345
+ "invalid_manifest",
346
+ `Invalid GJC plugin manifest at ${manifestPath}: "mcpServers" must be a map of server name to configuration`,
347
+ );
348
+ }
349
+ const entries: GjcPluginMcpManifestEntry[] = [];
350
+ const serverEntries = Object.entries(value).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
351
+ for (const [serverName, rawEntry] of serverEntries) {
352
+ if (!isRecord(rawEntry)) {
353
+ throw new GjcPluginLoadError(
354
+ "invalid_manifest",
355
+ `Invalid GJC plugin manifest at ${manifestPath}: mcpServers["${serverName}"] must be an object`,
356
+ );
357
+ }
358
+ for (const key of Object.keys(rawEntry)) {
359
+ if ((MCP_SERVER_ALIAS_UNSUPPORTED_KEYS as readonly string[]).includes(key)) {
251
360
  throw new GjcPluginLoadError(
252
- "invalid_manifest",
253
- `Invalid GJC plugin manifest at ${manifestPath}: mcps[${index}].args must be a string array`,
361
+ "unsupported_surface",
362
+ `mcpServers["${serverName}"] uses "${key}", which the canonical GJC bundle runtime cannot preserve end to end. "${key}" is supported by GJC's canonical loose MCP surface (mcpServers map in <project>/.gjc/mcp.json or ~/.gjc/agent/mcp.json): move this server there directly or through the /extensions import flow, or drop "${key}" from the bundle manifest (${manifestPath})`,
363
+ );
364
+ }
365
+ if (!MCP_SERVER_ALIAS_KEYS.has(key)) {
366
+ throw new GjcPluginLoadError(
367
+ "unsupported_surface",
368
+ `mcpServers["${serverName}"] has unknown key "${key}". Canonical "mcps" entries support name, transport, command, args, cwd, url, headers, sha256; the "mcpServers" alias additionally accepts "type" for the transport (${manifestPath})`,
254
369
  );
255
370
  }
256
- args = [...(entry.args as string[])];
257
371
  }
258
- let headers: Record<string, string> | undefined;
259
- if (entry.headers !== undefined) {
260
- if (!isRecord(entry.headers) || !Object.values(entry.headers).every(v => typeof v === "string")) {
372
+ let transport: GjcPluginMcpTransport;
373
+ if (rawEntry.type !== undefined) {
374
+ if (typeof rawEntry.type !== "string" || !MCP_TRANSPORTS.includes(rawEntry.type as GjcPluginMcpTransport)) {
261
375
  throw new GjcPluginLoadError(
262
376
  "invalid_manifest",
263
- `Invalid GJC plugin manifest at ${manifestPath}: mcps[${index}].headers must be a string map`,
377
+ `Invalid GJC plugin manifest at ${manifestPath}: mcpServers["${serverName}"].type must be one of ${MCP_TRANSPORTS.join(", ")}`,
264
378
  );
265
379
  }
266
- headers = { ...(entry.headers as Record<string, string>) };
380
+ transport = rawEntry.type as GjcPluginMcpTransport;
381
+ } else if (typeof rawEntry.command === "string" && typeof rawEntry.url === "string") {
382
+ // Both stdio (command) and url transports declared without a type:
383
+ // ambiguous, refuse rather than guess.
384
+ throw new GjcPluginLoadError(
385
+ "invalid_manifest",
386
+ `Invalid GJC plugin manifest at ${manifestPath}: mcpServers["${serverName}"] declares both "command" and "url" without a "type". Set "type" to "stdio" (command) or "http"/"sse" (url).`,
387
+ );
388
+ } else if (typeof rawEntry.command === "string") {
389
+ // Claude Code defaults: a command means stdio.
390
+ transport = "stdio";
391
+ } else if (typeof rawEntry.url === "string") {
392
+ // A bare url means an http transport; sse must be declared explicitly.
393
+ transport = "http";
394
+ } else {
395
+ throw new GjcPluginLoadError(
396
+ "invalid_manifest",
397
+ `Invalid GJC plugin manifest at ${manifestPath}: mcpServers["${serverName}"] cannot determine a transport. Set "type" (stdio | http | sse), or provide "command" (stdio) or "url" (http)`,
398
+ );
267
399
  }
268
- const sha256 =
269
- entry.sha256 === undefined ? undefined : manifestString(entry.sha256, `mcps[${index}].sha256`, manifestPath);
270
- return { name, transport: transport as GjcPluginMcpTransport, command, args, cwd, url, headers, sha256 };
271
- });
400
+ const incompatibleKeys = transport === "stdio" ? ["url"] : ["command", "args", "cwd"];
401
+ for (const key of incompatibleKeys) {
402
+ if (rawEntry[key] !== undefined) {
403
+ throw new GjcPluginLoadError(
404
+ "unsupported_surface",
405
+ `mcpServers["${serverName}"] uses "${key}" with transport "${transport}", but the GJC bundle runtime cannot preserve that field for this transport. Use only command/args/cwd for stdio or url for http/sse, or move the server to the canonical loose .gjc/mcp.json surface (${manifestPath})`,
406
+ );
407
+ }
408
+ }
409
+ entries.push(
410
+ parseMcpEntry(
411
+ {
412
+ name: serverName,
413
+ transport,
414
+ ...pickOptional(rawEntry, ["command", "args", "cwd", "url"]),
415
+ },
416
+ `mcpServers["${serverName}"]`,
417
+ manifestPath,
418
+ ),
419
+ );
420
+ }
421
+ return entries;
422
+ }
423
+
424
+ function pickOptional(entry: Record<string, unknown>, keys: readonly string[]): Record<string, unknown> {
425
+ const out: Record<string, unknown> = {};
426
+ for (const key of keys) {
427
+ const value = entry[key];
428
+ if (value !== undefined) out[key] = value;
429
+ }
430
+ return out;
272
431
  }
273
432
 
274
433
  function parseAppendixEntry(entry: unknown, field: string, manifestPath: string): GjcPluginAppendixManifestEntry {
@@ -324,15 +483,18 @@ export function parseManifest(raw: unknown, manifestPath: string): GjcPluginMani
324
483
 
325
484
  for (const key of FORBIDDEN_MANIFEST_KEYS) {
326
485
  if (Object.hasOwn(raw, key)) {
327
- throw new GjcPluginLoadError("forbidden_surface", `Forbidden GJC plugin surface in ${manifestPath}: ${key}`);
486
+ throw new GjcPluginLoadError(
487
+ "forbidden_surface",
488
+ `GJC plugin manifest at ${manifestPath}: ${FORBIDDEN_SURFACE_DIAGNOSTICS[key]}`,
489
+ );
328
490
  }
329
491
  }
330
492
 
331
- for (const key of UNSUPPORTED_ALIAS_KEYS) {
493
+ for (const key of AMBIGUOUS_ALIAS_KEYS) {
332
494
  if (Object.hasOwn(raw, key)) {
333
495
  throw new GjcPluginLoadError(
334
496
  "unsupported_surface",
335
- `Unsupported GJC plugin surface in ${manifestPath}: ${key} (use the canonical "mcps" key)`,
497
+ `Unsupported GJC plugin surface "${key}" in ${manifestPath}: the singular "mcp" shape is ambiguous. Use the canonical "mcps" (array of { name, transport, command, args, cwd, url, headers }) or the Claude Code-compatible "mcpServers" map alias.`,
336
498
  );
337
499
  }
338
500
  }
@@ -341,11 +503,22 @@ export function parseManifest(raw: unknown, manifestPath: string): GjcPluginMani
341
503
  if (!KNOWN_MANIFEST_KEYS.has(key)) {
342
504
  throw new GjcPluginLoadError(
343
505
  "unsupported_surface",
344
- `Unsupported GJC plugin surface in ${manifestPath}: ${key}`,
506
+ `Unsupported GJC plugin surface in ${manifestPath}: ${key}. Known GJC bundle keys: ${[...KNOWN_MANIFEST_KEYS].sort().join(", ")}.`,
345
507
  );
346
508
  }
347
509
  }
348
510
 
511
+ // Claude Code plugin.json declares hooks as an event-keyed map; GJC bundle
512
+ // hooks are a constrained array. Detect the foreign shape and explain the
513
+ // canonical form (and the loose hook surface) instead of a generic
514
+ // must-be-an-array error.
515
+ if (raw.hooks !== undefined && !Array.isArray(raw.hooks)) {
516
+ throw new GjcPluginLoadError(
517
+ "invalid_manifest",
518
+ `Invalid GJC plugin manifest at ${manifestPath}: "hooks" must be an array of { name, event, target?, phase?, path, sha256? }. A Claude Code plugin.json "hooks" map (event-keyed matcher groups) cannot be preserved as a GJC bundle hook. For unconstrained local hooks, use the loose surface .gjc/hooks/pre/<tool>.ts / .gjc/hooks/post/<tool>.ts.`,
519
+ );
520
+ }
521
+
349
522
  if (raw.kind !== GJC_PLUGIN_KIND) {
350
523
  throw new GjcPluginLoadError(
351
524
  "invalid_kind",
@@ -353,6 +526,13 @@ export function parseManifest(raw: unknown, manifestPath: string): GjcPluginMani
353
526
  );
354
527
  }
355
528
 
529
+ if (raw.mcps !== undefined && raw.mcpServers !== undefined) {
530
+ throw new GjcPluginLoadError(
531
+ "invalid_manifest",
532
+ `Invalid GJC plugin manifest at ${manifestPath}: use either the canonical "mcps" array or the "mcpServers" alias map, not both.`,
533
+ );
534
+ }
535
+
356
536
  const name = manifestSafeName(raw.name, "name", manifestPath);
357
537
  const version = manifestSafeVersion(raw.version, manifestPath);
358
538
 
@@ -363,7 +543,10 @@ export function parseManifest(raw: unknown, manifestPath: string): GjcPluginMani
363
543
  subskills: optionalStringArray(raw.subskills, "subskills", manifestPath),
364
544
  tools: parseTools(raw.tools, manifestPath),
365
545
  hooks: parseHooks(raw.hooks, manifestPath),
366
- mcps: parseMcps(raw.mcps, manifestPath),
546
+ mcps:
547
+ raw.mcpServers !== undefined
548
+ ? normalizeMcpServersAlias(raw.mcpServers, manifestPath)
549
+ : parseMcps(raw.mcps, manifestPath),
367
550
  systemAppendix: parseSystemAppendix(raw.system_appendix, manifestPath),
368
551
  agentAppendix: parseAgentAppendix(raw["agent-appendix"], manifestPath),
369
552
  };
@@ -7,12 +7,29 @@ import * as zod from "zod/v4";
7
7
  import { hookCapability } from "../../capability/hook";
8
8
  import type { Hook } from "../../discovery";
9
9
  import { loadCapability } from "../../discovery";
10
+ import { HookSourceConvention } from "../../hooks/events";
11
+ import { type NormalizedHook, normalizeDirectoryHook } from "../../hooks/normalize";
10
12
  import type { HookMessage } from "../../session/messages";
11
13
  import type { SessionManager } from "../../session/session-manager";
14
+ import type {
15
+ ExtensionAPI,
16
+ ExtensionCommandContext,
17
+ ExtensionContext,
18
+ ExtensionFactory,
19
+ MessageRenderer,
20
+ } from "../extensions/types";
12
21
  import * as typebox from "../typebox";
13
22
  import { resolvePath } from "../utils";
14
23
  import { execCommand } from "./runner";
15
- import type { ExecOptions, HookAPI, HookFactory, HookMessageRenderer, RegisteredCommand } from "./types";
24
+ import type {
25
+ ExecOptions,
26
+ HookAPI,
27
+ HookCommandContext,
28
+ HookContext,
29
+ HookFactory,
30
+ HookMessageRenderer,
31
+ RegisteredCommand,
32
+ } from "./types";
16
33
 
17
34
  /**
18
35
  * Generic handler function type.
@@ -71,6 +88,8 @@ export interface LoadedHook {
71
88
  setSendMessageHandler: (handler: SendMessageHandler) => void;
72
89
  /** Set the append entry handler for this hook's pi.appendEntry() */
73
90
  setAppendEntryHandler: (handler: AppendEntryHandler) => void;
91
+ /** Canonical discovery descriptor when loaded from a known hook convention. */
92
+ normalization?: NormalizedHook;
74
93
  }
75
94
 
76
95
  /**
@@ -83,6 +102,11 @@ export interface LoadHooksResult {
83
102
  errors: Array<{ path: string; error: string }>;
84
103
  }
85
104
 
105
+ export interface LoadHookExtensionsResult {
106
+ factories: Array<{ factory: ExtensionFactory; name: string }>;
107
+ errors: Array<{ path: string; error: string }>;
108
+ }
109
+
86
110
  /**
87
111
  * Create a HookAPI instance that collects handlers, renderers, and commands.
88
112
  * Returns the API, maps, and functions to set handlers later.
@@ -223,17 +247,17 @@ export async function loadHooks(paths: string[], cwd: string): Promise<LoadHooks
223
247
  }
224
248
 
225
249
  /**
226
- * Discover and load hooks from all registered providers.
227
- * Uses the capability API to discover hook paths from:
228
- * 1. GJC native configs (.gjc/.pi hooks/)
229
- * 2. Installed plugins
230
- * 3. Other editor/IDE configurations
250
+ * Discover and load hooks from canonical native GJC configuration.
251
+ * Claude Code and Codex hook layouts remain registered capability providers for
252
+ * explicit import and diagnostics, but are not competing runtime authorities.
231
253
  *
232
254
  * Plus any explicitly configured paths from settings.
233
255
  */
234
256
  export async function discoverAndLoadHooks(configuredPaths: string[], cwd: string): Promise<LoadHooksResult> {
235
257
  const allPaths: string[] = [];
236
258
  const seen = new Set<string>();
259
+ const normalizationErrors: Array<{ path: string; error: string }> = [];
260
+ const normalizationByPath = new Map<string, NormalizedHook>();
237
261
 
238
262
  // Helper to add paths without duplicates
239
263
  const addPaths = (paths: string[]) => {
@@ -246,12 +270,132 @@ export async function discoverAndLoadHooks(configuredPaths: string[], cwd: strin
246
270
  }
247
271
  };
248
272
 
249
- // 1. Discover hooks via capability API
250
- const discovered = await loadCapability<Hook>(hookCapability.id, { cwd });
251
- addPaths(discovered.items.map(hook => hook.path));
273
+ // 1. Discover hooks via capability API and validate the provider descriptor
274
+ // against the canonical model before importing project-controlled code.
275
+ const discovered = await loadCapability<Hook>(hookCapability.id, { cwd, providers: ["native"] });
276
+ for (const hook of discovered.items) {
277
+ const convention =
278
+ hook._source.provider === "native"
279
+ ? HookSourceConvention.NativeGjc
280
+ : hook._source.provider === "claude"
281
+ ? HookSourceConvention.ClaudeCode
282
+ : hook._source.provider === "codex"
283
+ ? HookSourceConvention.Codex
284
+ : null;
285
+ if (convention) {
286
+ const normalized = normalizeDirectoryHook({
287
+ convention,
288
+ phase: hook.type,
289
+ toolName: hook.tool,
290
+ source: hook.path,
291
+ externalName: hook.name,
292
+ });
293
+ if (!normalized.hook) {
294
+ normalizationErrors.push({
295
+ path: hook.path,
296
+ error: normalized.diagnostics.map(diagnostic => `${diagnostic.code}: ${diagnostic.message}`).join("; "),
297
+ });
298
+ continue;
299
+ }
300
+ normalizationByPath.set(path.resolve(hook.path), normalized.hook);
301
+ }
302
+ addPaths([hook.path]);
303
+ }
252
304
 
253
305
  // 2. Explicitly configured paths (can override/add)
254
306
  addPaths(configuredPaths.map(p => resolvePath(p, cwd)));
255
307
 
256
- return loadHooks(allPaths, cwd);
308
+ const loaded = await loadHooks(allPaths, cwd);
309
+ for (const hook of loaded.hooks) {
310
+ hook.normalization = normalizationByPath.get(path.resolve(hook.path));
311
+ }
312
+ return { hooks: loaded.hooks, errors: [...normalizationErrors, ...loaded.errors] };
313
+ }
314
+
315
+ function toHookContext(context: ExtensionContext): HookContext {
316
+ return {
317
+ ui: {
318
+ select: (title, options) => context.ui.select(title, options),
319
+ confirm: (title, message) => context.ui.confirm(title, message),
320
+ input: (title, placeholder) => context.ui.input(title, placeholder),
321
+ notify: (message, type) => context.ui.notify(message, type),
322
+ setStatus: (key, text) => context.ui.setStatus(key, text),
323
+ custom: factory => context.ui.custom((tui, theme, _keybindings, done) => factory(tui, theme, done)),
324
+ setEditorText: text => context.ui.setEditorText(text),
325
+ getEditorText: () => context.ui.getEditorText(),
326
+ editor: (title, prefill, options) => context.ui.editor(title, prefill, options),
327
+ theme: context.ui.theme,
328
+ },
329
+ hasUI: context.hasUI,
330
+ cwd: context.cwd,
331
+ sessionManager: context.sessionManager,
332
+ modelRegistry: context.modelRegistry,
333
+ model: context.model,
334
+ isIdle: () => context.isIdle(),
335
+ abort: () => context.abort(),
336
+ hasQueuedMessages: () => context.hasQueuedMessages(),
337
+ };
338
+ }
339
+
340
+ function toHookCommandContext(context: ExtensionCommandContext): HookCommandContext {
341
+ return {
342
+ ...toHookContext(context),
343
+ waitForIdle: () => context.waitForIdle(),
344
+ newSession: options => context.newSession(options),
345
+ branch: entryId => context.branch(entryId),
346
+ navigateTree: (targetId, options) => context.navigateTree(targetId, options),
347
+ };
348
+ }
349
+
350
+ function createHookExtensionFactory(hook: LoadedHook): ExtensionFactory {
351
+ return (api: ExtensionAPI) => {
352
+ hook.setSendMessageHandler((message, options) => api.sendMessage(message, options));
353
+ hook.setAppendEntryHandler((customType, data) => api.appendEntry(customType, data));
354
+
355
+ for (const [event, handlers] of hook.handlers) {
356
+ for (const handler of handlers) {
357
+ const normalized = hook.normalization;
358
+ const adapted: HandlerFn = async (...args: unknown[]) => {
359
+ const payload = args[0] as { toolName?: string };
360
+ if (
361
+ normalized &&
362
+ event === normalized.runtimeEvent &&
363
+ normalized.toolName !== "*" &&
364
+ payload.toolName !== normalized.toolName
365
+ ) {
366
+ return undefined;
367
+ }
368
+ return await handler(payload, toHookContext(args[1] as ExtensionContext));
369
+ };
370
+ (api.on as (event: string, handler: HandlerFn) => void)(event, adapted);
371
+ }
372
+ }
373
+
374
+ for (const [customType, renderer] of hook.messageRenderers) {
375
+ const adaptedRenderer: MessageRenderer = (message, options, theme) =>
376
+ renderer({ ...message, role: "hookMessage" }, options, theme);
377
+ api.registerMessageRenderer(customType, adaptedRenderer);
378
+ }
379
+ for (const command of hook.commands.values()) {
380
+ api.registerCommand(command.name, {
381
+ description: command.description,
382
+ handler: (args, context) => command.handler(args, toHookCommandContext(context)),
383
+ });
384
+ }
385
+ };
386
+ }
387
+
388
+ /** Load normalized directory hooks and adapt them into the authoritative ExtensionRunner path. */
389
+ export async function discoverAndLoadHookExtensions(
390
+ configuredPaths: string[],
391
+ cwd: string,
392
+ ): Promise<LoadHookExtensionsResult> {
393
+ const loaded = await discoverAndLoadHooks(configuredPaths, cwd);
394
+ return {
395
+ factories: loaded.hooks.map(hook => ({
396
+ factory: createHookExtensionFactory(hook),
397
+ name: `hook:${hook.resolvedPath}`,
398
+ })),
399
+ errors: loaded.errors,
400
+ };
257
401
  }