@gajae-code/coding-agent 0.2.3 → 0.2.5

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 (197) hide show
  1. package/CHANGELOG.md +34 -8600
  2. package/README.md +1 -1
  3. package/dist/types/async/job-manager.d.ts +61 -0
  4. package/dist/types/cli/update-cli.d.ts +3 -0
  5. package/dist/types/config/settings-schema.d.ts +27 -3
  6. package/dist/types/config/settings.d.ts +1 -1
  7. package/dist/types/defaults/gjc-defaults.d.ts +19 -6
  8. package/dist/types/discovery/helpers.d.ts +1 -0
  9. package/dist/types/exec/bash-executor.d.ts +8 -1
  10. package/dist/types/gjc-runtime/restricted-role-agent-bash.d.ts +2 -0
  11. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -1
  12. package/dist/types/modes/components/settings-selector.d.ts +4 -0
  13. package/dist/types/modes/components/skill-hud/render.d.ts +1 -1
  14. package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
  15. package/dist/types/modes/interactive-mode.d.ts +2 -0
  16. package/dist/types/modes/theme/defaults/index.d.ts +45 -9351
  17. package/dist/types/modes/theme/theme.d.ts +6 -5
  18. package/dist/types/modes/types.d.ts +2 -0
  19. package/dist/types/sdk.d.ts +2 -0
  20. package/dist/types/session/streaming-output.d.ts +11 -0
  21. package/dist/types/skill-state/active-state.d.ts +1 -0
  22. package/dist/types/task/types.d.ts +1 -0
  23. package/dist/types/tools/bash-allowed-prefixes.d.ts +5 -0
  24. package/dist/types/tools/bash.d.ts +24 -0
  25. package/dist/types/tools/cron.d.ts +110 -0
  26. package/dist/types/tools/index.d.ts +4 -0
  27. package/dist/types/tools/monitor.d.ts +54 -0
  28. package/dist/types/web/search/index.d.ts +1 -0
  29. package/dist/types/web/search/provider.d.ts +11 -4
  30. package/dist/types/web/search/providers/duckduckgo.d.ts +57 -0
  31. package/dist/types/web/search/types.d.ts +1 -1
  32. package/package.json +7 -7
  33. package/src/async/job-manager.ts +224 -0
  34. package/src/cli/agents-cli.ts +3 -0
  35. package/src/cli/update-cli.ts +67 -16
  36. package/src/config/settings-schema.ts +30 -2
  37. package/src/config/settings.ts +44 -7
  38. package/src/defaults/gjc/skills/deep-interview/SKILL.md +48 -6
  39. package/src/defaults/gjc/skills/deep-interview/auto-answer-uncertain.md +37 -0
  40. package/src/defaults/gjc/skills/deep-interview/auto-research-greenfield.md +42 -0
  41. package/src/defaults/gjc/skills/ralplan/SKILL.md +8 -4
  42. package/src/defaults/gjc/skills/ultragoal/SKILL.md +9 -6
  43. package/src/defaults/gjc-defaults.ts +68 -16
  44. package/src/discovery/helpers.ts +5 -0
  45. package/src/eval/js/shared/rewrite-imports.ts +1 -2
  46. package/src/exec/bash-executor.ts +20 -9
  47. package/src/gjc-runtime/deep-interview-runtime.ts +44 -0
  48. package/src/gjc-runtime/ralplan-runtime.ts +2 -0
  49. package/src/gjc-runtime/restricted-role-agent-bash.ts +5 -0
  50. package/src/gjc-runtime/state-runtime.ts +3 -2
  51. package/src/goals/tools/goal-tool.ts +5 -1
  52. package/src/hooks/skill-state.ts +1 -1
  53. package/src/internal-urls/docs-index.generated.ts +8 -4
  54. package/src/lsp/render.ts +1 -1
  55. package/src/memories/index.ts +5 -4
  56. package/src/modes/acp/acp-agent.ts +1 -1
  57. package/src/modes/acp/acp-client-bridge.ts +1 -1
  58. package/src/modes/components/agent-dashboard.ts +1 -1
  59. package/src/modes/components/diff.ts +2 -2
  60. package/src/modes/components/settings-selector.ts +25 -14
  61. package/src/modes/components/skill-hud/render.ts +7 -2
  62. package/src/modes/controllers/command-controller.ts +1 -1
  63. package/src/modes/controllers/input-controller.ts +10 -2
  64. package/src/modes/controllers/selector-controller.ts +67 -0
  65. package/src/modes/interactive-mode.ts +34 -3
  66. package/src/modes/theme/defaults/blue-crab.json +126 -0
  67. package/src/modes/theme/defaults/index.ts +2 -196
  68. package/src/modes/theme/theme.ts +75 -36
  69. package/src/modes/types.ts +2 -0
  70. package/src/prompts/agents/architect.md +5 -1
  71. package/src/prompts/agents/critic.md +5 -1
  72. package/src/prompts/agents/frontmatter.md +1 -0
  73. package/src/prompts/agents/planner.md +5 -1
  74. package/src/prompts/memories/unavailable.md +9 -0
  75. package/src/prompts/tools/bash.md +9 -0
  76. package/src/prompts/tools/cron.md +25 -0
  77. package/src/prompts/tools/monitor.md +30 -0
  78. package/src/runtime-mcp/oauth-flow.ts +4 -2
  79. package/src/sdk.ts +7 -0
  80. package/src/session/agent-session.ts +16 -5
  81. package/src/session/streaming-output.ts +21 -0
  82. package/src/skill-state/active-state.ts +163 -12
  83. package/src/slash-commands/builtin-registry.ts +11 -1
  84. package/src/task/agents.ts +1 -0
  85. package/src/task/executor.ts +1 -0
  86. package/src/task/types.ts +1 -0
  87. package/src/tools/bash-allowed-prefixes.ts +169 -0
  88. package/src/tools/bash.ts +190 -29
  89. package/src/tools/browser/tab-worker.ts +1 -1
  90. package/src/tools/cron.ts +665 -0
  91. package/src/tools/index.ts +20 -2
  92. package/src/tools/monitor.ts +136 -0
  93. package/src/vim/engine.ts +3 -3
  94. package/src/web/search/index.ts +31 -18
  95. package/src/web/search/provider.ts +57 -12
  96. package/src/web/search/providers/duckduckgo.ts +279 -0
  97. package/src/web/search/types.ts +2 -0
  98. package/src/modes/theme/dark.json +0 -95
  99. package/src/modes/theme/defaults/alabaster.json +0 -93
  100. package/src/modes/theme/defaults/amethyst.json +0 -96
  101. package/src/modes/theme/defaults/anthracite.json +0 -93
  102. package/src/modes/theme/defaults/basalt.json +0 -91
  103. package/src/modes/theme/defaults/birch.json +0 -95
  104. package/src/modes/theme/defaults/dark-abyss.json +0 -91
  105. package/src/modes/theme/defaults/dark-arctic.json +0 -104
  106. package/src/modes/theme/defaults/dark-aurora.json +0 -95
  107. package/src/modes/theme/defaults/dark-catppuccin.json +0 -107
  108. package/src/modes/theme/defaults/dark-cavern.json +0 -91
  109. package/src/modes/theme/defaults/dark-copper.json +0 -95
  110. package/src/modes/theme/defaults/dark-cosmos.json +0 -90
  111. package/src/modes/theme/defaults/dark-cyberpunk.json +0 -102
  112. package/src/modes/theme/defaults/dark-dracula.json +0 -98
  113. package/src/modes/theme/defaults/dark-eclipse.json +0 -91
  114. package/src/modes/theme/defaults/dark-ember.json +0 -95
  115. package/src/modes/theme/defaults/dark-equinox.json +0 -90
  116. package/src/modes/theme/defaults/dark-forest.json +0 -96
  117. package/src/modes/theme/defaults/dark-github.json +0 -105
  118. package/src/modes/theme/defaults/dark-gruvbox.json +0 -112
  119. package/src/modes/theme/defaults/dark-lavender.json +0 -95
  120. package/src/modes/theme/defaults/dark-lunar.json +0 -89
  121. package/src/modes/theme/defaults/dark-midnight.json +0 -95
  122. package/src/modes/theme/defaults/dark-monochrome.json +0 -94
  123. package/src/modes/theme/defaults/dark-monokai.json +0 -98
  124. package/src/modes/theme/defaults/dark-nebula.json +0 -90
  125. package/src/modes/theme/defaults/dark-nord.json +0 -97
  126. package/src/modes/theme/defaults/dark-ocean.json +0 -101
  127. package/src/modes/theme/defaults/dark-one.json +0 -100
  128. package/src/modes/theme/defaults/dark-poimandres.json +0 -141
  129. package/src/modes/theme/defaults/dark-rainforest.json +0 -91
  130. package/src/modes/theme/defaults/dark-reef.json +0 -91
  131. package/src/modes/theme/defaults/dark-retro.json +0 -92
  132. package/src/modes/theme/defaults/dark-rose-pine.json +0 -96
  133. package/src/modes/theme/defaults/dark-sakura.json +0 -95
  134. package/src/modes/theme/defaults/dark-slate.json +0 -95
  135. package/src/modes/theme/defaults/dark-solarized.json +0 -97
  136. package/src/modes/theme/defaults/dark-solstice.json +0 -90
  137. package/src/modes/theme/defaults/dark-starfall.json +0 -91
  138. package/src/modes/theme/defaults/dark-sunset.json +0 -99
  139. package/src/modes/theme/defaults/dark-swamp.json +0 -90
  140. package/src/modes/theme/defaults/dark-synthwave.json +0 -103
  141. package/src/modes/theme/defaults/dark-taiga.json +0 -91
  142. package/src/modes/theme/defaults/dark-terminal.json +0 -95
  143. package/src/modes/theme/defaults/dark-tokyo-night.json +0 -101
  144. package/src/modes/theme/defaults/dark-tundra.json +0 -91
  145. package/src/modes/theme/defaults/dark-twilight.json +0 -91
  146. package/src/modes/theme/defaults/dark-volcanic.json +0 -91
  147. package/src/modes/theme/defaults/graphite.json +0 -92
  148. package/src/modes/theme/defaults/light-arctic.json +0 -107
  149. package/src/modes/theme/defaults/light-aurora-day.json +0 -91
  150. package/src/modes/theme/defaults/light-canyon.json +0 -91
  151. package/src/modes/theme/defaults/light-catppuccin.json +0 -106
  152. package/src/modes/theme/defaults/light-cirrus.json +0 -90
  153. package/src/modes/theme/defaults/light-coral.json +0 -95
  154. package/src/modes/theme/defaults/light-cyberpunk.json +0 -96
  155. package/src/modes/theme/defaults/light-dawn.json +0 -90
  156. package/src/modes/theme/defaults/light-dunes.json +0 -91
  157. package/src/modes/theme/defaults/light-eucalyptus.json +0 -95
  158. package/src/modes/theme/defaults/light-forest.json +0 -100
  159. package/src/modes/theme/defaults/light-frost.json +0 -95
  160. package/src/modes/theme/defaults/light-github.json +0 -115
  161. package/src/modes/theme/defaults/light-glacier.json +0 -91
  162. package/src/modes/theme/defaults/light-gruvbox.json +0 -108
  163. package/src/modes/theme/defaults/light-haze.json +0 -90
  164. package/src/modes/theme/defaults/light-honeycomb.json +0 -95
  165. package/src/modes/theme/defaults/light-lagoon.json +0 -91
  166. package/src/modes/theme/defaults/light-lavender.json +0 -95
  167. package/src/modes/theme/defaults/light-meadow.json +0 -91
  168. package/src/modes/theme/defaults/light-mint.json +0 -95
  169. package/src/modes/theme/defaults/light-monochrome.json +0 -101
  170. package/src/modes/theme/defaults/light-ocean.json +0 -99
  171. package/src/modes/theme/defaults/light-one.json +0 -99
  172. package/src/modes/theme/defaults/light-opal.json +0 -91
  173. package/src/modes/theme/defaults/light-orchard.json +0 -91
  174. package/src/modes/theme/defaults/light-paper.json +0 -95
  175. package/src/modes/theme/defaults/light-poimandres.json +0 -141
  176. package/src/modes/theme/defaults/light-prism.json +0 -90
  177. package/src/modes/theme/defaults/light-retro.json +0 -98
  178. package/src/modes/theme/defaults/light-sand.json +0 -95
  179. package/src/modes/theme/defaults/light-savanna.json +0 -91
  180. package/src/modes/theme/defaults/light-solarized.json +0 -102
  181. package/src/modes/theme/defaults/light-soleil.json +0 -90
  182. package/src/modes/theme/defaults/light-sunset.json +0 -99
  183. package/src/modes/theme/defaults/light-synthwave.json +0 -98
  184. package/src/modes/theme/defaults/light-tokyo-night.json +0 -111
  185. package/src/modes/theme/defaults/light-wetland.json +0 -91
  186. package/src/modes/theme/defaults/light-zenith.json +0 -89
  187. package/src/modes/theme/defaults/limestone.json +0 -94
  188. package/src/modes/theme/defaults/mahogany.json +0 -97
  189. package/src/modes/theme/defaults/marble.json +0 -93
  190. package/src/modes/theme/defaults/obsidian.json +0 -91
  191. package/src/modes/theme/defaults/onyx.json +0 -91
  192. package/src/modes/theme/defaults/pearl.json +0 -93
  193. package/src/modes/theme/defaults/porcelain.json +0 -91
  194. package/src/modes/theme/defaults/quartz.json +0 -96
  195. package/src/modes/theme/defaults/sandstone.json +0 -95
  196. package/src/modes/theme/defaults/titanium.json +0 -90
  197. package/src/modes/theme/light.json +0 -93
@@ -1,201 +1,7 @@
1
- import alabaster from "./alabaster.json" with { type: "json" };
2
- import amethyst from "./amethyst.json" with { type: "json" };
3
- import anthracite from "./anthracite.json" with { type: "json" };
4
- import basalt from "./basalt.json" with { type: "json" };
5
- import birch from "./birch.json" with { type: "json" };
6
- import dark_abyss from "./dark-abyss.json" with { type: "json" };
7
- import dark_arctic from "./dark-arctic.json" with { type: "json" };
8
- import dark_aurora from "./dark-aurora.json" with { type: "json" };
9
- import dark_catppuccin from "./dark-catppuccin.json" with { type: "json" };
10
- import dark_cavern from "./dark-cavern.json" with { type: "json" };
11
- import dark_copper from "./dark-copper.json" with { type: "json" };
12
- import dark_cosmos from "./dark-cosmos.json" with { type: "json" };
13
- import dark_cyberpunk from "./dark-cyberpunk.json" with { type: "json" };
14
- import dark_dracula from "./dark-dracula.json" with { type: "json" };
15
- import dark_eclipse from "./dark-eclipse.json" with { type: "json" };
16
- import dark_ember from "./dark-ember.json" with { type: "json" };
17
- import dark_equinox from "./dark-equinox.json" with { type: "json" };
18
- import dark_forest from "./dark-forest.json" with { type: "json" };
19
- import dark_github from "./dark-github.json" with { type: "json" };
20
- import dark_gruvbox from "./dark-gruvbox.json" with { type: "json" };
21
- import dark_lavender from "./dark-lavender.json" with { type: "json" };
22
- import dark_lunar from "./dark-lunar.json" with { type: "json" };
23
- import dark_midnight from "./dark-midnight.json" with { type: "json" };
24
- import dark_monochrome from "./dark-monochrome.json" with { type: "json" };
25
- import dark_monokai from "./dark-monokai.json" with { type: "json" };
26
- import dark_nebula from "./dark-nebula.json" with { type: "json" };
27
- import dark_nord from "./dark-nord.json" with { type: "json" };
28
- import dark_ocean from "./dark-ocean.json" with { type: "json" };
29
- import dark_one from "./dark-one.json" with { type: "json" };
30
- import dark_poimandres from "./dark-poimandres.json" with { type: "json" };
31
- import dark_rainforest from "./dark-rainforest.json" with { type: "json" };
32
- import dark_reef from "./dark-reef.json" with { type: "json" };
33
- import dark_retro from "./dark-retro.json" with { type: "json" };
34
- import dark_rose_pine from "./dark-rose-pine.json" with { type: "json" };
35
- import dark_sakura from "./dark-sakura.json" with { type: "json" };
36
- import dark_slate from "./dark-slate.json" with { type: "json" };
37
- import dark_solarized from "./dark-solarized.json" with { type: "json" };
38
- import dark_solstice from "./dark-solstice.json" with { type: "json" };
39
- import dark_starfall from "./dark-starfall.json" with { type: "json" };
40
- import dark_sunset from "./dark-sunset.json" with { type: "json" };
41
- import dark_swamp from "./dark-swamp.json" with { type: "json" };
42
- import dark_synthwave from "./dark-synthwave.json" with { type: "json" };
43
- import dark_taiga from "./dark-taiga.json" with { type: "json" };
44
- import dark_terminal from "./dark-terminal.json" with { type: "json" };
45
- import dark_tokyo_night from "./dark-tokyo-night.json" with { type: "json" };
46
- import dark_tundra from "./dark-tundra.json" with { type: "json" };
47
- import dark_twilight from "./dark-twilight.json" with { type: "json" };
48
- import dark_volcanic from "./dark-volcanic.json" with { type: "json" };
49
- import graphite from "./graphite.json" with { type: "json" };
50
- import light_arctic from "./light-arctic.json" with { type: "json" };
51
- import light_aurora_day from "./light-aurora-day.json" with { type: "json" };
52
- import light_canyon from "./light-canyon.json" with { type: "json" };
53
- import light_catppuccin from "./light-catppuccin.json" with { type: "json" };
54
- import light_cirrus from "./light-cirrus.json" with { type: "json" };
55
- import light_coral from "./light-coral.json" with { type: "json" };
56
- import light_cyberpunk from "./light-cyberpunk.json" with { type: "json" };
57
- import light_dawn from "./light-dawn.json" with { type: "json" };
58
- import light_dunes from "./light-dunes.json" with { type: "json" };
59
- import light_eucalyptus from "./light-eucalyptus.json" with { type: "json" };
60
- import light_forest from "./light-forest.json" with { type: "json" };
61
- import light_frost from "./light-frost.json" with { type: "json" };
62
- import light_github from "./light-github.json" with { type: "json" };
63
- import light_glacier from "./light-glacier.json" with { type: "json" };
64
- import light_gruvbox from "./light-gruvbox.json" with { type: "json" };
65
- import light_haze from "./light-haze.json" with { type: "json" };
66
- import light_honeycomb from "./light-honeycomb.json" with { type: "json" };
67
- import light_lagoon from "./light-lagoon.json" with { type: "json" };
68
- import light_lavender from "./light-lavender.json" with { type: "json" };
69
- import light_meadow from "./light-meadow.json" with { type: "json" };
70
- import light_mint from "./light-mint.json" with { type: "json" };
71
- import light_monochrome from "./light-monochrome.json" with { type: "json" };
72
- import light_ocean from "./light-ocean.json" with { type: "json" };
73
- import light_one from "./light-one.json" with { type: "json" };
74
- import light_opal from "./light-opal.json" with { type: "json" };
75
- import light_orchard from "./light-orchard.json" with { type: "json" };
76
- import light_paper from "./light-paper.json" with { type: "json" };
77
- import light_poimandres from "./light-poimandres.json" with { type: "json" };
78
- import light_prism from "./light-prism.json" with { type: "json" };
79
- import light_retro from "./light-retro.json" with { type: "json" };
80
- import light_sand from "./light-sand.json" with { type: "json" };
81
- import light_savanna from "./light-savanna.json" with { type: "json" };
82
- import light_solarized from "./light-solarized.json" with { type: "json" };
83
- import light_soleil from "./light-soleil.json" with { type: "json" };
84
- import light_sunset from "./light-sunset.json" with { type: "json" };
85
- import light_synthwave from "./light-synthwave.json" with { type: "json" };
86
- import light_tokyo_night from "./light-tokyo-night.json" with { type: "json" };
87
- import light_wetland from "./light-wetland.json" with { type: "json" };
88
- import light_zenith from "./light-zenith.json" with { type: "json" };
89
- import limestone from "./limestone.json" with { type: "json" };
90
- import mahogany from "./mahogany.json" with { type: "json" };
91
- import marble from "./marble.json" with { type: "json" };
92
- import obsidian from "./obsidian.json" with { type: "json" };
93
- import onyx from "./onyx.json" with { type: "json" };
94
- import pearl from "./pearl.json" with { type: "json" };
95
- import porcelain from "./porcelain.json" with { type: "json" };
96
- import quartz from "./quartz.json" with { type: "json" };
1
+ import blue_crab from "./blue-crab.json" with { type: "json" };
97
2
  import red_claw from "./red-claw.json" with { type: "json" };
98
- import sandstone from "./sandstone.json" with { type: "json" };
99
- import titanium from "./titanium.json" with { type: "json" };
100
3
 
101
4
  export const defaultThemes = {
102
- alabaster: alabaster,
103
- amethyst: amethyst,
104
- anthracite: anthracite,
105
- basalt: basalt,
106
- birch: birch,
107
- "dark-abyss": dark_abyss,
108
- "dark-arctic": dark_arctic,
109
- "dark-aurora": dark_aurora,
110
- "dark-catppuccin": dark_catppuccin,
111
- "dark-cavern": dark_cavern,
112
- "dark-copper": dark_copper,
113
- "dark-cosmos": dark_cosmos,
114
- "dark-cyberpunk": dark_cyberpunk,
115
- "dark-dracula": dark_dracula,
116
- "dark-eclipse": dark_eclipse,
117
- "dark-ember": dark_ember,
118
- "dark-equinox": dark_equinox,
119
- "dark-forest": dark_forest,
120
- "dark-github": dark_github,
121
- "dark-gruvbox": dark_gruvbox,
122
- "dark-lavender": dark_lavender,
123
- "dark-lunar": dark_lunar,
124
- "dark-midnight": dark_midnight,
125
- "dark-monochrome": dark_monochrome,
126
- "dark-monokai": dark_monokai,
127
- "dark-nebula": dark_nebula,
128
- "dark-nord": dark_nord,
129
- "dark-ocean": dark_ocean,
130
- "dark-one": dark_one,
131
- "dark-poimandres": dark_poimandres,
132
- "dark-rainforest": dark_rainforest,
133
- "dark-reef": dark_reef,
134
- "dark-retro": dark_retro,
135
- "dark-rose-pine": dark_rose_pine,
136
- "dark-sakura": dark_sakura,
137
- "dark-slate": dark_slate,
138
- "dark-solarized": dark_solarized,
139
- "dark-solstice": dark_solstice,
140
- "dark-starfall": dark_starfall,
141
- "dark-sunset": dark_sunset,
142
- "dark-swamp": dark_swamp,
143
- "dark-synthwave": dark_synthwave,
144
- "dark-taiga": dark_taiga,
145
- "dark-terminal": dark_terminal,
146
- "dark-tokyo-night": dark_tokyo_night,
147
- "dark-tundra": dark_tundra,
148
- "dark-twilight": dark_twilight,
149
- "dark-volcanic": dark_volcanic,
150
- graphite: graphite,
151
- "light-arctic": light_arctic,
152
- "light-aurora-day": light_aurora_day,
153
- "light-canyon": light_canyon,
154
- "light-catppuccin": light_catppuccin,
155
- "light-cirrus": light_cirrus,
156
- "light-coral": light_coral,
157
- "light-cyberpunk": light_cyberpunk,
158
- "light-dawn": light_dawn,
159
- "light-dunes": light_dunes,
160
- "light-eucalyptus": light_eucalyptus,
161
- "light-forest": light_forest,
162
- "light-frost": light_frost,
163
- "light-github": light_github,
164
- "light-glacier": light_glacier,
165
- "light-gruvbox": light_gruvbox,
166
- "light-haze": light_haze,
167
- "light-honeycomb": light_honeycomb,
168
- "light-lagoon": light_lagoon,
169
- "light-lavender": light_lavender,
170
- "light-meadow": light_meadow,
171
- "light-mint": light_mint,
172
- "light-monochrome": light_monochrome,
173
- "light-ocean": light_ocean,
174
- "light-one": light_one,
175
- "light-opal": light_opal,
176
- "light-orchard": light_orchard,
177
- "light-paper": light_paper,
178
- "light-poimandres": light_poimandres,
179
- "light-prism": light_prism,
180
- "light-retro": light_retro,
181
- "light-sand": light_sand,
182
- "light-savanna": light_savanna,
183
- "light-solarized": light_solarized,
184
- "light-soleil": light_soleil,
185
- "light-sunset": light_sunset,
186
- "light-synthwave": light_synthwave,
187
- "light-tokyo-night": light_tokyo_night,
188
- "light-wetland": light_wetland,
189
- "light-zenith": light_zenith,
190
- limestone: limestone,
191
- mahogany: mahogany,
192
- marble: marble,
193
- obsidian: obsidian,
194
- onyx: onyx,
195
- pearl: pearl,
196
- porcelain: porcelain,
197
- quartz: quartz,
5
+ "blue-crab": blue_crab,
198
6
  "red-claw": red_claw,
199
- sandstone: sandstone,
200
- titanium: titanium,
201
7
  };
@@ -14,9 +14,7 @@ import { adjustHsv, getCustomThemesDir, isEnoent, logger } from "@gajae-code/uti
14
14
  import chalk from "chalk";
15
15
  import * as z from "zod/v4";
16
16
  // Embed theme JSON files at build time
17
- import darkThemeJson from "./dark.json" with { type: "json" };
18
17
  import { defaultThemes } from "./defaults";
19
- import lightThemeJson from "./light.json" with { type: "json" };
20
18
  import { resolveMermaidAscii } from "./mermaid-cache";
21
19
 
22
20
  export { getLanguageFromPath } from "../../utils/lang-from-path";
@@ -1547,8 +1545,6 @@ export class Theme {
1547
1545
  // ============================================================================
1548
1546
 
1549
1547
  const BUILTIN_THEMES: Record<string, ThemeJson> = {
1550
- dark: darkThemeJson as ThemeJson,
1551
- light: lightThemeJson as ThemeJson,
1552
1548
  ...(defaultThemes as Record<string, ThemeJson>),
1553
1549
  };
1554
1550
 
@@ -1646,7 +1642,7 @@ async function loadThemeJson(name: string): Promise<ThemeJson> {
1646
1642
  errorMessage += `\nMissing required color tokens:\n`;
1647
1643
  errorMessage += missingColors.map(c => ` - ${c}`).join("\n");
1648
1644
  errorMessage += `\n\nPlease add these colors to your theme's "colors" object.`;
1649
- errorMessage += `\nSee the built-in themes (dark.json, light.json) for reference values.`;
1645
+ errorMessage += `\nSee the built-in themes (red-claw.json, blue-crab.json) for reference values.`;
1650
1646
  }
1651
1647
  if (otherErrors.length > 0) {
1652
1648
  errorMessage += `\n\nOther errors:\n${otherErrors.join("\n")}`;
@@ -1758,6 +1754,10 @@ function getDefaultTheme(): string {
1758
1754
  return bg === "light" ? autoLightTheme : autoDarkTheme;
1759
1755
  }
1760
1756
 
1757
+ export function getDetectedThemeSettingsPath(): "theme.dark" | "theme.light" {
1758
+ return detectTerminalBackground() === "light" ? "theme.light" : "theme.dark";
1759
+ }
1760
+
1761
1761
  // ============================================================================
1762
1762
  // Global Theme Instance
1763
1763
  // ============================================================================
@@ -1776,9 +1776,10 @@ var themeReloadTimer: NodeJS.Timeout | undefined;
1776
1776
  var sigwinchHandler: (() => void) | undefined;
1777
1777
  var autoDetectedTheme: boolean = false;
1778
1778
  var autoDarkTheme: string = "red-claw";
1779
- var autoLightTheme: string = "light";
1779
+ var autoLightTheme: string = "blue-crab";
1780
1780
  var onThemeChangeCallback: (() => void) | undefined;
1781
1781
  var themeLoadRequestId: number = 0;
1782
+ var previewThemeActive: boolean = false;
1782
1783
 
1783
1784
  function getCurrentThemeOptions(): CreateThemeOptions {
1784
1785
  return {
@@ -1796,8 +1797,9 @@ export async function initTheme(
1796
1797
  ): Promise<void> {
1797
1798
  autoDetectedTheme = true;
1798
1799
  autoDarkTheme = darkTheme ?? "red-claw";
1799
- autoLightTheme = lightTheme ?? "light";
1800
+ autoLightTheme = lightTheme ?? "blue-crab";
1800
1801
  const name = getDefaultTheme();
1802
+ previewThemeActive = false;
1801
1803
  currentThemeName = name;
1802
1804
  currentSymbolPresetOverride = symbolPreset;
1803
1805
  currentColorBlindMode = colorBlindMode ?? false;
@@ -1808,9 +1810,9 @@ export async function initTheme(
1808
1810
  startSigwinchListener();
1809
1811
  }
1810
1812
  } catch (err) {
1811
- logger.debug("Theme loading failed, falling back to dark theme", { error: String(err) });
1812
- currentThemeName = "dark";
1813
- theme = await loadTheme("dark", getCurrentThemeOptions());
1813
+ logger.debug("Theme loading failed, falling back to red-claw theme", { error: String(err) });
1814
+ currentThemeName = "red-claw";
1815
+ theme = await loadTheme("red-claw", getCurrentThemeOptions());
1814
1816
  // Don't start watcher for fallback theme
1815
1817
  }
1816
1818
  }
@@ -1820,6 +1822,7 @@ export async function setTheme(
1820
1822
  enableWatcher: boolean = false,
1821
1823
  ): Promise<{ success: boolean; error?: string }> {
1822
1824
  autoDetectedTheme = false;
1825
+ previewThemeActive = false;
1823
1826
  currentThemeName = name;
1824
1827
  const requestId = ++themeLoadRequestId;
1825
1828
  try {
@@ -1839,9 +1842,9 @@ export async function setTheme(
1839
1842
  if (requestId !== themeLoadRequestId) {
1840
1843
  return { success: false, error: "Theme change superseded by a newer request" };
1841
1844
  }
1842
- // Theme is invalid - fall back to dark theme
1843
- currentThemeName = "dark";
1844
- theme = await loadTheme("dark", getCurrentThemeOptions());
1845
+ // Theme is invalid - fall back to red-claw theme
1846
+ currentThemeName = "red-claw";
1847
+ theme = await loadTheme("red-claw", getCurrentThemeOptions());
1845
1848
  // Don't start watcher for fallback theme
1846
1849
  return {
1847
1850
  success: false,
@@ -1858,6 +1861,7 @@ export async function previewTheme(name: string): Promise<{ success: boolean; er
1858
1861
  return { success: false, error: "Theme preview superseded by a newer request" };
1859
1862
  }
1860
1863
  theme = loadedTheme;
1864
+ previewThemeActive = true;
1861
1865
  if (onThemeChangeCallback) {
1862
1866
  onThemeChangeCallback();
1863
1867
  }
@@ -1873,6 +1877,32 @@ export async function previewTheme(name: string): Promise<{ success: boolean; er
1873
1877
  }
1874
1878
  }
1875
1879
 
1880
+ export async function restoreThemePreview(name: string): Promise<{ success: boolean; error?: string }> {
1881
+ const resolvedName = autoDetectedTheme ? getDefaultTheme() : name;
1882
+ const requestId = ++themeLoadRequestId;
1883
+ try {
1884
+ const loadedTheme = await loadTheme(resolvedName, getCurrentThemeOptions());
1885
+ if (requestId !== themeLoadRequestId) {
1886
+ return { success: false, error: "Theme preview restore superseded by a newer request" };
1887
+ }
1888
+ theme = loadedTheme;
1889
+ currentThemeName = resolvedName;
1890
+ previewThemeActive = false;
1891
+ if (onThemeChangeCallback) {
1892
+ onThemeChangeCallback();
1893
+ }
1894
+ return { success: true };
1895
+ } catch (error) {
1896
+ if (requestId !== themeLoadRequestId) {
1897
+ return { success: false, error: "Theme preview restore superseded by a newer request" };
1898
+ }
1899
+ return {
1900
+ success: false,
1901
+ error: error instanceof Error ? error.message : String(error),
1902
+ };
1903
+ }
1904
+ }
1905
+
1876
1906
  /**
1877
1907
  * Enable auto-detection mode, switching to the appropriate dark/light theme.
1878
1908
  */
@@ -1904,6 +1934,7 @@ export function onTerminalAppearanceChange(mode: "dark" | "light"): void {
1904
1934
 
1905
1935
  export function setThemeInstance(themeInstance: Theme): void {
1906
1936
  autoDetectedTheme = false;
1937
+ previewThemeActive = false;
1907
1938
  theme = themeInstance;
1908
1939
  currentThemeName = "<in-memory>";
1909
1940
  stopThemeWatcher();
@@ -1921,8 +1952,8 @@ export async function setSymbolPreset(preset: SymbolPreset): Promise<void> {
1921
1952
  try {
1922
1953
  theme = await loadTheme(currentThemeName, getCurrentThemeOptions());
1923
1954
  } catch {
1924
- // Fall back to dark theme with new preset
1925
- theme = await loadTheme("dark", getCurrentThemeOptions());
1955
+ // Fall back to red-claw theme with new preset
1956
+ theme = await loadTheme("red-claw", getCurrentThemeOptions());
1926
1957
  }
1927
1958
  if (onThemeChangeCallback) {
1928
1959
  onThemeChangeCallback();
@@ -1947,8 +1978,8 @@ export async function setColorBlindMode(enabled: boolean): Promise<void> {
1947
1978
  try {
1948
1979
  theme = await loadTheme(currentThemeName, getCurrentThemeOptions());
1949
1980
  } catch {
1950
- // Fall back to dark theme
1951
- theme = await loadTheme("dark", getCurrentThemeOptions());
1981
+ // Fall back to red-claw theme
1982
+ theme = await loadTheme("red-claw", getCurrentThemeOptions());
1952
1983
  }
1953
1984
  if (onThemeChangeCallback) {
1954
1985
  onThemeChangeCallback();
@@ -1984,8 +2015,8 @@ export function isValidSymbolPreset(preset: string): preset is SymbolPreset {
1984
2015
  async function startThemeWatcher(): Promise<void> {
1985
2016
  stopThemeWatcher();
1986
2017
 
1987
- // Only watch if it's a custom theme (not built-in)
1988
- if (!currentThemeName || currentThemeName === "dark" || currentThemeName === "light") {
2018
+ // Only watch custom themes (not built-ins)
2019
+ if (!currentThemeName || currentThemeName in getBuiltinThemes()) {
1989
2020
  return;
1990
2021
  }
1991
2022
 
@@ -2056,16 +2087,20 @@ async function startThemeWatcher(): Promise<void> {
2056
2087
  function reevaluateAutoTheme(debugLabel: string): void {
2057
2088
  if (!autoDetectedTheme) return;
2058
2089
  const resolved = getDefaultTheme();
2059
- if (resolved === currentThemeName) return;
2090
+ const requestId = ++themeLoadRequestId;
2091
+ if (resolved === currentThemeName && !previewThemeActive) return;
2060
2092
  currentThemeName = resolved;
2061
2093
  loadTheme(resolved, getCurrentThemeOptions())
2062
2094
  .then(loadedTheme => {
2095
+ if (requestId !== themeLoadRequestId) return;
2063
2096
  theme = loadedTheme;
2097
+ previewThemeActive = false;
2064
2098
  if (onThemeChangeCallback) {
2065
2099
  onThemeChangeCallback();
2066
2100
  }
2067
2101
  })
2068
2102
  .catch(err => {
2103
+ if (requestId !== themeLoadRequestId) return;
2069
2104
  logger.debug(`Theme switch on ${debugLabel} failed`, { error: String(err) });
2070
2105
  });
2071
2106
  }
@@ -2191,8 +2226,8 @@ function ansi256ToHex(index: number): string {
2191
2226
  */
2192
2227
  export async function getResolvedThemeColors(themeName?: string): Promise<Record<string, string>> {
2193
2228
  const name = themeName ?? getDefaultTheme();
2194
- const isLight = name === "light";
2195
2229
  const themeJson = await loadThemeJson(name);
2230
+ const isLight = isThemeJsonLight(themeJson);
2196
2231
  const resolved = resolveThemeColors(themeJson.colors, themeJson.vars);
2197
2232
 
2198
2233
  // Default text color for empty values (terminal uses default fg color)
@@ -2216,21 +2251,7 @@ export async function getResolvedThemeColors(themeName?: string): Promise<Record
2216
2251
  * Check if a theme is a "light" theme by analyzing its background color luminance.
2217
2252
  * Loads theme JSON synchronously (built-in or custom file) and resolves userMessageBg.
2218
2253
  */
2219
- export function isLightTheme(themeName?: string): boolean {
2220
- const name = themeName ?? "dark";
2221
- const builtinThemes = getBuiltinThemes();
2222
- let themeJson: ThemeJson | undefined;
2223
- if (name in builtinThemes) {
2224
- themeJson = builtinThemes[name];
2225
- } else {
2226
- try {
2227
- const customPath = path.join(getCustomThemesDir(), `${name}.json`);
2228
- const content = fs.readFileSync(customPath, "utf-8");
2229
- themeJson = JSON.parse(content) as ThemeJson;
2230
- } catch {
2231
- return false;
2232
- }
2233
- }
2254
+ function isThemeJsonLight(themeJson: ThemeJson): boolean {
2234
2255
  try {
2235
2256
  const resolved = resolveVarRefs(themeJson.colors.userMessageBg, themeJson.vars ?? {});
2236
2257
  if (typeof resolved !== "string" || !resolved.startsWith("#") || resolved.length !== 7) return false;
@@ -2245,6 +2266,24 @@ export function isLightTheme(themeName?: string): boolean {
2245
2266
  }
2246
2267
  }
2247
2268
 
2269
+ export function isLightTheme(themeName?: string, agentDir?: string): boolean {
2270
+ const name = themeName ?? "red-claw";
2271
+ const builtinThemes = getBuiltinThemes();
2272
+ let themeJson: ThemeJson | undefined;
2273
+ if (name in builtinThemes) {
2274
+ themeJson = builtinThemes[name];
2275
+ } else {
2276
+ try {
2277
+ const customPath = path.join(getCustomThemesDir(agentDir), `${name}.json`);
2278
+ const content = fs.readFileSync(customPath, "utf-8");
2279
+ themeJson = JSON.parse(content) as ThemeJson;
2280
+ } catch {
2281
+ return false;
2282
+ }
2283
+ }
2284
+ return isThemeJsonLight(themeJson);
2285
+ }
2286
+
2248
2287
  /**
2249
2288
  * Get explicit export colors from theme JSON, if specified.
2250
2289
  * Returns undefined for each color that isn't explicitly set.
@@ -86,6 +86,7 @@ export interface InteractiveModeContext {
86
86
  isInitialized: boolean;
87
87
  isBackgrounded: boolean;
88
88
  isBashMode: boolean;
89
+ isBashNoContext: boolean;
89
90
  toolOutputExpanded: boolean;
90
91
  todoExpanded: boolean;
91
92
  planModeEnabled: boolean;
@@ -231,6 +232,7 @@ export interface InteractiveModeContext {
231
232
 
232
233
  // Selector handling
233
234
  showSettingsSelector(): void;
235
+ showThemeSelector(): void;
234
236
  showHistorySearch(): void;
235
237
  showExtensionsDashboard(): void;
236
238
  showAgentsDashboard(): void;
@@ -1,10 +1,13 @@
1
1
  ---
2
2
  name: architect
3
3
  description: Read-only architecture and code-review agent with severity-rated findings and status verdicts
4
- tools: read, search, find, lsp, ast_grep, web_search, report_finding
4
+ tools: read, search, find, lsp, ast_grep, web_search, bash, report_finding
5
5
  thinking-level: high
6
6
  blocking: true
7
7
  forkContext: allowed
8
+ bashAllowedPrefixes:
9
+ - gjc ralplan --write
10
+ - gjc state
8
11
  ---
9
12
  <identity>
10
13
  You are Architect. You combine system architecture review with code-review discipline. Diagnose, analyze, and recommend with file-backed evidence. You are read-only.
@@ -22,6 +25,7 @@ You may receive a forked parent-conversation snapshot as background. Your read-o
22
25
 
23
26
  <constraints>
24
27
  - Read-only: never write, edit, format, commit, push, or mutate files.
28
+ - Exception: you may use the restricted `bash` tool only for sanctioned GJC workflow CLI persistence (`gjc ralplan --write ...`) and GJC workflow state read/write/contract commands (`gjc state ...`). For `gjc ralplan --write`, pass the verdict markdown inline in `--artifact`, not as a file path. Do not use bash for product-source writes, direct handoffs, state clears, or general shell work.
25
29
  - Never approve code or plans you have not grounded in inspected files.
26
30
  - Never give generic advice detached from this codebase.
27
31
  - Never approve CRITICAL or HIGH severity issues.
@@ -1,8 +1,11 @@
1
1
  ---
2
2
  name: critic
3
3
  description: Read-only plan critic that approves only actionable, verifiable execution plans
4
- tools: read, search, find, lsp, ast_grep, web_search
4
+ tools: read, search, find, lsp, ast_grep, web_search, bash
5
5
  thinking-level: high
6
+ bashAllowedPrefixes:
7
+ - gjc ralplan --write
8
+ - gjc state
6
9
  ---
7
10
  <identity>
8
11
  You are Critic. Decide whether a work plan is actionable before execution begins.
@@ -14,6 +17,7 @@ Review plan clarity, completeness, verification, big-picture fit, referenced fil
14
17
 
15
18
  <constraints>
16
19
  - Read-only: do not write, edit, format, commit, push, or mutate files.
20
+ - Exception: you may use the restricted `bash` tool only for sanctioned GJC workflow CLI persistence (`gjc ralplan --write ...`) and GJC workflow state read/write/contract commands (`gjc state ...`). For `gjc ralplan --write`, pass the evaluation markdown inline in `--artifact`, not as a file path. Do not use bash for product-source writes, direct handoffs, state clears, or general shell work.
17
21
  - A lone file path is valid input; read and evaluate it.
18
22
  - Reject YAML-only plans as invalid plan format when a human-readable plan is required.
19
23
  - Do not invent problems; report no issues found when the plan passes.
@@ -9,5 +9,6 @@ description: {{jsonStringify description}}
9
9
  {{/if}}{{#if hide}}hide: true
10
10
  {{/if}}{{#if autoloadSkills}}autoloadSkills: {{jsonStringify autoloadSkills}}
11
11
  {{/if}}{{#if forkContext}}forkContext: {{jsonStringify forkContext}}
12
+ {{/if}}{{#if bashAllowedPrefixes}}bashAllowedPrefixes: {{jsonStringify bashAllowedPrefixes}}
12
13
  {{/if}}---
13
14
  {{body}}
@@ -1,8 +1,11 @@
1
1
  ---
2
2
  name: planner
3
3
  description: Read-only planning agent for sequencing, acceptance criteria, risks, and handoff shape
4
- tools: read, search, find, lsp, ast_grep, web_search
4
+ tools: read, search, find, lsp, ast_grep, web_search, bash
5
5
  thinking-level: medium
6
+ bashAllowedPrefixes:
7
+ - gjc ralplan --write
8
+ - gjc state
6
9
  ---
7
10
  <identity>
8
11
  You are Planner. Turn requests into actionable work plans. You plan; you do not implement.
@@ -14,6 +17,7 @@ Leave execution with a right-sized, evidence-grounded plan: scope, steps, accept
14
17
 
15
18
  <constraints>
16
19
  - Read-only: never write, edit, format, commit, push, or mutate files.
20
+ - Exception: you may use the restricted `bash` tool only for sanctioned GJC workflow CLI persistence (`gjc ralplan --write ...`) and GJC workflow state read/write/contract commands (`gjc state ...`). For `gjc ralplan --write`, pass the plan markdown inline in `--artifact`, not as a file path. Do not use bash for product-source writes, direct handoffs, state clears, or general shell work.
17
21
  - Inspect the repository before asking about code facts.
18
22
  - Ask only about priorities, tradeoffs, scope decisions, timelines, or preferences that repository inspection cannot resolve.
19
23
  - Right-size the step count to the task; do not default to a fixed number of steps.
@@ -0,0 +1,9 @@
1
+ # Memory Guidance
2
+ Memory root: memory://root
3
+ Status: local memory is enabled, but no confirmed memory payload is available for this project yet.
4
+
5
+ Operational rules:
6
+ 1) Do not claim that a user preference, fact, or instruction has been saved, remembered, or persisted unless a backend operation or a non-empty memory payload confirms it.
7
+ 2) If the user asks you to save or remember something now, explain that durable memory is not confirmed because local memory has no available payload/readback yet. You may use the instruction for the current session only.
8
+ 3) If reading `memory://root` or `memory://root/memory_summary.md` fails, treat that as no confirmed memory, not as successful persistence.
9
+ 4) The local backend consolidates prior session rollouts asynchronously; an empty payload is a degraded/unconfirmed state, not a successful save.
@@ -11,6 +11,15 @@ Executes bash command in shell session for terminal operations like git, bun, ca
11
11
  - Use `async: true` for long-running commands when you don't need immediate output; the call returns a background job ID and the result is delivered automatically as a follow-up.
12
12
  {{/if}}
13
13
  </instruction>
14
+ {{#if restrictedAllowedPrefixes}}
15
+ <restricted-role-agent-mode>
16
+ This session's bash tool is restricted. It only accepts commands beginning with:
17
+ {{#each restrictedAllowedPrefixes}}
18
+ - `{{this}}`
19
+ {{/each}}
20
+ Use it only for sanctioned GJC workflow CLI persistence or state read/write/contract operations; per-command env overrides and all other shell command shapes are blocked before execution.
21
+ </restricted-role-agent-mode>
22
+ {{/if}}
14
23
 
15
24
  <critical>
16
25
  - NEVER use Linux coreutils (`cat`, `head`, `tail`, `less`, `more`, `ls`, `grep`, `rg`, `awk`, `sed`, `find`, `fd`, etc.) when a dedicated tool suffices — ALWAYS prefer `read`, `search`, `find`, `edit`, `write`.
@@ -0,0 +1,25 @@
1
+ Schedule a prompt to fire on a recurring cron schedule, or one-shot at the next match. Cron tasks let you re-run a prompt automatically on an interval — poll a deployment, babysit a PR, check back on a long-running build, or remind yourself to do something later in the session.
2
+
3
+ `CronCreate` accepts a standard 5-field cron expression in your local timezone, the prompt to run, and whether the job recurs or fires once. It returns an 8-character job id you can pass to `CronDelete`. Each session can hold up to 50 scheduled tasks. Recurring tasks auto-expire 7 days after creation; one-shot tasks self-delete after firing.
4
+
5
+ `CronList` enumerates every scheduled task in the session. `CronDelete` cancels a task by id.
6
+
7
+ ## Cron expressions
8
+
9
+ `CronCreate` accepts 5-field cron: `minute hour day-of-month month day-of-week`. All fields support `*`, single values (`5`), steps (`*/15`), ranges (`1-5`), and comma lists (`1,15,30`). Day-of-week uses `0`/`7` for Sunday through `6` for Saturday. Extended syntax like `L`, `W`, `?`, or month/weekday names is not supported.
10
+
11
+ | Example | Meaning |
12
+ | :------------ | :--------------------------- |
13
+ | `*/5 * * * *` | Every 5 minutes |
14
+ | `0 * * * *` | Every hour on the hour |
15
+ | `0 9 * * *` | Every day at 9am local |
16
+ | `0 9 * * 1-5` | Weekdays at 9am local |
17
+
18
+ ## Lifecycle
19
+
20
+ - Tasks fire between turns, never mid-response.
21
+ - All times are interpreted in the local timezone.
22
+ - Recurring tasks fire with up to 30 minutes of deterministic jitter (or up to half their interval for sub-hourly tasks). One-shot tasks scheduled for `:00` or `:30` may fire up to 90 s early. Pick an off-minute if exact timing matters.
23
+ - Closing or replacing the session clears every scheduled task.
24
+
25
+ Disable the scheduler entirely via `CLAUDE_CODE_DISABLE_CRON=1`.
@@ -0,0 +1,30 @@
1
+ Start a background monitor that streams events from a long-running script. Each stdout line is an event — you keep working and notifications arrive in the chat. Events arrive on their own schedule and are not replies from the user, even if one lands while you're waiting for the user to answer a question.
2
+
3
+ Pick by how many notifications you need:
4
+ - **One** ("tell me when the server is ready / the build finishes") → use `bash` with `async: true`. That returns a single completion notification when the command exits.
5
+ - **Many ongoing events** (logs, polling, file watching) → use `monitor`. The script keeps running and every new line of stdout becomes one event delivered into the conversation between turns.
6
+
7
+ `monitor` uses the same permission rules as `bash`. To stop a monitor, cancel its background task via `job` with the returned `task_id`, or end the session.
8
+
9
+ ## When to reach for `monitor`
10
+
11
+ - Tail a log file and flag errors as they appear (`tail -F server.log | grep -i error`).
12
+ - Poll a PR or CI job and report when its status changes.
13
+ - Watch a directory for file changes (`fswatch -r dist/`).
14
+ - Track output from any long-running script you point it at.
15
+
16
+ ## Inputs
17
+
18
+ - `command` (required): shell command to run as a background monitor. Each stdout line is delivered as a separate task-notification event.
19
+ - `kind` (required): one of `"log"`, `"poll"`, `"watch"`, `"other"`. Describes the monitoring strategy so listings can surface useful categories.
20
+ - `description` (required): short human-readable description of what is being monitored. Appears in task listings.
21
+ - `timeout` (optional): maximum wall-clock seconds the monitor may run before automatic shutdown. Omit for the session lifetime.
22
+ - `persistent` (optional, default `false`): keep the monitor running past the current turn. Persistent monitors survive until session end or until cancelled via `job`.
23
+
24
+ ## Output
25
+
26
+ Returns `Monitor started · task <task_id>` plus a task entry visible via `job({op:"list"})`. Each stdout line of the monitored command becomes a `<task-notification>` event delivered between turns.
27
+
28
+ ## Cancellation
29
+
30
+ There is no separate `monitor` kill tool. Cancel a running monitor with `job` using the returned `task_id`. Disposing the session also cancels every monitor the calling agent started.